본문 바로가기

FreeRTOS13

FreeROTS MMU and Cache RTOS에서 MP3를 소프트웨어로 디코딩 하는데 nucleus에서는 잘되는데 FreeRTOS에서는 소리가 끊어지는 현상이 발생하였다. 실제 타이머를 사용하여 측정결과 nucleus는 한 프레임 디코딩 하는데 10 ms 전후로 되는데 FreeRTOS에서는 100 ms 이상 걸렸다. nucleus는 ADS 컴파일러를 사용하였고, FreeRTOS는 GCC를 사용하여 컴파일러 옵션에 문제가 있는 줄 알았는데 알고 보니 cache 설정 문제 였다. FreeRTOS에서는 MMU를 지원 하지 않는다고 하여 따로 캐시 설정를 안하였는데 nucleus의 boot 코드를 보고 mmu 와 cache를 활성화 해 주었더니 정상 동작 하였다. FreeRTOS에서도 MMU와 I/D cache를 사용하면 10배 가까운 속도 향상을.. 2010. 9. 7.
stack overflow FreeRTOS의 태스크 내에서 printf를 사용하는 경우 stack 크기를 512이상 정도 크게 잡아줘야 한다. 그렇지 않으면 stack overflow가 발생하여 메모리의 다른 영역에 덮어 써져 프로그램이 오동작 하는 경우가 발생 할 수 있다. printf의 인자가 없는 경우 _puts_r함수를 사용하지만 인자가 있는 경우 _vfprintf_r이 호출 된다. _puts_r은 스택을 많이 사용하지 않지만 _vfprintf_r은 스택을 많이 사용한다. 2010. 8. 18.
Task Run Time Stats FreeRTOS에서 vTaskGetRunTimeState() 함수를 사용하면 각 태스크들의 점유율을 볼 수 있다. 이 함수를 사용하기 위해서는 FreeRTOSConfig.h에 configGENERATE_RUN_TIME_STATS 값을 1로 정의 해야 하며 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS 함수 와 portGET_RUN_TIME_COUNTER_VALUE 함수를 정의 해 주어야 한다. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS함수는 말 그대로 run time states에 사용할 counter를 설정하고 portGET_RUN_TIME_COUNTER_VALUE는 현재 count값을 리턴하면 된다. counter의 클럭 주파수는 시스템 클럭보다 10.. 2010. 7. 22.
Task List FreeRTOS에서 현재 실행되는 Task들의 정보를 볼 수 있는 방법이 있어 구현 하였다. FreeRTOSConfig.h 파일의 configUSE_TRACE_FACILITY 를 1로 정의 하면 vTaskList라는 함수를 사용 할 수 있다. 다음과 같이 커맨드를 추가 하여 Task정보를 볼수 있도록 하였다. void static sys_cmd_task() { char info[1000]; printf("Name State Pr Stack Num n"); printf("--------------------------------------------"); vTaskList(info); } 다음은 출력 내용이다. State는 Task의 현재 상태를 나타내며, Pr은 우선순위를, Stack은 스택의 나머지를 .. 2010. 7. 21.
startup code C 언어로 개발된 프로그램에서 main 함수는 누가 호출해 줄까요? 보통 컴파일 할 때 자동으로 startup code가 링크되어 프로그램을 실행하면 main함수가 실행 됩니다. 여기서 링크되는 startup code는 라이브러리에 들어 있으며 시스템 마다 다릅니다. 현재 사용하고 있는 yagarto toolchain의 경우 newlib이라는 라이브러리를 사용합니다. 이 startup code에서 main함수를 호출해 줍니다. newlib 라이브러리는 임베이드 시스템용으로 개발된 오픈 소스로 소스를 다운 받아 분석해 볼 수 있습니다. startup code는 어셈블리 언어로 작성되어 있으며 crt0.S라는 이름을 가지고 프로세서 마다 다릅니다. 여기서 crt란 C Runtime이라는 의미 입니다. new.. 2010. 6. 29.
_sbrk_r FreeRTOS의 Heap_2.c를 Heap_3.c로 변경하였다. Heap_3.c는 표준 라이브러리에 있는 malloc과 free를 사용하여 heap영역의 메모리를 할당 받는다. 이 명령이 제대로 동작하려면 _sbrk_r 시스템 콜을 시스템에 맞게 구현해 주어야 한다. malloc을 호출 하여 메모리를 요청하면 라이브러리 내부에서 _sbrk_r를 호출 하여 메모리를 요구하도록 되어 있다. _sbr_r함수는 heap_end 포인터를 가지고 있어 호출 될 때 마다 갱신 되고 heap overflow를 채크 하며 heap 포인터를 리턴 한다. 2010. 6. 24.
printf FreeRTOS와 같은 RTOS에서 UART를 통해 printf와 같은 표준입출력 함수를 사용려면 어떻게 해야 할까? 표준입출력 함수는 보통 툴체인과 함께 제공된다. 코드내에서 stdio.h를 포함 시키고 함수를 사용하면 제공된 라이브러리가 같이 링크되어 라이브러리에 있는 함수가 호출 된다. 하지만 시스템 마다 UART가 다르므로 라이브러리에서는 입출력 시스템 콜을 호출하게 되며 이 시스템 콜 함수는 사용하는 시스템에 맞게 UART 입출력을 구현 해 주어야 한다. 그러므로 사용하는 컴파일러에 따라 시스템 콜 함수가 다르다. 현재 yagarto gcc 툴체인을 사용하여 개발 중인데 yagarto-bu-2.19_gcc-4.22-c-c++_nl-1.16.0_gi-6.8.50_20080408.exe 버전의 경우.. 2010. 6. 9.
HISR FreeRTOS 에서 지원하지 않는 HISR를 구현하였다. HISR은 인터럽트 기법 중 하나로 인터럽트가 발생하면 그 인터럽트에 등록된 HISR 태스크를 활성화 하고 인터럽트 루틴에서 바로 나온다. 활성환된 HISR 태스크는 인터럽트 루틴에서 실행되는게 하니라 하나의 태스크로서 실행된다. 이 때 HISR태스크의 우선순위를 높게 하여 다른 일반 태스크들보다 우선적으로 실행 되도록 한다. 이런 방법을 사용하면 인터럽트 서비스 루틴에 머무르는 시간을 줄여 인터럽트가 중첩되거나 밀리지 않게 할 수 있다. 2010. 6. 4.
Timer FreeRTOS에 구현되어 있지 않은 Timer 구현 하였다. 2010. 5. 27.
Heap 보통 c 에서는 malloc()을 사용하면 Heap영역에 메모리가 할당된다. FreeRTOS의 경우 Heap 할당하는 방법으로 세가지 방법 중 하나를 선택하여 사용 할 수 있으며 malloc, free 함수를 사용하는 대신 pvPortMalloc과 vPortFree를 사용한다. Heap_1.c 배열을 사용하여 heap를 생성하므로 heap이 .bss 영역에 할당 된다. 아주 간단하게 구현된 반면 한번 할당된 메모리는 반환이 되지 않는 단점이 있다. Heap_2.c 역시 배열을 사용하여 heap를 생성한다. 리스트 구조를 사용하여 할당 한 메모리의 반환이 가능하다. Heap_3.c 컴파일러에 링크되는 malloc과 free함수를 호출 한다. 이 방법을 사용하려면 컴파일러에 맞게 heap영역을 설정해 주거나.. 2010. 5. 25.
FreeRTOS Porting E Project ARM9 SoC칩에 기존OS을 들어내고 FreeRTOS를 포팅 중이다. 하드웨어 관련 (software interrupt, uart) 초기화 작업과 FreeRTOS의 테스트 태스크들이 정상 동작하도록 하였다. 2010. 5. 18.
소스 분석 FreeRTOS로 OS를 변경할 E 프로젝트 소스 받아 분석 2010. 5. 11.
ATMEL ARM9 FreeRTOS ATMEL AT91SAM9RL64 를 사용한 개발 보드에 FreeRTOS를 올려 보았다. FreeRTOS Demo 폴더에 ARM9_AT91SAM9XE_IAR 이 있어 이것을 기반으로 수정하여 FreeRTOS 테스트 프로그램의 동작을 확인 하였다. IAR컴파일러가 30일 평가판이라서 30일내에 완료해야 했는데 예상외로 빨리 끝낼 수 있었다. 먼저 AT91SAM9XE를 컴파일 하여 컴파일러가 에러없이 컴파일 된 것을 확인 한 후 폴더을 복사하여 RL에 맞게 디버깅 하였다. 수정 포인트는 다음과 같다. 폴더 복사 from "Demo/ARM9_AT91SAM9XE_IAR" to" Demo/ARM9_AR91SAM9RL_IAR" IAR IDE 설정 파일들 수정 serial.c 수정 USART_Configure에 AT.. 2010. 5. 7.