본문 바로가기

OldStory/WORKS55

Address Already in Use 에러 네트워크 프로그램에서 포트를 제대로 닫지 않은 경우, 다시 프로그램을 시작 하면 다음과 같은 에러가 발생하며 프로그램이 실행되지 않는다. Error on binding: Address already in use 이런 경우 다음을 추가 하면 해결 된다. int tr=1; // kill "Address already in use" error message if (setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&tr,sizeof(int)) == -1) { perror("setsockopt"); exit(1); } 2010. 10. 21.
Linux USB Gadget Driver Embedded linux 보드에 USB는 있는데 이더넷이 없는 경우 USB gadget driver를 사용하면 usb를 이더넷으로 사용할 수 있다. 다음은 Linux USB gadget드라이버를 설치하여 USB를 통해 Window와 네트워크 연결하는 방법에 대한 글이다. http://howto.homelinux.com/wiki/Linux4SAM#USBGadgetDriver.28forusbnetworkdriver.29 보드와 네트워크가 연결되면 ssh client 프로그램을 사용하여 보드에 접속 할 수 있고 파일 전송이 가능하다. 2010. 10. 7.
Linux4SAM http://www.at91.com/linux4sam/bin/view/Linux4SAM 사이트를 참조하여 ATMEL AT91SAM9RL64 보드에 Linux를 올려 보았다. 참조 사이트의 EVB 보드들 중 at91sam9rlek EVB 보드를 기준으로 개발 보드에 맞게 수정 작업을 하였다. 관련 내용은 Linux4SAM wiki 페이지에 정리 하였다. 2010. 9. 30.
Embedded Qt at TW2880 TW2880 HD DVR MUX에 QT화면을 띄우는 방법에 대한 문서를 wiki 에 올렸습니다. TW2880은 Techwell에서 개발한 16채널 DVR용 MUX로 HD 1080p 화면을 지원 합니다. 테스트 결과 MPC8379 에서 HD 1080p 화면에 7~8 프레임 정도 나왔던걸로 기억합니다. http://howto.homelinux.com/wiki/Qt%20Tw2880 2010. 9. 28.
strtok() 문자열에서 특정 단위로, 예를 들자면 개행 단위(n) 라든고, 꼼마 또는 마침표 단위로 문자열을 얻고 싶은 경우가 있다. 이런 경우 strtok()함수를 사용하면 된다. strlok함수는 string.h에 정의 되어 있다. #include #include int main(int argc, char **argv) { char *line = NULL; char *lines = "apple, orangen grape, bananan"; char *s = ".,n"; line = strtok(lines, s); while( line != NULL ) { printf("%sn", line); line = strtok(NULL, s); } } apple orange grape banana 2010. 9. 13.
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.
ATMEL USB 예제 소스 ATMEL 홈피에서 제공하는 USB 예저 소스를 보면서 ATMEL AT91SAM9RL64 USB 를 사용하는 방법을 익히는 중이다. at91sam9rl-ek.zip 를 받아 압축을 풀어 보면 usb-device 관련 예제가 많이 있다. 크게 audio-speaker, cdc-serial, ccid, hid, massstorage 그리고 composite 예제로 분류할 수 있겠다. Audio-speaker Audio-speaker 예제는 USB를 통해 PC 오디오를 ATMEL에서 받아 AC97를 사용하여 출력하는 예제 이다. 컴파일은 되었는데 PC에서 잡히질 않는다. 아무래도 보드가 EV보드가 아니고 오디오쪽 회로가 없어서 그런것 같다. CCID(Chip/Smart Card Interface Devices.. 2010. 7. 8.
VPATH make 를 사용하여 컴파일 할 때 object파일들을 특정 폴더에 생성하도록 하고 싶은 경우 VPATH를 사용하면 쉽게 makefile를 구현 할 수 있다. 예를 들면 src 폴더에는 소스만 inc 풀더는 헤더 파일이 있고 컴파일 된 오브젝트 파일들을 obj 폴더에 넣고 싶은 경우 다음과 같이 makefile를 만들어 주면 된다. CC=arm-none-eabi-gcc OUT_DIR = ./obj SRC_DIR=./src INC_DIR=./inc VPATH = $(SRC_DIR) CFLAGS = -I./inc SRCS=$(wildcard $(SRC_DIR)/*.c ) OBJS=$(patsubst %.c, %.o, $(notdir $(SRCS))) OUT_OBJS = $(patsubst %, $(OUT_D.. 2010. 7. 6.
section GCC 링크 스크립트에서 코드나 데이터의 메모리상의 위치를 section 이름을 사용하여 정의 한다. 어셈블리 코드에서는 section를 이름 뒤에 콜론(:)를 붙여 간단하게 정의 할 수 있다. 그러면 c언어내에서도 section를 정의 할 수 있지 않을까? 다음과 같이 attribute를 사용하여 정의 할 수 있다. __attribute__((__section__(".my_buffer"))) static int MyBuffer[0x10000]; 링크 스크립트를 다음과 같이 작성 했다면 MyBuffer를 sram 메모리에 위치 시킬 수 있다. MEMORY { sram : ORIGIN = 0x300000, LENGTH = 16K sdram : ORIGIN = 0x20000000, LENGTH = 64M }.. 2010. 7. 2.
어셈블러 확장자 GCC에서 어셈블 코드의 파일 확장자는 s이다. 그런데 소문자 s와 대문자 S는 컴파일러에서 다르게 인식한다. 대문자 S파일의 확장자는 어셈블리 하기 전에 C 컴파일러를 거친 후에 어셈블리를 한다. 그러므로 대문자 확장자를 사용하면 소문자 s확장자 파일에서 사용할 수 없는 매크로같은 것 들을 사용 할 수 있다. 2010. 7. 1.
main함수 없이 프로그램 짜기 statup code관련하여 crt0.S를 보면 _start 라는 셋션으로 시작 하는 것를 볼 수 있다. 이를 이용하면 main함수 없이 프로그램을 작성할 수 있다. 다음은 그 예제 소스이다. #include #include _start() { _exit(my_number(7)); } int my_number(int x) { printf("My favorite number is %dn", x); return 1; } 리눅스에서 다음과 같이 컴파일 하고 실행 해 볼 수 있다. $ gcc -nostartfiles test.c $./a.out My favorite number is 7. $ echo $? 1 $ 2010. 6. 30.
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.
최적화 옵션 컴파일 하여 나온 코드 크기가 커서 FLASH에 올라가지 않는 문제가 발생하여 최적화 옵션 -O2을 사용하여 코드 크기를 줄여 실행하였는데 시스템이 죽는 현상이 발생했다. 디버깅하여 원인 분석 결과 최적화 옵션에 의해 watchdog 인터럽트에서 오동작이 발생 하였다. 변수을 volatile을 선언하여 실행 하였더니 정상 동작 한다. GCC Optimization 은 다음 문서를 참조 한다. http://www.linuxjournal.com/article/7269 2010. 6. 8.
HISR FreeRTOS 에서 지원하지 않는 HISR를 구현하였다. HISR은 인터럽트 기법 중 하나로 인터럽트가 발생하면 그 인터럽트에 등록된 HISR 태스크를 활성화 하고 인터럽트 루틴에서 바로 나온다. 활성환된 HISR 태스크는 인터럽트 루틴에서 실행되는게 하니라 하나의 태스크로서 실행된다. 이 때 HISR태스크의 우선순위를 높게 하여 다른 일반 태스크들보다 우선적으로 실행 되도록 한다. 이런 방법을 사용하면 인터럽트 서비스 루틴에 머무르는 시간을 줄여 인터럽트가 중첩되거나 밀리지 않게 할 수 있다. 2010. 6. 4.
Timer Test E Project의 구현한 Timer 기능을 테스트 하였다. 2010. 5. 28.
Timer FreeRTOS에 구현되어 있지 않은 Timer 구현 하였다. 2010. 5. 27.
Queue & Event E Project의 OAL API와 FreeRTOS Queue를 연결하여 queue의 동작을 확인 하였다. FreeRTOS에는 Evnet가 구현 되어 있지 않은데 queue를 사용하여 Event를 구현 하였다. 2010. 5. 26.
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.
Semaphore E Project의 FreeRTOS의 동작 테스트 중이다. 그중 semaphore를 OAL API와 연결하여 정상 동작을 확인 하였다. 2010. 5. 24.