[현대오토에버SW스쿨4기] 임베디드 C프로그래밍 기초(1)

chaehun·2025년 2월 24일

'Embedded C Programming 기초' 환경 구축 및 보드 소개

CPU / GPU / MPU / MCU

  • CPU / GPU / MPU / MCU
    • CPU: Central Processing Unit
    • GPU: Graphic Processing Unit
    • MPU: Micro Processing Unit
    • MCU: Micro Controller Unit
      • MCU = CPU + 메모리 + 인터페이스
      • 단독 동작 가능하도록 만들어짐



low-clock generator가 있다 (37 kHz 짜리)
개발보드의 Internal clock들은 그렇게 정확하지는 않다.

12bit adc 제공
2개의 dac 제공
dma controller가 무엇을 supporting 하는지 나와있다.
뭔가 붙어서 데이터를 주고 받으면서 동작 -> interfaces 라고 표현을 하고 따로 제공을 해준다. 마지막날 배울 것이다.
타이머를 11개를 지원을 해준다. 타이머를 쓰는 부품들이 많겠구나 라고 생각하면 된다.

어셈블리어 코딩을 요구할시 필요 문서

gpio 쓸 때 필요 문서


'Embedded C Programming 기초' 개발 환경 이해 및 실습

프로그램과 컴파일

  • Program
    • 컴퓨터를 실행시키기 위해 차례대로 작성된 명령어 모음.

컴파일 & Linking

  • 컴파일: the process of converting human-readable code into machine-readable code.
  • Linking: the process of collecting and combining various pieces of code and data into a single file that can be loaded (copied) into memory and executed.

Cross Compile이란?

  • 크로스 컴파일러는 컴파일러가 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행 가능한 코드를 생성할 수 있는 컴파일러이다.

Build & Cortex-M

  • 컴파일 + 링킹 => 빌드
  • 빌드의 산출물 = Executable Image(실행 파일)
  • Flash memory에 Image file이 올라가는 것 -> 펌웨어 업로드 (디버거를 통해서 올린다.)
    UART로도 올릴 수 있는데 우리가 boot loader를 직접 만들어야 함.
    디버거 자르고 상용화 시키는 경우가 많아서 실제로 이런일이 꽤 일어날 듯?

sct / lst / map / hex

  • sct: Internal / External Rom / Ram 시작 주소, 사이즈 등
    ROM, RAM을 우리가 추가로 붙였을 때 직접 코드를 넣어줘야 함. 링커가 map파일을 만들기 위해서
  • lst: raw listing information for a source file
  • map: code size / address map file
  • hex or bin: executable image(output file) -> 실제 실행 파일
    • Vector table
    • Reset handler/startup code
    • C startup code
    • Application code
    • C runtime library functions
    • Other data

Cortex-M0 시작 순서 - Reset

Reset -> Boot Loader -> Reset handler
이 순서는 대부분의 코어들이 거의 동일하게 시행
Boot Loader 쪽에서 변형이 존재

  • Reset handler: 하드웨어 초기화 작업 -> vector table 쭉 만들어준다. 그 후 C start up 코드를 호출
  • 내가 이해한 걸로는 Reset handler에서 vector table을 만들어서 걔가 직접 다시 참조해서 msp를 읽어 들이고 reset vector를 읽어 들여서 첫번째 실행할 instruction을 fetch한다. -> 이게 맞나?

Cortex-M0 시작 순서 - 실행파일 예제

  • Map 파일을 참조하면 stack heap 영역을 제외하고 다른 코드 부분들이 Flash 메모리에 적재되어있음을 알 수 있다. -> 불확실하므로 낼 직접 파일을 들여다보자.

Cortex-M0 시작 순서 - Reset handler

  • Reset Handler의 역할: SystemInit 함수를 호출, 그 후에 __main을 통해서 main 함수를 호출
    SystamInit 함수에서는 system initializing 해주고 main 함수로 건너뜀

실습


노란색은 우리가 못쓴다는 것
osc_in, out은 외부 클럭 달아서 쓸 때
ST-LINK part의 mcu에서 만들어서 내려주면 mco를 통해서 들어와서 클럭 동기화가 일어남
usart tx, rx는 uart 관련 5일차에 쓸 것임.
PA13, 14는 디버그 관련 핀


이렇게 되면 시스템만 살아있는 형태가 된다.


2mhz 클럭을 사용하게 된다.
내가 blinking 실습 할 때, delay를 for loop 1억번 도는 걸로 했는데, blinking이 안되고 불이 계속 켜져있었는데 그 이유가 이것 때문인 것을 알 수 있다.


rom사이즈랑 ram 사이즈를 지정해준다.


여기서 무한루프를 안돌면 프로그램이 그냥 종료된다. 파워는 계속 들어가 있다.

클럭 세팅하는 부분


안 지운 부분(시스템을 구성하는 부분) 클럭 활성화만 해준다.
rtos가 있으면 칩에 main에서 운영체제를 세팅하고 호출하는 부분으로 끝날 것이다.


왼쪽은 컴파일만, 가운데는 빌드, 오른쪽은 배치파일을 만들어준다.
download 펌웨어를 download 해주는 애다.


download, option조정해주는애(망치) 맨 오른쪽은 팩 인스톨러


여기서 내가 새로 메모리 구매해서 붙여주면 수정한다.


시스템 전체에 define 건다, 컴파일러 최적화 옵션도 결정할 수 있다. 옵션이 높으면 object 코드 사이즈는 줄어드는데 중요 부분이 생략될 수도 있다. 임베디드 환경에서는 warning도 잡아주는 것이 좋다. 생각한대로 실행되지 않을 수도 있다. 우리가 가장 자주 쓰게 될 옵션, 추가할 헤더 파일도 설정할 수 있다.

어셈블리 코드에 대한 세팅


암코어를 이용하는 mcu라서 scatter file관련 부분이 아래 작성되어있다.


사용할 디버거를 선택할 수 있다.


세팅 버튼이 달려있는 use debug driver 저쪽이 중요하다.


erase full chip은 칩 수명이 빨리단다. 안지우면 이후 프로그램 디버깅할 때 이전 데이터가 남아있다. -> Erase Sectors가 제일 낫다.


Aport는 시스템이 점유하고 있는 애들도 있나보다. 리셋 밸류가 모두 11이 아니니까

while문 안에 gpio set 하면 위험하다. delay 없이 하면 하드웨어가 죽을 수 있다.

0개의 댓글