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

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

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

1  開發工具和運行環境

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

2  移植中所需修改的文件

和CPU相關的文件主要有三個,分別是匯編文件OS_CPU_A.ASM、C語言文件 OS_CPU_C.C和頭文件OS_CPU.H。

2.1  OS_CPU.H文件

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

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

2.2  OS_CPU_A.ASM文件

編譯器將每個文件作為一個模塊,編譯模塊以主名命名,稱為編譯模塊名,用NAME 來聲明。因此,應在文件頭部聲明NAME OS_CPU_A。

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

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

由于C8051F的堆棧指針只有8位,只能指向內部數據區的256個字節,因此,當前運行的任務的堆棧在IDATA區,堆棧大小為40H(64字節),堆棧起點由KEIL決定。通過標號可以獲得KEIL分配的SP起點,代碼如下:
?STACK SEGMENT IDATA
RSEG ?STACK
OSStack:
DS 40H
OSStkStart IDATA OSStack-1

為簡化子程序特定義壓棧出棧宏。壓棧的次序為PSW、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

具體函數的修改部分見本刊網絡補充版(http://www.dpj.com.cn)。

2.3  OS_CPU_C.C文件

移植μC/OS-II 需要在OS_CPU_C.C中定義六個函數,而實際上需要定義的只有OSTaskStkInit()一個函數。該函數用來初始化任務的堆棧。初始狀態的堆棧只須初始化?C_XBP (仿真堆棧指針)、任務地址及堆棧的長度。由于只有INC DPTR指令,故返回棧的最低地址,且最低地址處存放棧的長度,方便用匯編語言實現任務的切換。堆的大小可根據任務的實際情況自行確定,由參數 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  可重入函數

因為51系列堆?臻g的限制, KEIL編譯器沒有像大系統那樣使用調用堆棧。一般C語言調用過程中,會把過程的參數和使用的局部變量入棧。為了提高效率,編譯器沒有提供這種堆棧,而是提供一種壓縮棧,每個過程被給定一個空間用于存放局部變量。過程中的每個變量都放在這個空間的固定位置,當遞歸調用這個過程時,會導致變量被覆蓋。編譯器允許將函數定義成可重入函數,由reentrant關鍵字指定,可重入函數可被單獨保存。因為這些堆棧是模擬的,可重入函數一般都比較大,運行起來也比較慢。模擬棧不允許傳遞bit類型的變量,也不能定義局部位標量。移植中最好是將可能被多個任務使用的函數定義成可重入函數。

參考文獻

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

作 者:華中科技大學 江平新 容太平  
來 源:單片機與嵌入式系統應用 2003(9)
本文地址:http://m.qingdxww.cn/thread-9378-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 安靜高效的電機控制——這才是正確的方向!
  • 無線充電基礎知識及應用培訓教程3
  • 5分鐘詳解定時器/計數器E和波形擴展!
  • 為何選擇集成電平轉換?
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 热久久视久久精品18国产 | 欧美久草视频 | 黄视频网址 | 国产在线观看一区二区三区四区 | 日本久久道一区二区三区 | 在线日韩麻豆一区 | 欧美一区二区三区在线可观看 | 欠操h| 精品国产国产综合精品 | 日韩欧美精品一区二区三区 | 四虎网站最新地址 | 国内精品久久久久久久久久影视 | 国产精品视频免费视频 | 黄色大片久久 | 91九色在线播放 | 成人ww| 亚洲国产成人久久精品app | 久久香蕉国产线看观看99 | 在线欧美成人 | 午夜无码国产理论在线 | 中文岛国精品亚洲一区 | 免费网站色 | 干干操| 亚洲性xx| 日本免费网站 | 成人黄色一级毛片 | 国产精品第一区在线观看 | 91蜜桃视频 | 亚洲欧美国产精品第1页 | 五月天福利 | 天堂新版资源中文最新版下载地址 | 日本在线视频二区 | 国产成人亚洲精品91专区手机 | 中文字幕第15页 | 国产日韩欧美在线一区二区三区 | 欧美在线香蕉在线现视频 | 国产一区二区三区国产精品 | 久久精品久久久久 | 日日操操操 | 成人欧美精品一区二区不卡 | 国产精品不卡在线 |