<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > uCOS-II的移植步驟

uCOS-II的移植步驟

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
說(shuō)明:將V2.92移植到STM32F107ZET6和STM32F107VCT6.

關(guān)于uCOS的移植,其實(shí)要說(shuō)難也難,要說(shuō)簡(jiǎn)單也簡(jiǎn)單。簡(jiǎn)單的是現在官方都已經(jīng)移植好了,難的是自己寫(xiě)那個(gè)匯編的移植代碼。廢話(huà)不多說(shuō),直接上移植步驟和注意事項。

本文引用地址:http://dyxdggzs.com/article/201611/322487.htm

第一步:到官網(wǎng)下載最新版本的uCOS-II V2.92,在uCOS-II的文件夾下有三個(gè)這樣的文件主要有這兩個(gè)移植的文件,在DOC文件夾下主要是移植的說(shuō)明和性能的測試結果,

其中uCOS-II-RefMan和uCOS-II-CfgMan比較有參考價(jià)值,第一個(gè)文件對每個(gè)函數進(jìn)行了說(shuō)明,重要的是給出了大部分函數的應用實(shí)例。第二個(gè)就是我們移植好后的配置文件了。還有一個(gè)重要的文件就是很重要的文件就是AN-1018,這個(gè)是官方的移植說(shuō)明(針對的Cortex-M3處理器)。

第二步:Source文件夾下面都是源代碼,不用管他們,Ports文件夾下面就是我們移植的時(shí)候需要弄的文件了,有以下幾個(gè)文件,

os_cpu.h,os_cpu_c.c,os_cpu_a.asm這三個(gè)文件在移植過(guò)程中最重要。

os_cpu.h:定義數據類(lèi)型,處理器相關(guān)代碼和聲明函數原型。

#ifndef OS_CPU_H
#define OS_CPU_H

#ifdef OS_CPU_GLOBALS
#define OS_CPU_EXT
#else
#define OS_CPU_EXT extern
#endif

#ifndef OS_CPU_EXCEPT_STK_SIZE
#define OS_CPU_EXCEPT_STK_SIZE 128u//默認的異常堆棧大小
#endif

typedef unsigned char BOOLEAN;//數據類(lèi)型的說(shuō)明
typedef unsigned char INT8U;

typedef signed char INT8S;

typedef unsigned short INT16U;

typedef signed short INT16S;

typedef unsigned int INT32U;

typedef signed int INT32S;

typedef float FP32;

typedef double FP64;

typedef unsigned int OS_STK;

typedef unsigned int OS_CPU_SR;

臨界代碼

和其它內核一樣,μC/OS-Ⅱ為了處理臨界段代碼需要關(guān)中斷,處理完畢后再開(kāi)中斷。這使得μC/OS-Ⅱ能夠避免同時(shí)有其它任務(wù)或中斷服務(wù)進(jìn)入臨界段代碼。關(guān)中斷的時(shí)間是實(shí)時(shí)內核開(kāi)發(fā)商應提供的最重要的指標之一,因為這個(gè)指標影響用戶(hù)系統對實(shí)時(shí)事件的響應性。μC/OS-Ⅱ努力使關(guān)中斷時(shí)間降至最短,但就使用μC/OS-Ⅱ而言,關(guān)中斷的時(shí)間很大程度上取決于微處理器的架構以及編譯器所生成的代碼質(zhì)量。

μC/OS-Ⅱ中的這兩個(gè)宏調用分別是:OS_ENTER_CRITICAL()和 OS_EXIT_CRI TICAL()。因為這兩個(gè)宏的定義取決于所用的微處理器,故在文件 OS_CPU.H 中可以找到相應宏定義。每種微處理器都有自己的os_cpu.h,

#define OS_CRITICAL_METHOD 3u//臨界代碼的處理方法,有3種,一般都選三

#if OS_CRITICAL_METHOD == 3u
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}//進(jìn)入臨界代碼
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}//推出臨界代碼
#endif

開(kāi)關(guān)中斷的具體實(shí)現,在os_cpu_a.asm文件中,下面會(huì )講到。

