μC/OS-II在ARM平臺上移植的深入探討
4 S3C2410啟動代碼和μC/OS-II的融合
本文1.1節(jié)已經(jīng)介紹過,S3C2410的啟動代碼開始部分是匯編語言的初始化過程,然后跳轉(zhuǎn)到main()函數(shù)。融合的工作就從改造S3C2410的main()函數(shù)和μC/OS-II的main()函數(shù)(在test.c中)開始。在S3C2410的main()函數(shù)中,保留原啟動代碼中關于端口、內(nèi)存、外部設備初始化代碼,刪去跳轉(zhuǎn)到Linux操作系統(tǒng)的代碼;在μC/OS-II的test.c文件的main()函數(shù)中,刪去一切與X86內(nèi)核有關的初始化代碼和輸入輸出函數(shù)代碼(因為這部分代碼在S3C2410的啟動代碼中已經(jīng)實現(xiàn)),并將與 μC/OS-II內(nèi)核有關的3個函數(shù)OSInit()、OSTaskCreate(…)、OSStart()復制到S3C2410的main()函數(shù)中,同時刪去μC/OS-II的test.c文件。融合后的main()函數(shù)主要代碼如下:
ChangeClockDivider(1, 1); //1:2:4
ChangeMPllValue(161,3,1); //FCLK=203.0 MHz
SetClockDivider(1, 1);
SetSysFclk(FCLK_203M);
Port_Init();
Isr_Init();
Uart_Init(0, 115200);
Uart_Select(0);
MMU_Init(); //MMU 初始化
EnableModuleClock(CLOCK_ALL);
rMISCCR = ~(0x3007);
OSInit();
OSTaskCreate(TaskStart,……, 0);
OSStart();
至此,處理器已執(zhí)行完S3C2410的啟動代碼,并開始執(zhí)行μC/OS-II內(nèi)核代碼。當然,要實現(xiàn)多任務,處理器的中斷必須是打開的。這個工作在OSStart ()函數(shù)中完成,在執(zhí)行OSStartHighRdy之前,要按照系統(tǒng)的需求完成處理器的中斷初始化工作,同時打開中斷。至此,融合工作基本完成,剩下的工作就是按照系統(tǒng)的需求在μC/OS-II的TaskStart(…)函數(shù)中自由添加實際工作所需的任務了。
在本文所述系統(tǒng)中,在μC/OS-II所帶3個系統(tǒng)任務的基礎上添加了3個任務Task1、Task2和Task3,方法是在OSStatInit( )之前添加OSTaskCreate(Task1,…)等代碼,然后按下述格式和自己的需求編寫Task1、Task2和Task3函數(shù)。代碼為:
void Task1(void *data)
{
while(1) { ;任務代碼 }
}
因篇幅所限,無法詳述在融合過程中遇到的所有問題,尤其是在ADSv1.2環(huán)境下編譯、調(diào)試過程出現(xiàn)的語法問題和各種細節(jié)問題。
隨著科技的發(fā)展和實際任務復雜性的逐步增加,傳統(tǒng)的單片機前后臺編程模式漸漸不能滿足實際應用的要求。在嵌入式應用開發(fā)中使用嵌入式操作系統(tǒng)已經(jīng)成為一種趨勢,本文在S3C2410開發(fā)板上將原有的引導程序和μC/OS-II操作系統(tǒng)結合在一起,開發(fā)出能自引導的μC/OS-II操作系統(tǒng),該系統(tǒng)除了3個系統(tǒng)任務外,還自帶3個實際任務,在ADSV1.2環(huán)境下編譯、調(diào)試,并在板卡上成功運行,對μC/OS-II在ARM平臺上的移植有一定借鑒意義。
參考文獻
[1] 任哲,潘樹林,房紅征,編著.嵌入式操作系統(tǒng)基礎 μC/OS-II和Linux[M].北京:北京航空航天大學出版社,
2007.
[2] 韓山,郭云,付海艷,編著.ARM微處理器應用開發(fā)技術詳解與實例分析[M].北京:清華大學出版社,2007:284-286.
[3] 蔣維. 基于ARM S3C2410嵌入式系統(tǒng)的Bootloader分析與設計[J].電子工程師,2008(10).本文引用地址:http://2s4d.com/article/151716.htm
tcp/ip相關文章:tcp/ip是什么
評論