본문 바로가기

혼자서꿍시렁

자작 운영체제 AiRPOS(RT)를 공개합니다.

AiRPOS(RT) OS for embedded system

개념


 오래전 동아리 Study 세미나 진행을 위해 개인적으로 만들었던 간단한 OS 커널을
 공개합니다.
 원래의 이름은(Lestat) 였으나 최근 AiRPOS(RT)로 바꾸었습니다.
이는 PC용(AiRPOS(PC))으로도 포팅을 완료 했으며,
이런저런 드라이버를 추가적으로 구현하고, 끼워 넣어 보느라 공개에 시간이 걸리고 있습니다.
(곧 한다던게 1년이 지났습니다. T^T)
AiRPOS(RT)를 돌려 볼만한 Evaluation Board가 없어 내버려 두던차에 얼마전
ARM Simulator - Skyeye 를 접했고,
그 Simulator 에서 지원하는 s3c4510b based Target 용으로 포팅을 해 보았습니다.


준비물  
 


Windows 용 Skyeye 에서 돌려보기 위해 개발 툴 체인을
Windows 용으로 모두 갖추었었습니다.

AiRPOS(RT) 소스 - (AiRPOS(RT) Embedded version.)
이글은 Windows 환경에서 모든 것을 돌려보기 위한 내용입니다.
(자신의 개발환경에 맞추어 GNU 폴더에 있는 코드를 사용하세요.)

skyeye simulator - (Windows에서 설치, 구동 방법)
ADS 컴파일러 - http://www.arm.com/,
혹은 GNU ARM 등 - GNUARM


내용  
 


 AiRPOS(RT) 는 ADS 환경과 GNUARM Toolchain 두가지 용으로 구현 되어 있습니다.
그중 Windows 환경에서 GNUARM 환경을 구성하고 Skyeye Simulator 에서 구동시켜
보았습니다. 아래는 예제로 만들어진 몇 개의 Task 가 돌아가는 모습입니다.



아래는 Task 선언부의 코드입니다.

