|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
一步一步移植ucosii(for 51,V2.52版本) |
| 作者:gwnpeter 欄目:單片機(jī) |
移植ucosii并不是一件很復(fù)雜的事情,主要是需要了解操作系統(tǒng)的工作原理,歸根結(jié)底就是堆寨的處理和任務(wù)的切換,《嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II(第二版)》上有對(duì)移植很關(guān)鍵的解析,Keil目錄下的A51.pdf C51.pdf也會(huì)對(duì)移植提供非常有效的信息。另外,建議使用的察看/編輯軟件是Source Insight,沒(méi)有Source Insight得支持我簡(jiǎn)直不知道如何把ucos Lwip等程序看完。以下是修改的部分: 1.將所有文件中的與C51編譯器沖突的關(guān)鍵詞pdata替換為ppdata 2.修改OS_CPU.H文件, a. OS_CPU.H文件中添加了以下語(yǔ)句 #ifdef __C51__ #define OS_REENTRANT reentrant #else #define OS_REENTRANT #endif b. 修改數(shù)據(jù)類(lèi)型 //詳見(jiàn)C51.PDF第176頁(yè) typedef unsigned CHAR BOOLEAN; //結(jié)構(gòu)體里無(wú)法使用bit類(lèi)型 typedef unsigned CHAR INT8U; //無(wú)符號(hào)8位數(shù) typedef signed CHAR INT8S; //有符號(hào)8位數(shù) typedef unsigned int INT16U; //無(wú)符號(hào)16位數(shù) typedef signed int INT16S; //有符號(hào)16位數(shù) typedef unsigned LONG.html">LONG INT32U; //無(wú)符號(hào)32位數(shù) typedef signed LONG.html">LONG INT32S; //有符號(hào)32位數(shù) typedef float FP32; //單精度浮點(diǎn)數(shù) typedef double FP64; //雙精度浮點(diǎn)數(shù) typedef unsigned CHAR OS_STK; //棧單元寬度為8比特 typedef unsigned CHAR OS_CPU_SR; #define BYTE INT8S //兼容以前版本的數(shù)據(jù)類(lèi)型 #define UBYTE INT8U //uC/OS-II可以不用這些數(shù)據(jù)類(lèi)型 #define WORD INT16S #define UWORD INT16U #define LONG INT32S #define ULONG INT32U c. 修改中斷宏定義,以及堆寨方向 #define OS_CRITICAL_METHOD 1 #if OS_CRITICAL_METHOD == 1 #define OS_ENTER_CRITICAL() EA=0 //關(guān)中斷 #define OS_EXIT_CRITICAL() EA=1 //開(kāi)中斷 #endif #define OS_STK_GROWTH 0 //MCU-51堆棧從下往上增長(zhǎng) 1=向下,0=向上 3.除函數(shù)OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickInit(),OSTickISR(),以外其他函數(shù)均使用OS_REENTRANT定義為可重入函數(shù).另外函數(shù)OSTaskStkInit(),OSTaskCreate(),OSTaskCreateExt(),傳遞的參數(shù)中含有函數(shù)指針,必須定義為可重入函數(shù)的函數(shù)指針. 例如修改之前的OSTaskStkInit()函數(shù)是, OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt); 修改之后的OSTaskStkInit()函數(shù)是, OS_STK *OSTaskStkInit (void (*task)(void *pd) OS_REENTRANT, void *ppdata, OS_STK *ptos, INT16U opt) OS_REENTRANT; 4.因?yàn)樽兞縊STCBCur,OSTCBHighRdy,OSRunning,OSPrioCur,OSPrioHighRdy比較常用,所以定義為idata空間,因而在匯編程序中調(diào)用的時(shí)候需要使用相應(yīng)的調(diào)用方式。 5.必須在StartUp.a51文件中做好Reentrant Stack(可重入函數(shù)堆寨)的初始化工作.否則工作不正常. XBPSTACK EQU 1 ; set to 1 if large reentrant is used. 6.編寫(xiě)函數(shù)OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickInit(),OSTickISR(),OSTaskStkInit(),需要根據(jù)《嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II(第二版)》提供的思想進(jìn)行,具體的解析在我的程序中有說(shuō)明。 7.定時(shí)器的開(kāi)啟理論上必須放在第一個(gè)進(jìn)程,但是因?yàn)槭状稳种袛嗟拈_(kāi)啟是在OSStartHighRdy()函數(shù)中的,實(shí)際上定時(shí)器是否開(kāi)啟并 |
| 2樓: | >>參與討論 |
| 作者: 12864 于 2005/1/20 17:53:00 發(fā)布:
強(qiáng)! 頂一下。 |
|
| 3樓: | >>參與討論 |
| 作者: yangtse 于 2005/1/21 13:11:00 發(fā)布:
頂 |
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |