2012. 2. 23. 01:29
윈도우즈에는 장치 관리자라는 것이 있다.
여기서 실시간으로 어떤 장치가 있는지 알 수 있다.

Mac 에도 비슷한 것이 있다.
Application으로는 System Profiler이고
명령어로는 system_profiler이다.

예를 들어 usb에 물린 장치를 확인하고 싶을 땐

system_profiler SPUSBDataType 라고 치면
현재 연결된 모든 디바이스의 정보를 볼 수 있다.

예를 들어 이런식으로 보이게 된다.

        Hub:

          Product ID: 0x2514
          Vendor ID: 0x0424  (SMSC)
          Version:  0.03
          Speed: Up to 480 Mb/sec
          Location ID: 0xfd100000 / 2
          Current Available (mA): 500
          Current Required (mA): 2

            DAC-2 USB Black Edition:

              Product ID: 0x8012
              Vendor ID: 0x1852
              Version:  0.01
              Speed: Up to 12 Mb/sec
              Manufacturer: JAVS
              Location ID: 0xfd140000 / 5
              Current Available (mA): 500
              Current Required (mA): 500

* 추가 툴 
https://developer.apple.com/hardwaredrivers/download/usbdebug.html 
 
2010. 8. 29. 17:27
Mac 이 태생이 FreeBSD로 Unix 계열이다 보니 이참에 웹서버를 구축해보았다.

해놓고 보니 이런... DB가 없다...


그래서 Mac에 MySQL을 설치하였다.

자료는 여기  http://egg.pe.kr/362(에그의 행복 연구소) 가서 찾고
받기는 여기 http://dev.mysql.com/downloads/mirror.php?id=392758#mirrors 가서 받았다.

mysql-5.1.50-osx10.6-x86_64.dmg 요런게 들어있다~~
Readme.txt를 열고 적당히 읽어보면서 설치하면 끝 ~



설치후 기본적으로 mysql 관련 명령어들은 /usr/bin/ 에 있다.

설치만 하면 무엇하랴~~ 이 MySQL은 GUI Interface를 자체적으로 갖고 있지 않다.
전부 command line~, 그러니 좀더 편하게 사용하려면 좀 더 발품을 팔아야 했다.

그리하여 찾게된 것이 바로 Navicat이다.

친절하게도 각 OS별로 전부 제공한다. Windows, Mac, Linux, PPC 까지

http://www.navicat.com/en/download/download.html


자 끝났다~~
Navicat을 쓰면 편한게 다른건 몰라도 접속 환경하고 사용자 설정 그리고 백업 같은거 하는데 정말 유용하다. 게다가 데이타베이스 만드는 것도 좀더 손쉽게 할 수 있다.


2010. 4. 18. 09:12
Mac이 그나마도 Unix를 뿌리에 두고 있는(사실 정확하게 말하자면 FreeBSD이다.뭐 이것도 Unix의 한 갈래라고 할 수 있으니 상관없다.) Dawin Kernel이기에 리눅스에서 쓰던 환경을 그대로 쓸 수 있다는 건 큰 장점이긴 했다.

단 불편한 것이 터미널 프로그램이었고, iTerm이라는 좋은 프로그램을 구하여 쓰게 되었다.공개이고 프리이다.

iTerm을 설정하는 부분이다.

iTerm을 보통 처음 실행하면 하얀 바탕에 까만 글씨로 나오게 되는데, 사실 리눅스에서 까만 화면에 익숙해 있던 나로서는 바꾸고 싶었다.

한참을 찾다가 알아낸 것이 Bookmark에 있는 기능이다.

메뉴에서 Bookmark를 보면 Manage Bookmarks라는 항목이 있다. 이것을 클릭하자
그러면 Default 항목이 보일 것이다. 그것을 선택하고 아래쪽에 있는 연필 모양 아이콘을 클릭하자.
거기서 Display 항목이 Light Background 로 되어 있을 것이다. 이것을 Dark Background로 바꾸어 주자.

그 다음 새로운 탭을 생성하거나 아니면 프로그램을 종료 후 다시 실행하면 된다.

2010. 3. 16. 01:57
Mac OS가 BSD 를 가지고 Darwin 이라는 프로젝트로 진행한거이다 보니
웬만한 유닉스/리눅스 계열 명령들은 전부 사용이 가능합니다.