#define OS_STK_GROWTH 1u//中斷的生長(cháng)方向,從高地址到低地址

#define OS_TASK_SW() OSCtxSw() //用戶(hù)級的任務(wù)切換。

//申明外部函數定義的申一個(gè)額外的異常堆??臻g,

OS_CPU_EXT OS_STK OS_CPU_ExceptStk[OS_CPU_EXCEPT_STK_SIZE];
OS_CPU_EXT OS_STK *OS_CPU_ExceptStkBase;

void OSCtxSw(void);//用戶(hù)任務(wù)的任務(wù)切換
void OSIntCtxSw(void);//中斷任務(wù)的任務(wù)切換
void OSStartHighRdy(void);//在操作系統第一次啟動(dòng)的時(shí)候調用的任務(wù)切換

void OS_CPU_PendSVHandler(void);//用戶(hù)任務(wù)和中斷任務(wù)的在可懸起系統調用中斷里面實(shí)現任務(wù)的切換。
void OS_CPU_SysTickHandler(void);//這個(gè)函數是時(shí)鐘節拍中斷函數。
void OS_CPU_SysTickInit(INT32U cnts);//這個(gè)是滴答定時(shí)器的初始化,

第三步:OS_CPU_C.C

這個(gè)文件里面有9個(gè)鉤子函數和一個(gè)堆棧初始化函數。

鉤子函數:鉤子函數說(shuō)白就是為了擴展函數的功能。別的沒(méi)什么,用得到就往里面加入自己設計的代碼,不需要就不用設置。

堆棧的初始化函數需要根據不同的處理器進(jìn)行設置。關(guān)于堆棧函數的處理首先要明白幾點(diǎn),

  • xPSR, PC, LR, R12, R0-R3 這幾個(gè)寄存器在中斷的時(shí)候實(shí)現自動(dòng)的保存
  • 剩下的幾個(gè)寄存器需要手動(dòng)保存。
  • uCOS-II初始化的時(shí),是如何在任務(wù)切換的時(shí)候,實(shí)現將變量存入到自己的任務(wù)堆棧里面
  • 關(guān)鍵就在每個(gè)任務(wù)初始化堆棧的時(shí)候,將堆棧指針R13指向相應的任務(wù)地址,這樣初始化以后進(jìn)行任務(wù)切換的時(shí)候,就能將變量存入好自己的任務(wù)堆棧。

*(stk) = (INT32U)0x01000000uL;
*(--stk) = (INT32U)task;
*(--stk) = (INT32U)OS_TaskReturn;
*(--stk) = (INT32U)0x12121212uL;
*(--stk) = (INT32U)0x03030303uL;
*(--stk) = (INT32U)0x02020202uL;
*(--stk) = (INT32U)0x01010101uL;
*(--stk) = (INT32U)p_arg;

*(--stk) = (INT32U)0x11111111uL;
*(--stk) = (INT32U)0x10101010uL;
*(--stk) = (INT32U)0x09090909uL;
*(--stk) = (INT32U)0x08080808uL;
*(--stk) = (INT32U)0x07070707uL;
*(--stk) = (INT32U)0x06060606uL;
*(--stk) = (INT32U)0x05050505uL;
*(--stk) = (INT32U)0x04040404uL;

return (stk); //返回任務(wù)的棧頂

第四步:是移植中最重要的部分,也就是匯編底層函數的編寫(xiě)。

主要有一下這幾個(gè)函數

(一)開(kāi)中斷和關(guān)中斷函數的實(shí)現。

OS_CPU_SR_Save ;用于實(shí)現關(guān)中斷的匯編指令
MRS R0, PRIMASK ;讀取PRIMASK到R0,R0是返回值
CPSID I ;PRIMASK=1,關(guān)中斷(NMI和硬fault可以響應)
BX LR

OS_CPU_SR_Restore ;用于實(shí)現開(kāi)中斷的匯編指令
MSR PRIMASK, R0 ;讀取R0到PRIMASK中,R0為參數
BX LR


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

關(guān)鍵詞: uCOS-II移植步

評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>