国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

μC/OS-II在C8051F上的移植

發(fā)布時(shí)間:2010-3-14 23:02    發(fā)布者:蹦蹦
關(guān)鍵詞: 移植
嵌入式應(yīng)用中,使用RTOS的最主要原因是提高系統(tǒng)的可靠性,其次是提高開發(fā)效率、縮短開發(fā)周期。μC/OS-II 是一個(gè)基于優(yōu)先級(jí)的搶占式實(shí)時(shí)內(nèi)核,支持56 個(gè)用戶任務(wù),90%的代碼使用標(biāo)準(zhǔn)的ANSI C語(yǔ)言書寫,程序可讀性強(qiáng),移植性好,代碼可固化,可裁剪,非常靈活。C8051F是美國(guó)Cygnal公司生產(chǎn)的與51系列兼容的微控制器,流水線指令結(jié)構(gòu)70%的指令的執(zhí)行時(shí)間為1個(gè)或2個(gè)系統(tǒng)時(shí)鐘周期。當(dāng)時(shí)鐘頻率為25MHz時(shí),速度可達(dá)25MIPS,是一款不錯(cuò)的片上系統(tǒng)。

1  開發(fā)工具和運(yùn)行環(huán)境

實(shí)現(xiàn)μC/OS-II的移植,要求所用的C編譯器支持混合編程。KEIL C51可為眾多的8051派生器件編程。我們選用的是KEIL7.02集成開發(fā)環(huán)境,仿真板基于C8051F015芯片。

2  移植中所需修改的文件

和CPU相關(guān)的文件主要有三個(gè),分別是匯編文件OS_CPU_A.ASM、C語(yǔ)言文件 OS_CPU_C.C和頭文件OS_CPU.H。

2.1  OS_CPU.H文件

OS_CPU.H文件中定義了數(shù)據(jù)類型及與硬件相關(guān)的基本信息。其中改動(dòng)部分如下:
typedef unsigned char OS_STK; /* 堆棧的寬度為8位 */
OS_CPU_EXT INT8U IE_SHADOW;
#define OS_ENTER_CRITICAL() IE_SHADOW = IE; IE &= 0x7F /* 關(guān)中斷 */
#define OS_EXIT_CRITICAL() IE = IE_SHADOW /* 恢復(fù)中斷 */
#define OS_STK_GROWTH 0
#define OS_TASK_SW() OSCtxSw()

在C8051F中,堆棧都是按字節(jié)操作的,故數(shù)據(jù)類型OS_STK聲明為8位。方向從低地址向高地址方向遞增,所以O(shè)S_STK_GROWTH設(shè)置為 0。μC/OS-II在進(jìn)入系統(tǒng)臨界代碼區(qū)之前要關(guān)中斷,等到退出臨界區(qū)后再打開,以保護(hù)核心數(shù)據(jù)不被多任務(wù)環(huán)境下的其它任務(wù)或中斷破壞。開、關(guān)中斷可通過(guò)設(shè)置SFR中的中斷屏蔽位實(shí)現(xiàn)。在關(guān)中斷時(shí),先將IE的內(nèi)容保存在全局變量IE_ SHADOW中,然后關(guān)中斷;退出臨界區(qū)時(shí),還原IE_SHADOW的值。OS_TASK_SW()用來(lái)實(shí)現(xiàn)任務(wù)切換。就緒任務(wù)的堆棧初始化應(yīng)該模擬一次中斷發(fā)生后的樣子,堆棧中應(yīng)該按入棧次序設(shè)置好各個(gè)寄存器。OS_TASK_SW()函數(shù)模擬一次中斷過(guò)程,在中斷返回的時(shí)候進(jìn)行任務(wù)切換。由于 C8051F015沒(méi)有軟中斷,故直接定義宏OS_TASK_SW()為函數(shù)OSCtxSw()。

2.2  OS_CPU_A.ASM文件

編譯器將每個(gè)文件作為一個(gè)模塊,編譯模塊以主名命名,稱為編譯模塊名,用NAME 來(lái)聲明。因此,應(yīng)在文件頭部聲明NAME OS_CPU_A。

函數(shù)有程序部分和局部變量部分,它們分別放在獨(dú)立的段中。在大模式下,段名聲明的固定格式為 ?PR?函數(shù)名?模塊名 SEGMENT CODE。因此需要將OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()用上面的格式一一聲明。如?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE,本模塊實(shí)現(xiàn)的函數(shù)需要用PUBLIC聲明,如PUBLIC OSStartHighRdy等。

C51將所有定義說(shuō)明的數(shù)據(jù)標(biāo)識(shí)符轉(zhuǎn)換為大寫字符,對(duì)函數(shù)則根據(jù)有無(wú)寄存器參數(shù)傳送和函數(shù)是否可重入進(jìn)行換名,如:void OSIntEnter(void) reentrant函數(shù)的名字OSIntEnter換成_?OSIntEnter。這些規(guī)則可從編譯后的LST文件中看出。程序中聲明引用的五個(gè)全局變量為OSTCBCur、OSTCBHighRdy、OSRunning、OSPrioCur、OSPrioHighRdy,聲明格式是EXTRN IDATA (OSTCBCur)等。調(diào)用四個(gè)外部子程序OSTaskSwHook()、OSIntEnter()、OSIntExit()、 OSTimeTick(),固定格式為:EXTRN CODE (_?OSTaskSwHook)等。