start.c 코드
1 
2/*****************************************
3
4    kernel.c for AiRPOS(RT)
5    Lee Gun-woo
6    http://airpage.org/
7    first: 2004-4
8    
9    - 2007-12-26
10    - 2008-1-22 (task added)
11    
12******************************************/ 
13#include "include.h"  
14 
15/* TCB */ 
16static TCB *pTCB_IDLE1 = NULL;  
17static TCB *pTCB_IDLE2 = NULL;  
18 
19/* stack for Task */      
20char idle_stack1[128];  
21char idle_stack2[128];  
22/* stack for Task */      
23char tcbstack1[1024];  
24char tcbstack2[1024];  
25char tcbstack3[1024];  
26 
27/* task */ 
28void idle_task1(void);  
29void idle_task2(void);  
30 
31 
32/* task */ 
33void simple_task1(void);  
34void simple_task2(void);  
35void simple_task3(void);  
36 
37/* TCB */ 
38static TCB *pTCB1 = NULL;  
39static TCB *pTCB2 = NULL;  
40static TCB *pTCB3 = NULL;  
41 
42 
43 
44 
45/* main entry */      
46int main_start(void)  
47{     
48 
49      
50    /* tcb list init. */      
51    TCB_init();   
52    tickInit();  
53    tickStart();  
54 
55    pTCB_IDLE1 = TCB_get(idle_task1, (int *)&idle_stack1[127]);   
56    pTCB_IDLE2 = TCB_get(idle_task2, (int *)&idle_stack2[127]);       
57              
58    pTCB1 = TCB_get(simple_task1, (int *)&tcbstack1[1023]);   
59    pTCB2 = TCB_get(simple_task2, (int *)&tcbstack2[1023]);  
60    pTCB3 = TCB_get(simple_task3, (int *)&tcbstack3[1023]);  
61      
62    uart0_print("**********************\n");  
63    uart0_print("http://airpage.org    \n");  
64    uart0_print("Lee Gun-woo           \n");  
65    uart0_print("**********************\n\n");    
66    uart0_print("AiRPOS start...\n");  
67      
68    Task_sched();             
69    while(1);             
70              
71    return 0;  
72}  
73 
74 
75/* static value */ 
76static int t = 0;  
77 
78extern int p_current_task_context;  
79/* task */ 
80void simple_task1(void)  
81{             
82    char temp[3];  
83 
84    temp[1] = '\n';  
85    temp[2] = NULL;  
86 
87          
88                  
89    while(1)  
90    {     
91 
92        temp[0] = '0' + (char) t;  
93          
94        INT_TESTPRINT((unsigned int) "test simple_task1\n");  
95        INT_WAITSIG(10);          
96        //INT_TESTPRINT((unsigned int) temp);     
97          
98    }     
99}  
100 
101int sum(int a, int b)  
102{  
103 
104    a = a + b;  
105 
106    return a;  
107}  
108 
109 
110int k = 0;  
111 
112/* task */    
113void simple_task2(void)  
114{         
115 
116    while(1)  
117    {                     
118      
119        INT_TESTPRINT((unsigned int) "test simple_task2\n");  
120        INT_WAITSIG(5);   
121        //uart0_print("test simple_task2\n");  
122        sum(k, 5);        
123    }         
124}  
125 
126 
127:  
128:  
129 
130 
view plain | print | copy to clipboard | ?
INT_TESTPRINT 와 INT_WAITSIG 는 소프트웨어 인터럽트를 사용하여 구현하였습니다. INT_TESTPRINT 는 UART 로 스트링을 출력하며, INT_WAITSIG 는 지정된 Tick 동안 Delay 되거나 무한정 Wait 됩니다. task id (handle) 로 Signal 이 오면, 해제 됩니다. *. ADS 컴파일러는 C구문에서 swi 키워드가 사용가능하나 GNU - C, CPP 에선 지원되지 않습니다. 그래서 inline assembler를 사용했습니다. include.h 와 swi.c
1 
2/* for GNUARM 2007.12.26 */ 
3#define swi_call(x) asm volatile("swi\t"#x ::: "r0", "r1", "r2", "r3")  
4:  
5:  
6 
7/* for GNUARM 2007.12.26 */ 
8int callService(unsigned int svc, int param)  
9{                 
10          
11    swi_call(0x80);  
12                  
13    return svc;  
14}  
15 
16void callSync(int no)  
17{                     
18        swi_call(0x37);   
19}  
20      
view plain | print | copy to clipboard | ?
S3C4510b 는 ARM7TDMI Core 를 사용하는 삼성에서 나온 Microcontroller 입니다. 어떤 계기로 인해 50100 보드를 손댈 기회가 있었는데, 그때의 스펙과 유사하고 친근해서 S3C4510b를 선택했습니다.^^' 위에서 출력되는 내용들은 UART로 출력시 보여지는 것들입니다. S3C4510b에 대한 정보는 아래 참고자료의 S3C4510b 데이터 시트 링크를 참고 하세요. 지금 부터는 Windows 에서 AiRPOS를 컴파일 하고, 구동하는 여러 방법중 하나를 설명드리겠습니다. 먼저, WINARM을 다운로드 받습니다. Windows NT/2K/XP 사용자는 WinARM 을 C:\WinARM 에 설치하였을 경우, 내컴퓨터->속성->고급 탭->환경변수 에 진입 한 후, Path 경로에 아래 그림처럼 C:\WinARM\bin;C:\WinARM\utils\bin 문장을 넣습니다. Vista 사용자는 아래 처럼 입력하라는 군요.^^ C:\WinARM\libexec\gcc\arm-elf\4.1.1;C:\WinARM\bin;C:\WinARM\arm-elf\bin;C:\WinARM\utils\bin 이후, 콘솔창을 열어(시작->실행->cmd 엔터) 아래와 같이 WinARM 의 경로가 맞는지 확인합니다. AiRPOS(RT) 의 소스 트리에서 GNU 폴더에 들어가 아래와 같이 make 를 입력하여 빌드 합니다. 이로써, AiRPOS(RT) 의 빌드는 완료되었습니다. 이제, 동작 모습을 확인하기 위해 skyeye 를 실행해야 합니다. 이에 앞서 skyeye 는 cyg-win 혹은 mingw 환경을 필요로 합니다.(물론 Windows에서요...^^) Mingw 혹은 cyg-win 을 설치합니다. (여기서는 언급하지 않습니다.^^) http://gro.clinux.org/frs/?group_id=327&release_id=808의 경로에서 skyeye on Windows 항목에 있는 Windows 버전의 skyeye 를 내려받아 적절한 경로에 압축을 풉니다. 그리고, Mingw 혹은 cyg-win 환경을 수행한 후, skyeye 가 있는 경로로 진입합니다. skyeye 경로에 들어가 skyeye.sh 를 실행합니다. 그러면, skyeye.sh 는 아래 그림처럼 수행할 ELF 이미지가 있는 경로를 묻습니다. 아래 그림처럼 airpos 파일을 선택합니다. skyeye 는 선택된 이미지가 있는 경로에서 MPU의 종류와 환경을 설명해줄 skyeye.conf 파일을 자동으로 찾아 환경을 설정합니다. S3C4510b based target 을 위한 skyeye.conf 내용은 아래와 같습니다. airpos 이미지가 선택되면 콘솔화면에서 수행을 기다리는 프롬프트가 나타납니다. "run" 을 입력하면 아래와 같이 AiRPOS(RT) 의 기본 TASK 들이 도는 모습을 확인 하실 수 있습니다.

ETC


	기타 질문/답변 : [ PROJECT -> 질문/답변 게시판 ]
	참고 자료 : 
	- S3C4510b datasheet
	- VC에서 운영체제 만들기 가이드
	- VC에서 운영체제 만들기 가이드 - II (AiRPOS PC)	
	- 디스크 부팅 이미지 만들기 가이드
	- PC 보호모드로 포팅된 uCOS-II 에 인터럽트 추가 예제

	참고 사이트 :
	- 기타 관련사이트는 PROJECT -> OS PAGE에 연결된 링크를 참조하시기 바랍니다.
	


기타
 

        
 Study 회원들의 교육 목적으로 정말~ 간단하게 만들어진 코드입니다.
추가/개선할 곳도 많으며, 버그가 있을지도 모릅니다.
발견하신 분들은 질문/답변 게시판에 많은 신고 부탁드립니다.^^
그리고 같이 개선하고자 하시는 분들의 글도 기다리겠습니다.
	
	2008/01/26,13:35:36
	이건우

이글은 저의 홈
http://airpage.org/ 에 원본이 있습니다.