그러다 보니 terminal 프로그램도 사용 가능한데요.. 이게 좀 안좋은게 폰트가 너무 안좋아서 가독성이 많이 떨어집니다.
기능이야 내장  terminal 프로그램이 좋기야 하지만 이 폰트가 너무 안좋아서.ㅡㅡ
iTerm이 가볍게 쓰기 딱 좋습니다.
게다가 무료입니다.

http://iterm.sourceforge.net/


2010. 3. 4. 01:23

Overflow 소개

dEVELOPER's 2010. 3. 4. 01:23
삼성 소프트웨어 멤버쉽 시절 작성했던 문서이다.
Overflow 관련된 것으로 지금보니 우습기도 하고, 그래도 소개하는 측면에선 충실했다.
2009. 3. 7. 13:36

ARM에서의 Veneer, Veneer code

Veneer 사전적인 의미는 합판 이라는 의미입니다.
(어릴때 가끔씩 베니어 합판이라는 용어를 들은 적도 있는 것 같습니다.)

처음 ARM에서 veneer 란 용어를 접했을때 제일 먼저 찾아본것이 사전인데
ARM에서 의도하는 바와는 좀 다르더군요.

사실 veneer에 대해서 몰라도 동작자체가 잘 안되고 하는 것은 아니지만,
아마도 ARM을 공부하는 사람이라면 기본적으로 알아야 겠지요. 더구나 디버깅을 잘하려면 말이죠.
인터넷에서는 위에서 말한 합판이라는 용어가 같은 단어라 참 찾기도 애매합니다.
그래서 ARM Manual을 뒤져서 정리했습니다.


Veneer에 대해서 ADS(Arm Development Suite) 에서는 다음과 같이 설명하고 있습니다.

Veneer
A small block of code used with subroutine calls when there is a requirement to change processor state or branch to an address that cannot be reached in the current processor state.

Veneer generation
armlink must generate veneers when:
  ● branch involves change of state between ARM state and Thumb state
  ● branch involves a destination beyond the branching range of the current state.
A veneer can extend the range of branch and change processor state. armlink combines long branch capability into the state change capability. All interworking veneers are also long branch veneers.
The following veneer types handle different branching requirements. The linker generates position-independent versions of the veneers if required:

ARM to ARM
    Long branch capability.
ARM to Thumb
    Long branch capability and interworking capability.
Thumb to ARM
    Long branch capability and interworking capability.
Thumb to Thumb
    Long branch capability.

armlink creates one input section called Veneer$$Code for each veneer. A veneer is generated only if no other existing veneer can satisfy the requirements. If two input sections contain a long branch to the same destination, only one veneer is generated if the veneer can be reached by both sections.
All veneers cannot be collected into one input section because the resulting veneer input section might not to be within range of other input sections. If the sections are not within addressing range, long branching is not possible.


결국 가장 veneer code를 사용하는 목적은 두가지로 정리됩니다.
  1. branch 시에 ARM mode와 Thumb mode 간의 상태변환이 필요할때.
  2. branch 시에 branch 하는 대상 address가 access 가능한 range를 벗어나 확장이 필요할때(if long branch is needed)
** 참고로 이 두가지에 모두 해당하는 상황도 있습니다.

이제 위의 두가지 경우에 대해서 좀더 자세히 살펴보면

1. ARM Thumb state transition
ARM instruction은 32bit 이고 Thumb instruction은 16bit입니다. 그래서 ARM instruction으로 작성된 함수에서 Thumb instruction으로 작성된 함수를 호출할 경우에는 반드시 상태 변환이 필요합니다.
다음에 좋은 예가 있습니다.
아래를 보면, $Ven$AT$$ThumbFunc 를 호출하는 부분이 있습니다. 이것을 쫓아가 보면
0x0A001028 에 있는 값을 r12에 저장하고, bx 를 사용하여 r12에 저장된 주소를 분기하고 있습니다.
bx 는 branch 후 state를 바꾸게 되는데, address가 홀수이면 ARM->Thumb으로 짝수이면, Thumb->ARM으로 변경합니다.
결국 아래 부분은 0x0A00101D가 홀수 address이므로 branch 후 ARM->Thumb으로 state를 바꾸게 됩니다.

여담으로 linker가 생성하는 심볼인 $Ven$AT$$ThumbFunc 는 AT가 ARM->Thumb으로 변환함을 의미합니다.
그밖에 AA,TA,TT 가 있습니다. 지금 아래 예제에는 없지만, long branch 를 나타내는 부분도 있습니다.
참고로 ARM에서의 veneer 관련 symbol naming및 의미입니다.
    ${Ven|other}${AA|AT|TA|TT}${I|L|S}[$PI]$$symbol_name
    AA : ARM to ARM
    AT : ARM to Thumb
    TA : Thumb to ARM
    TT : Thumb to Thumb
     I : Inline
    L : Long branch
    S : Short reach
    PI : Position Independent

	   ARMFunc
