| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- robot
- 라즈베리파이
- USART
- Visual Studio Code
- c#
- buildroot
- QEMU
- yocto project
- 아두이노
- Arduino
- yocto
- bare metal
- raspberrypi
- STM32
- vscode
- Raspberry
- 문자 장치
- Linux
- Visual Studio
- atmel
- WPF
- UART
- GPIO
- C++
- QT
- 리눅스
- Debug
- 디버깅
- AVR
- nucleo
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
[STM32] git으로 협업하기 위한 FreeRTOS 기반 프로젝트 구조 본문
- 개발 환경
개발 보드 : NUCLEO-F103RB
개발 프로그램
- STM32 CubeMX : 6.18.1
- STM32CubeIDE for Visual Studio Code : 3.10.0
- 소스 코드
https://github.com/MainForm/STM32_FreeRTOS_template
GitHub - MainForm/STM32_FreeRTOS_template
Contribute to MainForm/STM32_FreeRTOS_template development by creating an account on GitHub.
github.com
1. 서론
MCU의 펌웨어의 개발 환경은 웹이나 일반 어플리케이션 개발에 비해 매우 제한적인 환경에 있습니다. 개발 언어는 대부분 C나 C++로 고정되어 있으며 제한된 자원(메모리나 Clock 속도)과 부족한 라이브러리등이 있습니다. 이러한 제한된 개발 환경에서 git을 도입하기 위해서는 많은 문제점이 발생합니다. 예를들어 쓰레드의 부재, Peripheral의 공유, 인터럽트 우선 순위 및 콜백 함수 관리 등의 문제가 발생합니다. 이러한 문제점을 해결하기 위한 저의 노하우를 앞으로 포스트를 통해 공유하고 정리하려고합니다.
가장 먼저 중요한 것은 프로젝트의 구조를 설계하는 것입니다. 특히 협업을 하는 과정에 있어 각자 개발하는 파일이 서로 겹치는 충돌을 최대한 줄이기 위해서 프로젝트의 구조를 확실하게 하는 것은 매우 중요한 일입니다. 하지만 MCU 펌웨어 개발에서는 RTOS를 사용하지 않는다면 main함수의 Loop에 대부분의 코드를 작성해야하는 문제가 발생합니다. 이러한 문제점을 해결하고자 FreeRTOS를 적용하여 각 기능을 Task별로 구분하여 개발하는 것입니다.

2. STM32 CubeMX 프로젝트 생성




다음으로 각 Task를 생성하고 Handler 함수를 weak과 external로 설정합니다.
여기서 weak과 external의 의미는 다음 섹션에서 설명드리겠습니다.




3. STM32 프로젝트 구조 변경
https://littlebitodd-developer.tistory.com/91
[STM32] VisualStudio Code에서 개발 환경 구축
1. 서론 STM32 MCU를 개발 할 때 대부분은 STM32CubeIDE나 IAR EWARM를 사용할 것 입니다. 하지만 저는 Visual Studio Code에서 자주 사용하기 떄문에 다른 개발 환경에서 개발하는 것이 힘들 때가 있습니다. 다
littlebitodd-developer.tistory.com
먼저 위 포스트로 들어가 VisualStudio Code로 프로젝트 설정을 완료합니다.

App/Src 폴더를 새로 만들어 그 안에 "defaul_task.cpp" 와 "my_task2.cpp" 를 새로 생성합니다.

"Core/Src/freertos.c" 에 확인해보면 __weak 속성과 external 속성이 설정되어 있는 것을 확인 할 수 있습니다.
- 함수 weak 속성에 대한 설명
C언어 weak 속성 설명:
Documentation – Arm Developer
support.arm.com
함수를 새로 만들때 선언(Declaration)과 정의(Definition)가 있습니다.
- 함수의 선언(Declaration)

함수의 선언은 "해당 함수 머리(Header)를 가지고 있는 함수가 있습니다." 라는 의미를 가집니다.
- 함수의 정의(Definition)

함수의 정의는 실제 함수가 어떻게 동작하는지 나타내는 것입니다.
그렇기 때문에 함수의 선언과 함수의 정의는 1:1로 매칭되어야 합니다.

하지만 weak 속성을 사용하면 함수 선언과 함수 정의 간의 연결 우선순위가 낮아지게 됩니다. 그러므로 더 우선순위가 높은 함수 정의에 연결되게 됩니다.

- extern 키워드에 대한 설명
C언어 extern keyword 설명:
https://www.geeksforgeeks.org/c/understanding-extern-keyword-in-c/
extern Keyword in C - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
www.geeksforgeeks.org
extern은 C언어를 사용하다보면 자주 사용하는 것이므로 설명은 위 문서로 대체 하겠습니다.

#include <string.h>
#include "cmsis_os2.h"
#include "usart.h"
extern "C"
void StartDefaultTask(void *argument){
const char *msg = "msg : Task 1 is running\r\n";
while(1){
HAL_UART_Transmit(&huart2, (uint8_t *)msg, strlen(msg), HAL_MAX_DELAY);
osDelay(1000);
}
}

#include <string.h>
#include "cmsis_os2.h"
#include "usart.h"
extern "C"
void StartDefaultTask(void *argument){
const char *msg = "msg : Task 1 is running\r\n";
while(1){
HAL_UART_Transmit(&huart2, (uint8_t *)msg, strlen(msg), HAL_MAX_DELAY);
osDelay(1000);
}
}
- DefaultTask의 핸들러 함수 연결 구조

- Task2의 핸들러 함수 연결 구조

4. 결론
위 구조를 통해 Task별로 파일을 나눌 수 있으며, 한 사람당 하나의 테스크의 개발을 맡아 개발하면 충돌위 문제가 발생하지 않습니다. 결국 위 구조를 통해 개발자별로 그리고 STM32 생성 파일 별로 구분하여 개발할때 동시에 파일을 변경하는 일이 발생하지 않도록 하였습니다.
하지만 실제로는 이 구조만으로는 완전히 해결되지 않았습니다. 예를 들어 peripheral를 같이 사용한다면 mutex를 사용하여 동기화를 하여야 합니다. 이러한 구조는 계속 다음 포스트를 통해 소개 하도록 하겠습니다.
'Embedded > STM32' 카테고리의 다른 글
| [STM32] DMA를 통해 USART Overrun 문제 해결 (0) | 2026.09.30 |
|---|---|
| [STM32] USART 데이터 손실 및 멈춤 문제 분석(Overrun 문제) (0) | 2026.09.28 |
| [STM32] STM32 CubeMX으로 C++ 개발 환경 구축 (0) | 2026.09.22 |
| [STM32] VisualStudio Code에서 개발 환경 구축 (0) | 2026.03.07 |
| [STM32] PWM를 통한 SG-90 서보 모터 제어 (1) | 2025.04.10 |