由于C8051F的堆棧指針只有8位,只能指向內(nèi)部數(shù)據(jù)區(qū)的256個(gè)字節(jié),因此,當(dāng)前運(yùn)行的任務(wù)的堆棧在IDATA區(qū),堆棧大小為40H(64字節(jié)),堆棧起點(diǎn)由KEIL決定。通過(guò)標(biāo)號(hào)可以獲得KEIL分配的SP起點(diǎn),代碼如下:
?STACK SEGMENT IDATA
RSEG ?STACK
OSStack:
DS 40H
OSStkStart IDATA OSStack-1

為簡(jiǎn)化子程序特定義壓棧出棧宏。壓棧的次序?yàn)镻SW、ACC、B、DPL、DPH、R0~R7,出棧的次序與入棧相反。
PUSHALL MACRO
  IRP REG, <SW,ACC, B, DPL, DPH, 0, 1, 2, 3, 4, 5, 6, 7>
  PUSH REG
  ENDM
POPALL MACRO
  IRP REG, <7, 6, 5, 4, 3, 2, 1, 0, DPH, DPL, B, ACC, PSW>
  POP REG
  ENDM

具體函數(shù)的修改部分見本刊網(wǎng)絡(luò)補(bǔ)充版(http://www.dpj.com.cn)。

2.3  OS_CPU_C.C文件

移植μC/OS-II 需要在OS_CPU_C.C中定義六個(gè)函數(shù),而實(shí)際上需要定義的只有OSTaskStkInit()一個(gè)函數(shù)。該函數(shù)用來(lái)初始化任務(wù)的堆棧。初始狀態(tài)的堆棧只須初始化?C_XBP (仿真堆棧指針)、任務(wù)地址及堆棧的長(zhǎng)度。由于只有INC DPTR指令,故返回棧的最低地址,且最低地址處存放棧的長(zhǎng)度,方便用匯編語(yǔ)言實(shí)現(xiàn)任務(wù)的切換。堆的大小可根據(jù)任務(wù)的實(shí)際情況自行確定,由參數(shù) ppdata所指的值確定。

void *OSTaskStkInit (void (*task)(void *pd), void *ppdata,
  void *ptos, INT16U opt) reentrant
{
  OS_STK *stk;
  INT8U HeapSize;
  HeapSize=*(INT8U *)ppdata;
  opt = opt;
  stk = (OS_STK *)ptos+HeapSize+2;
  *stk++ = 15;
  *stk++ = (INT16U)task & 0xFF;
  *stk++ = (INT16U)task >> 8;
  stk = (OS_STK *)ptos+HeapSize+2;
  *--stk = (INT16U) (ptos+HeapSize-1) >> 8;
  *--stk = (INT16U) (ptos+HeapSize-1) & 0xFF;
  return ((void *)stk);
}

3  可重入函數(shù)

因?yàn)?1系列堆棧空間的限制, KEIL編譯器沒(méi)有像大系統(tǒng)那樣使用調(diào)用堆棧。一般C語(yǔ)言調(diào)用過(guò)程中,會(huì)把過(guò)程的參數(shù)和使用的局部變量入棧。為了提高效率,編譯器沒(méi)有提供這種堆棧,而是提供一種壓縮棧,每個(gè)過(guò)程被給定一個(gè)空間用于存放局部變量。過(guò)程中的每個(gè)變量都放在這個(gè)空間的固定位置,當(dāng)遞歸調(diào)用這個(gè)過(guò)程時(shí),會(huì)導(dǎo)致變量被覆蓋。編譯器允許將函數(shù)定義成可重入函數(shù),由reentrant關(guān)鍵字指定,可重入函數(shù)可被單獨(dú)保存。因?yàn)檫@些堆棧是模擬的,可重入函數(shù)一般都比較大,運(yùn)行起來(lái)也比較慢。模擬棧不允許傳遞bit類型的變量,也不能定義局部位標(biāo)量。移植中最好是將可能被多個(gè)任務(wù)使用的函數(shù)定義成可重入函數(shù)。

參考文獻(xiàn)

1  Labrosse Jean J. μC/OS-II源碼公開的實(shí)時(shí)嵌入式操作系統(tǒng). 邵貝貝譯. 北京:中國(guó)電力出版社, 2001
2  www.ucos-ii.com;www.xhl.com.cn;www.laogu.com

作 者:華中科技大學(xué) 江平新 容太平  
來(lái) 源:單片機(jī)與嵌入式系統(tǒng)應(yīng)用 2003(9)
本文地址:http://www.qingdxww.cn/thread-9378-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點(diǎn)宏來(lái)節(jié)省時(shí)間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項(xiàng)目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進(jìn)行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 五月天亚洲婷婷 | 亚洲一级黄色片 | 色丁香在线观看 | 在线免费观看精品 | 欧美视频一区二区三区精品 | 综合影院 | 国产资源视频 | 免费高清精品国偷自产在线 | 久草综合在线 | 亚洲男人的天堂成人 | 国产精品亚洲国产三区 | 亚洲欧洲一区二区 | 99re视频在线观看 | 国产自产第一区c国产 | 久久夫妻| 成人午夜黄色 | va视频在线| 午夜视频免费看 | 2021av在线视频| 四虎国产永久在线观看 | 成人午夜在线 | 日本aⅴ在线 | 国产精品久久精品福利网站 | 五月四房婷婷 | 欧美视频第一区 | 天堂网2021 | 日韩精品永久免费播放平台 | 四虎影视在线观看 | 麻豆蜜桃传媒在线观看 | 国产专区在线 | 2019天天干天天操 | aaaaaa精品视频在线观看 | 三级网站国产 | 朋友的妻子免费观看 | 亚洲不卡一区二区三区在线 | 中国一级毛片特级毛片 | 国产成人高清亚洲一区久久 | 毛片在线播放视频 | 久久三级网站 | 一区二区三区欧美视频 | 青青热 |