0x0A001000:	mov	r0,#1
0x0A001004:	bl	$Ven$AT$$ThumbFunc
0x0A001008:	mov	r2,#3
0x0A00100C:	mov	r0,#0x18
0x0A001010:	ldr	r1,0x0A001018 ; =#0x0A020013
0x0A001014:	mov	r0,#0
0x0A001018:	dcd	0x0A020013
	   ThumbFunc
0x0A00101C:	mov	r0,#1
0x0A00101E:	bx	r14	
	   $Ven$AT$$ThumbFunc
0x0A001020:	ldr	r12,0x0A001028 ; = #0x0A00101D
0x0A001024:	bx	r12
0x0A001028:	dcd	0x0A00101D
0x0A00102C:	dcd	0x0A00331F
0x0A001030:	dcd	0x007F2E00
0x0A001034:	dcd	0xA703031F
0x0A001038:	dcd	0xA703032E



2.Long branch out of range
다음을 보면 range를 벗어나 확장이 필요한 경우(out of range)에 대한 적절한 설명이 있습니다. 역시 ARM manual입니다.

Machine-level B and BL instructions have a range of ± 32Mb from the address of the current instruction. However, you can use these instructions even if label is out of range. Often you do not know where label is placed by the linker. When necessary, the ARM linker adds code to allow longer branches (see The ARM linker chapter in Linker and Utilities Guide). The added code is called a veneer.

address range가 32Mb 정도이고 이것을 벗어나는 address일경우에는 veneer를 쓴다는 이야기입니다.
(이것은 register의 크기가 4byte, 즉 32bit 이기 때문입니다.)
하지만 이것도 ARM mode에서의 이야기이고, Thumb mode에서는 16bit입니다.
간단한 내용으로 따로 예제는 들지 않지만, 위와 비슷합니다.

출처 : 직접 작성
References
  http://www.arm.com
  ADS Manual
  Elf for ARM architecture

2009. 2. 5. 00:57
이런 귀중한 자료가~ ㅋ 무료라고 한다. 링크에서 받자~



2009. 2. 2. 13:14
나는 에디터 하면 처음 떠올리는 것이 VIM이다.

사실 접한거야 대학 때지만, 그 어떤 에디터보다도 매력적이다.
(사실 필요없지만, 그다음은 UltraEdit, EditPlus, notepad)

Mac의 운영체제는 얼마전부터 Unix/Linux 기반으로 바뀌었다.

대부분의 Unix 환경에서 사용하는 것들은 대부분 사용가능하다. (심지어 iPod Touch도 Unix/Linux 기반이다.)

VIM도 기본 내장이다.

그런데 문제는 이 기본내장이 정말 기본에만 충실해서 윈도우에서 쓰던 gVIM 이나
리눅스에서 사용하던 VIM 하고는 좀 차이가 날 정도로 불편하다는 것이다. 게다가 GUI 인터페이스도 없고..
터미날 띄워서 사용하기엔 좀 불편하다.

오늘 찾았다. MacVIM

2009. 2. 1. 14:06
I2C Bus Interface
  - 1. Introduction

-------------------------------------------------------------------------------------
1. I2C, I2C(IIC) Bus Interface

  간단히 말해 통신방식의 하나로서, 주로 주변장치(Peripheral)와 통신/제어 용으로 많이 사용합니다.
  SCLK, SDATA 두개의 line을 사용하는 동기식 직렬통신(Synchoronous Serial Communication)의 하나입니다.
  비슷한 방식 통신 방식에는 UART, SPI 등이 있습니다.

  사실 별 신경쓰지 않고 있는 IIC, I2C 이 이름은 Inter-IC의 약자이다. IC는 Intergrated Circuit의 약자이다.
  어느 사이트에서 이 이름의 발음을 나름 쉽고 재미있게 표현했다.
  "eye-squared-see" 물론 이것은 발음상의 이야기이다

  통신 방식의 하나이지만, 앞서 말한 Inter-IC에서 보듯이, 주 목적이 제어입니다.
  
  여담으로 말하자면, 처음 고안한 회사가 Philips(현 NXP) 입니다.
  실제 이 회사 사이트에 가면 i2c specification을 얻을 수 있습니다.
  다음 링크를 참조하세요
  http://www.nxp.com/acrobat_download/literature/9398/39340011.pdf

