일단 이것은 정식 방법인지는 모른다.
꽁수일 수도 있고, 뭐… 일단 잘 되니 OK ! !
보통 SmartOption 은 MDS 장비와 타겟 보드를 이용하여 개발할 때에는 사용하지 않는다.
타겟에 딥 스위치나 점퍼로 SmartOption 을 설정하게 되어있거나, 설정이 필요없는 MCU 도 있기 때문에 SmartOption 을 롬의 지정된 영역에 넣을 필요가 없다.
하지만 양산시에는 예기가 달라진다.
양산시에는 SmartOption 을 조정하는 스위치 같은 것들은 넣을 수 없다. ( 딥 스위치나 점퍼를 이용한 세팅은 개발 편의를 위해 타겟만의 특수 기능이라고 보면 된다.)
양산시 사용할 인텔 표준 헥사 규격(Intel-Standard HEX Format) 으로 헥사 파일을 생성해 대량 롬 라이터(갱 라이터를 말한다)를 이용해 MCU 의 롬을 구울경우, 즉 대량생산시에는 헥사파일로 컴파일 결과물을 만들어야 하기 때문에 사용한다.
Intel-Standard Hex 규격에 대한 자료 ( 열기 )
먼저 사용할 삼성 MCU 에 데이터 쉬트를 보자!
데이터 쉬트는 삼성 반도체나 AllDataSheet 를 이용하면 된다.
S3F9488 의 경우 2-3 페이지에 스마트 옵션과 관련된 내용이 있다.
이제 상세 설명으로….
스마트 옵션 코드는 롬 코드에 존재해야되는데, 데이터 쉬트상에 보면 롬의 0x003C 번지부터 순서대로 4 개의 영역(4 Byte)에 이 코드를 넣으라고, 한다.
설정에 대한 내용은 데이터 쉬트를 참고하도록 하고…
이제 IAR 에서 간단하게 3 줄만 넣자.
1 2 3 4 5 6 7 8 |
/*코드 상단에*/ __code const unsigned char SmartOption[4] @ 0x003C = { 0x00, 0x00, 0xD8, 0x04 } unsigned char SOTemp; ... ... ... /*리셋 함수내에 위치*/ SOTemp = SmartOption[0]; |
__code 는 컴파일러 지시자로서 컴파일러에게 해당 변수 내용을 롬 코드로 만들라는 명령이다.
후반부에 @ 0x003C 는 주소를 표현하며 이 부분이 없을 경우 컴파일러 마음대로 위치시키게 된다.
이 함수는 램에 존재하지 않고 직접 롬에서 데이터를 읽기 때문에 램을 절약할 수 있다.
특히 __code 는 절대 변해선 안되는 코드일 경우에 좋다.
하단에 변수 선언과 선언한 변수에 데이터를 넣는 작업은 컴파일러 때문에 하는 작업이다.
컴파일러마다 특성이 다르기 때문에 약간씩은 다르지만 기본적으로 사용되지 않는 함수, 변수, 상수 등은 컴파일시 자동으로 제외된다. (물론 제외 안하는 것들도 있을 수 있으며, IAR 의 경우 사용 안하는 것들은 컴파일 하지 않는다.)
그렇기 때문에 강제로 딱 한번, MCU 가 리셋되었을 때(전원인가시, 리셋이 걸렸을 때) 리셋 부분에서 대충 데이터를 넣도록 하는것일 뿐, 큰 의미가 없다.
일단 이 방법의 강점은 걍 코딩하면서 쓴다는 것과, 급하게 스마트 옵션 변경시 HEX 파일에서 해당 부분을 수정하면 된다는 것이다. (물론 위에 걸어놓은 인텔 표준 헥사 규격을 알고 있어야 된다.)