본문 바로가기

Study Information Technology

RTOS 프로젝트를 위한 전용 디렉토리 구조 설정하기

728x90
반응형

RTOS 프로젝트를 위한 전용 디렉토리 구조 설정하기

Overview

실시간 운영 체제(Real-Time Operating System, RTOS) 프로젝트를 진행할 때, 효과적인 디렉토리 구조를 설정하는 것은 프로젝트의 관리와 유지보수에 매우 중요합니다. 잘 구성된 디렉토리 구조는 코드의 가독성을 높이고, 팀원 간의 협업을 용이하게 하며, 프로젝트의 규모가 커져도 일관성을 유지할 수 있도록 돕습니다. 이번 글에서는 RTOS 프로젝트를 위한 권장 디렉토리 구조와 그 필요성에 대해 자세히 설명하겠습니다.

1. RTOS 프로젝트 디렉토리 구조의 중요성

RTOS 프로젝트는 일반적인 소프트웨어 프로젝트와는 다르게 하드웨어와 밀접하게 연관되어 있으며, 여러 스레드 및 태스크를 다루는 복잡한 구조를 가집니다. 이러한 복잡성을 관리하기 위해서는 명확한 디렉토리 구조가 필수적입니다. 예를 들어, 다음과 같은 장점을 가질 수 있습니다:

  • 가독성: 소스 코드와 관련 자료가 체계적으로 분리되어 있어 코드의 흐름을 쉽게 이해할 수 있습니다.
  • 유지보수 용이성: 새로운 팀원이 프로젝트에 참여할 때, 명확한 구조 덕분에 빠르게 이해하고 기여할 수 있습니다.
  • 모듈화: 프로젝트의 각 모듈이 독립적으로 관리될 수 있어, 기능 추가나 수정이 용이합니다.

2. 권장 디렉토리 구조

여기서는 RTOS 프로젝트를 위한 기본적인 디렉토리 구조를 제안합니다. 예시로 FreeRTOS를 사용할 경우를 가정하겠습니다.

/RTOS_Project
├── /docs
│   ├── architecture.md
│   ├── api_reference.md
│   └── user_guide.md
├── /src
│   ├── main.c
│   ├── task1.c
│   ├── task2.c
│   └── rtos_config.c
├── /include
│   ├── task1.h
│   ├── task2.h
│   └── rtos_config.h
├── /lib
│   ├── FreeRTOS
│   └── peripheral_drivers
├── /build
├── /tests
│   ├── test_task1.c
│   └── test_task2.c
└── /scripts
├── build.sh
└── flash_firmware.sh

2.1. 각 디렉토리 설명

  • /docs: 프로젝트 관련 문서를 저장하는 디렉토리입니다. 아키텍처 설명서, API 참조 문서, 사용자 가이드를 포함하여 개발자나 사용자가 필요로 하는 자료를 담습니다.

  • /src: 실제 소스 코드가 위치하는 디렉토리입니다. 각 태스크나 기능별로 파일을 나누어 관리합니다. 예를 들어, task1.ctask2.c는 각각의 기능을 구현하는 파일입니다.

  • /include: 헤더 파일을 저장하는 디렉토리입니다. 함수 프로토타입, 데이터 구조 정의 등 다른 소스 코드에서 필요로 하는 정보가 담깁니다.

  • /lib: 외부 라이브러리 및 드라이버를 저장합니다. 예를 들어, FreeRTOS 관련 파일이나 주변 장치 드라이버가 포함될 수 있습니다.

  • /build: 빌드 결과물(예: 바이너리 파일)을 저장하는 디렉토리입니다. 이 공간을 비워두면, 빌드 과정에서 생성된 파일이 프로젝트의 소스와 혼합되지 않도록 합니다.

  • /tests: 테스트 코드가 저장됩니다. 각 기능에 대한 단위 테스트를 작성하여 안정성을 높입니다.

  • /scripts: 빌드 및 플래시 과정 자동화를 위한 스크립트를 저장하는 디렉토리입니다. 예를 들어, build.sh는 프로젝트를 빌드하기 위한 스크립트입니다.

3. 디렉토리 구조 예시 코드

여기서는 간단한 FreeRTOS 태스크를 구현한 예시 코드를 통해 구조를 보여드리겠습니다.

3.1. main.c

#include "FreeRTOS.h"
#include "task.h"
#include "task1.h"
#include "task2.h"

int main(void) {
// RTOS 태스크 생성
xTaskCreate(Task1_Handler, "Task1", 100, NULL, 1, NULL);
xTaskCreate(Task2_Handler, "Task2", 100, NULL, 1, NULL);

// 스케줄러 시작
vTaskStartScheduler();

// 프로그램이 여기까지 오면 에러
for(;;);
return 0;
}

3.2. task1.c

#include "task1.h"
#include "FreeRTOS.h"
#include "task.h"
#include <stdio.h>

void Task1_Handler(void *params) {
while (1) {
printf("Task 1 is running\n");
vTaskDelay(pdMS_TO_TICKS(1000));  // 1초 대기
}
}

3.3. task1.h

#ifndef TASK1_H
#define TASK1_H

void Task1_Handler(void *params);

#endif // TASK1_H

4. 에러 및 해결 방법

프로젝트를 진행하면서 발생할 수 있는 일반적인 에러와 그 해결책을 아래에 정리해보겠습니다.

4.1. 에러: "undefined reference to 'Task1_Handler'"

이 에러는 링커가 Task1_Handler 함수를 찾지 못할 때 발생합니다. 주로 다음과 같은 원인으로 발생할 수 있습니다.

  • task1.c 파일이 빌드에 포함되지 않았을 경우
  • 헤더 파일에 선언된 함수와 구현된 함수가 다를 경우

4.2. 해결 방법

  • Makefile 또는 IDE 설정에서 task1.c가 포함되었는지 확인합니다.
  • 함수 이름이나 시그니처가 일치하는지 확인합니다.

5. 결론

RTOS 프로젝트를 위한 디렉토리 구조를 체계적으로 설정하는 것은 프로젝트 관리에 큰 도움이 됩니다. 위에서 제시한 구조를 기반으로 본인만의 필요에 맞게 조정하면 됩니다. 이런 방법으로 프로젝트를 진행하면 가독성이 높아지고, 협업이 쉬워지며, 유지보수 또한 용이해질 것입니다.

참고문서

728x90
반응형