2. 기본적인 구성 및 통신 방식 
   * 기본적인 구성
     - SCL : Serial Clock
     - SDA : Serial Data
     - 이 두 SCL, SDA로 Send, Recieve를 모두 수행합니다.

   *  Transferring bit/bytes

   * 기본적인 특징 및 통신 방식
     - Master Slave Relationship
       모든 I2C 장치들은 Master와 Slave간의 통신입니다.
       사실 이둘을 어떻게 구분하느냐는 것은 간단히 Clock generation을 누가 하느냐라고 보면 됩니다.

     - Single Master, Multiple Slave
       하나의 Master에 여러개의 Slave가 연결될 수 있습니다.
       이런 특징과 더불어 Slave device는 device고유의 Slave address를 가지고 이를 통해 각각의 Slave와 통신합니다.

     - Communication Protocol
       ▷ Slave Address를 지정
       ▷ I2C의 구성에서 보듯이 Read/Write에 대한 전용 line이 없고 통신 프로토콜 상에서 Read/Write를 결정.
       ▷ ACK(Acknowledgement), NACK(Non-Acknowledgement)
         [Slave Address][R/W][NACK/ACK]  [DATA][NACK/ACK]



--------------------------------------------------------------------------------------------------------
출처 : 직접 작성
2009. 1. 21. 10:00

이 에러는 얼마전 내가 겪었던 나름대로 당혹스러웠던 에러였다.

다른데서 잘 동작하는 게 갑자기 링크에러를 내다니...

결국은 내가 무지한 탓이었지만...


직관적으로 ARM 사이트(http://www.arm.com)에서 찾아보면 다음과 같이 나온다.
http://www.arm.com/support/faqdev/1240.html


그냥 봐선 저 내용 잘 이해가 안될 것이다.
저 내용만 보고 이해를 하려면, ARM link시에 사용하는 몇몇 옵션들에 대해서 이미 잘 알고 있다는 전제하에서 가능하다.

그럼 차근차근 저 내용을 풀어 보도록 하겠다.


  What does "Error: L6248E: cannot have address type relocation" mean?
  실제 에러는 이렇게 나오지는 않고, 이 의미를 포함해서 나온다.
  처음에 제일 당황스러운 부분이다. 왜 주소를 가질수 없다는 걸까? 
  분명히 코딩 상의 문제는 아니다.



 This linker error can occur when trying to build "Position Independent" code. Consider a small example like:
#include <stdio.h>
char *str = "test";
int main(void)
{
    printf ("%s",str);
}

 그냥 보면 이 코드는 전혀 문제가 없어 보인다. 정말 단순하기 짝이 없지만 크게 문제될 부분으로 보이지는 않는다.
실제로 gcc로 컴파일 해보자. 아무 에러 안나고 잘 실행될 것이다.
중요한 것은 링크 옵션에 있다.


when compiled and linked with:
armcc -c -apcs /ropi pi.c
armlink -ropi pi.othe linker will report a message of the form:


Error: L6248E: pi.o(.data) in ABSOLUTE region 'ER_RW' cannot have address/offset type relocation to .constdata in PI region 'ER_RO'.


For the code above, the compiler generates a global pointer "str" to the char string "test". The global pointer "str" will need to be initialized to the address of the char string "test" in the .constdata section.
However, absolute addresses cannot be used in a PI system, so the link step fails,
because of the ABS32 relocations to (position independent).constdata.

자 드디어 보여지는 링크 옵션. 강조해 놓은 저부분에 아무런 문제도 없어 보이는 코드에서 링크에러를 보여주는 원인 제공자이다. 
 눈에 띄는 옵션 들이 있다. -apcs /ropi
 Error 부분을 보면 낯선 구문이 보인다. PI region 'ER_RO' 이걸 이해하는데 키워드중 하나가 바로  PI region이다.

* PI region
  - Position Independent Region 의 약자이다.
     ARM Manual에는 간략하게 이런 설명이 있다.
     One or more of the position-independent regions is automatically moved to a different address.
     이 이야기는 load 시, 즉 프로그램이 실행되어 data 영역이 ram 에 로드될때 PI region에 속한 data 영역은 absolute하지 않고 relative 하다, 다른 말로 different address를 가진다는 이야기이다.

* Error 부문을 해석해 보면
  ABSOLUTE region ER_RW 에 있는 pi.o(.data)(-- 이것은 data영역 즉 변수에 대한 영역이다.--) 는 PI region ER_RO에 속한 .constdata 에 대한 address를 가질수 없다라는 뜻으로 해석된다. 
  좀더 쉽게 접근하자면,  absolute region에서 relative region의 address를 참조할 수 없다라고 이해하면 된다.
  (어떻게 보면 정말 당연한 이야기이기도 하다.)
  Position Independent region이라는 것이 absolute address를 가지는 것이 아니라 pc-relative address를 가진 다는 의미이다.

 * 그렇다면 갑자기 PI region이라는 것은 어디서 튀어나온 것일까?
   그렇다, 이것은 옵션에 지정되어 있다. 
      /ropi, -ropi

  이 두 옵션에 대해 ARM manual에서는 다음과 같이 설명하고 있다.
* -ropi
---------------------------------------------------------------------------------------------------------
This option generates (read-only) position-independent code. /pic is an alias for this option. If this option is selected the compiler:
 - addresses read-only code and data pc-relative
 - sets the Position Independent (PI) attribute on read-only output sections.
Note
The ARM tools cannot determine if the final output image will be Read-Only Position Independent (ROPI) until the linker finishes processing input sections. This means that the linker might emit ROPI error messages, even though you have selected this option.
---------------------------------------------------------------------------------------------------------

* 다시 Error 밑 쪽의 설명을 참조하여 풀어보면
  compiler는 global pointer 변수 str를 만들고, 코드에 이에 대한 초기값이 지정되어 있으므로 이 초기값으로 str 변수 값을 초기화한다. 이 때 "test" 이 값은 const data 형태로 생성하고, 이는 ro 영역, read only 영역에 속한다. 
그런데 컴파일과 링크 옵션에서 지정했다시피 ro 영역은 PI region으로 지정하였다. 이 이야기는 "test"에 대한 address가 load시마다 달라질 수 있다는 의미이다. str이라는 변수는 compile 시 초기값이 결정되어야만 하고, 이 초기값으로 사용되는 "test"에 대한 address는 load시에 결정된다. 결국 compiler는 global pointer 변수 str의 초기값으로 load시 마다 달라질 수 있는 address를 넣을 수 없기 때문에 이런 에러를 보여주는 것이다.

 

To resolve this, you must re-write the code to avoid the explicit pointer. Two possible ways are shown below:

1) Use a global array instead of a global pointer:

