5/23/2019

Keil 의 uVision 개발방법 (2)

1. Keil uVision 개발방법

이제 Keil의 uVision을 이용하여 직접개발을 한다면, 개발방법은 내생각하기에는 두 가지로 진행을 하면될 것 같다.
  1. Keil에서 제공해주는 MDK Package 기반으로 구성개발 (MDK 라이센스필요) 
  2. 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
Complier의 기본 Link Command 설정이며, Compiler 관련 설정이다.
이 부분 빌드가 진행 후 *.sct 파일을 보면 동일하게 설정이 된다
- Linker 관련부분설정


파일위치는 아래의 Output 설정


생성된 *.map 파일 통해 관련 Symbol Table 정보를 알아두자.


  • Options for Target "Project"-> Output

  1. output folder 설정 (세부설정도 가능)
  2. Create hex (*.hex 지원, ST Link 사용시 필요 )
  3. 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 / commanduVision에서는 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
  http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0377g/pge1362065925027.html


  • 본인이 원하는 데이타를 특정 Address에만 할당할 경우 (Example)
이외에도 특정세션을 만들고, Link Script/command에서 직접 할당하는 방식도 있을 것이며, 다양할 것으로 본다. 

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 파일에서 결과를 확인하자. 

나의 처음 기본생각은 GCC의 Linker Script 처럼 특정 Section을 만들고, Section에 변수를 할당할 생각이었으나, 상위와 같이 더 편한 옵션을 찾았다.

  • Linker Script / Command 와 조합 
  http://www.keil.com/support/man/docs/armlink/armlink_pge1362066000009.htm
  http://www.keil.com/support/man/docs/armlink/armlink_Chunk1880490665.htm