新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > μC/OS-II在ARM平臺(tái)上移植的深入探討

μC/OS-II在ARM平臺(tái)上移植的深入探討

作者: 時(shí)間:2010-07-26 來(lái)源:網(wǎng)絡(luò) 收藏
因?yàn)镾3C2410在進(jìn)入ISR模式后,自動(dòng)屏蔽ISR中斷,所以粗存在中斷嵌套,可以表明2個(gè)全部變量ISR_LR和ISR_SPSR用于保存ISR中斷發(fā)生之時(shí)處理器的lr和spsr寄存器。其代碼的特別之處在于,在ISR中斷處理過(guò)程中通過(guò)修改lr寄存器,而使處理器在退出ISR模式時(shí)能根據(jù)任務(wù)的需要返回至ISR中斷發(fā)生之處或者代碼指定地點(diǎn)。在代碼指定地點(diǎn),可以保存上次中斷發(fā)生時(shí)被中斷任務(wù)的處理器的所有寄存器數(shù)據(jù)。這里需要注意一點(diǎn),當(dāng)處理器退出ISR模式時(shí)跳轉(zhuǎn)到Saveregister處開(kāi)始執(zhí)行命令,需要提前將Saveregister處的地址加上4,然后賦值給lr寄存器。因?yàn)樵贗SR退出時(shí),需要將lr減去4再賦值給程序計(jì)數(shù)器pc。
4 S3C2410啟動(dòng)代碼和μ的融合
 本文1.1節(jié)已經(jīng)介紹過(guò),S3C2410的啟動(dòng)代碼開(kāi)始部分是匯編語(yǔ)言的初始化過(guò)程,然后跳轉(zhuǎn)到main()函數(shù)。融合的工作就從改造S3C2410的main()函數(shù)和μ的main()函數(shù)(在test.c中)開(kāi)始。在S3C2410的main()函數(shù)中,保留原啟動(dòng)代碼中關(guān)于端口、內(nèi)存、外部設(shè)備初始化代碼,刪去跳轉(zhuǎn)到Linux操作系統(tǒng)的代碼;在μ的test.c文件的main()函數(shù)中,刪去一切與X86內(nèi)核有關(guān)的初始化代碼和輸入輸出函數(shù)代碼(因?yàn)檫@部分代碼在S3C2410的啟動(dòng)代碼中已經(jīng)實(shí)現(xiàn)),并將與 μC/OS-II內(nèi)核有關(guān)的3個(gè)函數(shù)OSInit()、OSTaskCreate(…)、OSStart()復(fù)制到S3C2410的main()函數(shù)中,同時(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的啟動(dòng)代碼,并開(kāi)始執(zhí)行μC/OS-II內(nèi)核代碼。當(dāng)然,要實(shí)現(xiàn)多任務(wù),處理器的中斷必須是打開(kāi)的。這個(gè)工作在OSStart ()函數(shù)中完成,在執(zhí)行OSStartHighRdy之前,要按照系統(tǒng)的需求完成處理器的中斷初始化工作,同時(shí)打開(kāi)中斷。至此,融合工作基本完成,剩下的工作就是按照系統(tǒng)的需求在μC/OS-II的TaskStart(…)函數(shù)中自由添加實(shí)際工作所需的任務(wù)了。
在本文所述系統(tǒng)中,在μC/OS-II所帶3個(gè)系統(tǒng)任務(wù)的基礎(chǔ)上添加了3個(gè)任務(wù)Task1、Task2和Task3,方法是在OSStatInit( )之前添加OSTaskCreate(Task1,…)等代碼,然后按下述格式和自己的需求編寫(xiě)Task1、Task2和Task3函數(shù)。代碼為:
void Task1(void *data)
  {
   while(1) { ;任務(wù)代碼 }
  }
因篇幅所限,無(wú)法詳述在融合過(guò)程中遇到的所有問(wèn)題,尤其是在ADSv1.2環(huán)境下編譯、調(diào)試過(guò)程出現(xiàn)的語(yǔ)法問(wèn)題和各種細(xì)節(jié)問(wèn)題。
隨著科技的發(fā)展和實(shí)際任務(wù)復(fù)雜性的逐步增加,傳統(tǒng)的單片機(jī)前后臺(tái)編程模式漸漸不能滿(mǎn)足實(shí)際應(yīng)用的要求。在嵌入式應(yīng)用開(kāi)發(fā)中使用嵌入式操作系統(tǒng)已經(jīng)成為一種趨勢(shì),本文在S3C2410開(kāi)發(fā)板上將原有的引導(dǎo)程序和μC/OS-II操作系統(tǒng)結(jié)合在一起,開(kāi)發(fā)出能自引導(dǎo)的μC/OS-II操作系統(tǒng),該系統(tǒng)除了3個(gè)系統(tǒng)任務(wù)外,還自帶3個(gè)實(shí)際任務(wù),在ADSV1.2環(huán)境下編譯、調(diào)試,并在板卡上成功運(yùn)行,對(duì)μC/OS-II在上的有一定借鑒意義。
參考文獻(xiàn)
[1] 任哲,潘樹(shù)林,房紅征,編著.嵌入式操作系統(tǒng)基礎(chǔ) μC/OS-II和Linux[M].北京:北京航空航天大學(xué)出版社,
2007.
[2] 韓山,郭云,付海艷,編著.微處理器應(yīng)用開(kāi)發(fā)技術(shù)詳解與實(shí)例分析[M].北京:清華大學(xué)出版社,2007:284-286.
[3] 蔣維. 基于 S3C2410嵌入式系統(tǒng)的Bootloader分析與設(shè)計(jì)[J].電子工程師,2008(10).

本文引用地址:http://m.butianyuan.cn/article/151716.htm

tcp/ip相關(guān)文章:tcp/ip是什么



上一頁(yè) 1 2 3 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