#include <stdio.h>
const char str[] = "test";
int main(void)
{
printf ("%s",str);
}

2) Use a local pointer instead of a global pointer:

#include <stdio.h>
int main(void)
{
char *str = "test";
printf ("%s",str);
}

Please note that if you are using a list with multiple elements, such as:

char * list[] = {"zero", "one", "two"};

You will get a separate link error for each element in the array. In this case, the recommended solution is:

char list[3][5] = {"zero", "one", "two"};

with the print instruction being (for example):

printf("%s", list[1]);

Note that you will need to declare a two dimensional array for the list, with the first dimension as the number of elements in the array, and the second dimension as the maximum size for an element in the array.

 
 ARM 사이트에서 제시하는 이런 에러에 대한 해결 방안이다.
 결국 코드를 바꿔야 한다. 이런식의 코드를 Position Independent code라고 부른다.

 이 예제의 내용은 비교적 이해하기 어렵지 않다.
 1) 같은 const 영역 ro 영역에 두는 것이다. 물론 같은 ro 영역이니 상관없다.
 2) global로 쓰지 않고 local variable로 사용하는 것이다.

 마지막의 두 array에 대한 예제는 크기를 지정하지 않은 경우와 지정한 경우에 대해 차이가 있고, 이 차이에 의해 이 에러를 일으킬 수 있다는 점을 설명하고 있다.
  좀 더 다르게 이런식의 접근도 가능하다.
   char *list[]   ==> 배열 포인터, 즉 global pointer variable이다. 결론적으로 처음 설명한 것과 같은 논리이다.
   char list[3][5] ==> 사이즈와 값이 결정된 array이다. 
  이둘의 차이는 하나는 포인터를 가지는 변수고, 하나는 값을 가지는 변수라는 점이다.

 이 에러의 초점은 주소 참조 이다. 그러니 address를 참조하지 않는다면 아예 해당되지 않는 이야기인 것이다.


참조
http://www.arm.com