이제 Keil의 uVision을 이용하여 직접개발을 한다면, 개발방법은 내생각하기에는 두 가지로 진행을 하면될 것 같다.
- Keil에서 제공해주는 MDK Package 기반으로 구성개발 (MDK 라이센스필요)
- ST에서 제공해주는 무료 uVision Example Source 기반으로 개발
1.1 ST Example 기반으로 개발방법
우선 본인이 사용하는 EVM or ST의 정확한 Chip 정보를 안후, 관련된 검색을 하여 ST Site를 들어가보자.
https://www.st.com/en/evaluation-tools/stm3210c-eval.html#tools-software
ST사에서 제공해주는 Example Source를 쉽게 구할수 있으며, 다양한 IDE를 지원을 하고 있다.
다만, MDK와 다르게, CMSIS 기반으로 구성하고,
나머지는 Open Source or 직접 Example을 제공을 해주고 있다.
아래와 같이 모두 소스가 들어있어 분석하기에는 이것이 더 편하며, 실제로 바로 동작하고, 이를 확인가능하므로 편하다.
2. Keil의 uVison의 설정기능
- Options for Target "Project"-> Target
이 부분 빌드가 진행 후 *.sct 파일을 보면 동일하게 설정이 된다
- Linker 관련부분설정
파일위치는 아래의 Output 설정
생성된 *.map 파일 통해 관련 Symbol Table 정보를 알아두자.
- Options for Target "Project"-> Output
- output folder 설정 (세부설정도 가능)
- Create hex (*.hex 지원, ST Link 사용시 필요 )
- debug information 기능 첨가
- Options for Target "Project"-> Listing
Assembler Listing 설정 및 위치
Linker의 MAP file 정보 수정
아래정보는 Assembler 관련정보이며 두개의 정보를 살펴보자.
Handler들은 WEAK로 설정하고, 함수를 미리선언하고 사용하고 싶다면 나중에 구현해서사용하는 이전의 Linux kernel 처럼 비슷한 것 같다
- weak (keil의 compiler 관련참조)
http://www.keil.com/support/man/docs/armcc/armcc_chr1359124978893.htm
- dcd (assembler )
http://www.keil.com/support/man/docs/armasm/armasm_dom1361290005934.htm
상위 Example의 어셈블리어의 구성을 보면 대충 쉽게 이해 할 수 있다.
- Options for Target "Project"-> User, C/C++ , Linker
- Compiler 옵션설정 가능
Compiler 옵션설정 및 Assembler 옵션설정 으로 세부 설정을 원할 경우 자세히 보자.
별도로 외부에서 define을 정의하거나, 최적화 옵션을 변경을 원하거나, Header 파일관련부분은 이곳에서 봐야 할 것이다.
상위는 일반적인 Linker script / command로 uVision에서는 scatter라고 한다.
현재 *.sct 파일로 동작하며, 이와 관련된 부분은 Compiler Manual을 참조하자.
- Options for Target "Project"-> Debug
우측에 ST-Link Debugger 이외에 다양한 JTAG Tool지원하기 때문에, 본인환경에 맞는 것을 설정하고, 관련부분을 설정하자.
TI의 CCS 처럼 JTAG 연결시 초기화 해주는 File도 설정가능한 것 같다.
예를들면, Board의 기본 BSP 설정인 Clock, DDR 설정 같은 것을 Board 연결시마다 해주는것이다.
상위우측설정->Setting 들어가면,
Debug->Target Com -> JTAG의 Clock 설정조절
Flash Download 설정 및 Trace 세부 설정 가능
상위 좌측 두 메뉴 Trace / Debug에서 사용하는 Clock이 높으면 Debug과 Flash도 편하다.
- Options for Target "Project"-> Utilities
Flash를 위해서, 외부 설정 Tool도 가능한 것 같으며, 내부설정은 위와 거의 비슷할 것 같다.
2.1 Format 관련설명
기본적으로 uVision은 *.axf 포맷을 만들어주고 이를 Loading 하는 방식으로 지원을 한다.
사용자의 설정에 따라 *.hex 설정지원을 해주고 있다.
*.axf 포맷은 ELF Format 이며 관련된 Tool을 보면 다음과 같다.
Keil_V5->ARM->ARMCC->bin
Linux 처럼 hex/bin 을 만들기 위해서 objcopy로 해봤는데, 잘되지는 않아 상위 설정을 직접설정하는 것을 찾았다.
만약 Command로 진행하고자 한다면 아래참조 하지만 위에서 처럼 쉽게 설정으로 끝내자.
fromelf 사용방법 ( bin변경)
http://www.keil.com/support/man/docs/armutil/default.htm
2.2 uVision의 Compiler 세부설정 및 이해
uVision에서 본인이 원하는 것을 구현을 하고 싶으나, 맘대로 되지 않는 경우가 많을 것이다.
예를들면, 특정 Address에 내가 원하는 값을 매번 넣는다거나 , SRAM에 특정 함수(ISR) 를 넣어 실행하고 싶다면, Compiler옵션을 제대로 이해 해야한다.
기본적으로 GCC 옵션과 유사하기 때문에, 쉽게 이해하리라고 본다.
원래 Keil(카일) 컴파일러 회사인걸로 알고 있으며, 자세히 이용하고 싶다면, 아래와 같이 Compiler Manual을 보자
- Compiler-specific Features (컴파일러 Manual)
GCC와 비슷하며, 아래와 같이 attribute 속성을 이용하여 Linker Script와 같이 조합하기를 원한다면, 아래의 Manual을 자세히 읽자
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0375g/chr1359124965789.html- Scatter File Syntax (Linker Script)
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0377g/pge1362075650322.html
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0377g/pge1362075687539.html
- Linker Optimization Features
- 본인이 원하는 데이타를 특정 Address에만 할당할 경우 (Example)
unsigned char test1[4] __attribute__((at(0x08010000))) = { 0,1,2,3}; //Flash 영역: 0x0801000 , IRAM 영역 0x20000000 unsigned char test2[4] __attribute__((at(0x08010004))) = { 0,1,2,3}; unsigned char test3[4] __attribute__((at(0x08010008))) = { 0,1,2,3};
확인하고 싶다면, ST-Link Utility에서 Hex로 Upload 한 후 직접 해당 Address로 보고 확인해보고 수정하자.
세부옵션을 사용할 경우, *.map 파일에서 결과를 확인하자.
세부옵션을 사용할 경우, *.map 파일에서 결과를 확인하자.
나의 처음 기본생각은 GCC의 Linker Script 처럼 특정 Section을 만들고, Section에 변수를 할당할 생각이었으나, 상위와 같이 더 편한 옵션을 찾았다.
- Linker Script / Command 와 조합
http://www.keil.com/support/man/docs/armlink/armlink_Chunk1880490665.htm