Small RTOS(51) 110v 使用手冊_第1頁
Small RTOS(51) 110v 使用手冊_第2頁
Small RTOS(51) 110v 使用手冊_第3頁
Small RTOS(51) 110v 使用手冊_第4頁
Small RTOS(51) 110v 使用手冊_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Small RTOS(51) 1.10v 使用手冊概述:Small RTOS是一個源代碼公開的多任務(wù)實時操作系統(tǒng),Small RTOS 51是其在8051系列處理器上的移植(使用keil c51)。Small RTOS可以簡化那些復(fù)雜而且時間要求嚴(yán)格的工程的軟件設(shè)計工作.本手冊主要講述Small RTOS的使用,本說明了在8051系列處理器上使用應(yīng)該注意的問題。同時講述了Small RTOS的移植。Small RTOS的特點:(1)公開源代碼,只要遵循許可協(xié)議,任何人可以免費獲得源代碼。(2)可移植,作者盡量使用把與CPU相關(guān)部分壓縮到最小,與CPU無關(guān)部分用ANSIC編寫。(3)可固化,Sm

2、all RTOS為嵌入系統(tǒng)設(shè)計,如果您有固化手段,它可以嵌入到您的產(chǎn)品中成為產(chǎn)品的一部分。(4)占先式,Small RTOS可以管理16個任務(wù),每個任務(wù)優(yōu)先級不同。(5)中斷管理,中斷可以使正在執(zhí)行的任務(wù)掛起。如果優(yōu)先級更高的任務(wù)被中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行。中斷嵌套層數(shù)可達255層。如果需要,可以禁止中斷嵌套管理。(6)RAM需求小,Small RTOS為小RAM系統(tǒng)設(shè)計,應(yīng)而RAM需求小,相應(yīng)的,系統(tǒng)服務(wù)也少。Small RTOS的使用:(1)系統(tǒng)配置:os_cfg.h中定義了一些常量可以配置系統(tǒng),具體定義如下:#define OS_MAX_TASKS/* 最大

3、任務(wù)數(shù)116 */#define OS_TICKS_PER_SEC /* 設(shè)置1秒系統(tǒng)系統(tǒng)節(jié)拍數(shù)*/#define USER_TICK_TIMER_EN /* 禁止(0)或允許(1)系統(tǒng)定時中斷調(diào)用用戶函數(shù)UserTickTimer()*/#define EN_OS_INT_ENTER /* 禁止(0)或允許(1)中斷嵌套管理 */#define EN_TIMER_SHARING /* 禁止(0)或允許(1)定時器中斷調(diào)用OSTimeTick() */#define TICK_TIMER_SHARING /* 定義進入多少次硬件中斷為一次系統(tǒng)定時器軟中斷*/#define EN_OS_Q /*

4、 禁止(0)或允許(1)消息隊列*/#define EN_OS_Q_CHK /* 禁止(0)或允許(1)校驗消息隊列指針 */#define OS_Q_MEM_SELxdata /* 消息隊列存儲空間選擇,keil c51有用,必須為idata、xdata */*不是keil c51時它必須為空格 */#define EN_OS_Q_PENT1 /* 禁止(0)或允許(1)等待隊列中的消息 */#define EN_OS_Q_ACCEPT0 /* 禁止(0)或允許(1)無等待的從隊列中取得消息 */#define EN_OS_Q_POST0 /* 禁止(0)或允許(1)FIFO方式相對列發(fā)送消

5、息 */#define EN_OS_Q_POST_FRONT1 /* 禁止(0)或允許(1)LIFO方式相對列發(fā)送消息 */#define EN_OS_Q_INT_POST0 /* 禁止(0)或允許(1)中斷中FIFO方式相對列發(fā)送消息 */#define EN_OS_Q_INT_POST_FRONT1 /* 禁止(0)或允許(1)中斷中LIFO方式相對列發(fā)送消息 */#define EN_OS_Q_NMsgs 1 /* 禁止(0)或允許(1)取得隊列中消息數(shù) */#define EN_OS_Q_SIZE0 /* 禁止(0)或允許(1)取得隊列總?cè)萘?*/#define EN_OS_Q_FLU

6、SH 0 /* 禁止(0)或允許(1)清空隊列 */#define EN_OS_SEM 0 /* 禁止(0)或允許(1)信號量 */#define EN_OS_SEM_CHK 0 /* 禁止(0)或允許(1)校驗信號量索引 */#define OS_SEM_MEM_SELidata /* 信號量儲空間選擇,keil c51有用,必須為idata、xdata */* 不是keil c51時它必須為空格 */#define OS_MAX_SEMS 2 /* 最大信號量數(shù)目 */#define EN_OS_SEM_PENT1 /* 禁止(0)或允許(1)等待信號量 */#define EN_OS_S

7、EM_ACCEPT0 /* 禁止(0)或允許(1)無等待請求信號量 */#define EN_OS_SEM_INT_POST0 /* 禁止(0)或允許(1)中斷中發(fā)送信號量 */#define EN_OS_SEM_POST1 /* 禁止(0)或允許(1)中發(fā)送信號量 */#define EN_OS_SEM_QUERY 0 /* 禁止(0)或允許(1)查詢信號量 */#define idata /* 非keil c51時必須加止這一句 */#if EN_TIMER_SHARING = 0#define TIME_ISR_TASK_ID SHOW_TASK_ID /* 定義系統(tǒng)定時器軟中斷觸發(fā)的任

8、務(wù)ID */#endifOs_cpu.h中定義了一些常量可以配置一些與cpu相關(guān)的部分。針對Small RTOS 51,具體定義如下:#define EN_SP20 /* 禁止(0)或允許(1)非屏蔽中斷 */#defineIDATA_RAM_SIZE0x100/* idata大小*/#defineSp2Space 4 /* 高級中斷(軟非屏蔽中斷)堆棧大小 EN_SP2為0時無效 */#define OS_TIME_ISR 1 /* 系統(tǒng)定時器使用的中斷 */SET_EA MACRO;打開所有允許中斷 SETB EA ENDM(2)與編譯器無關(guān)的數(shù)據(jù)類型為了便于移植,Small RTOS定義

9、了6種數(shù)據(jù)類型,它在Os_cpu.h定義。針對Small RTOS 51,具體定義如下:typedef unsigned charuint8; /* 定義可移植的無符號8位整數(shù)關(guān)鍵字*/typedef signed charint8;/* 定義可移植的有符號8位整數(shù)關(guān)鍵字*/typedef unsigned int uint16;/* 定義可移植的無符號16位整數(shù)關(guān)鍵字 */typedef signed int int16; /* 定義可移植的有符號16位整數(shù)關(guān)鍵字 */typedef unsigned longuint32;/* 定義可移植的無符號32位整數(shù)關(guān)鍵字 */typedef sig

10、ned longint32; /* 定義可移植的有符號32位整數(shù)關(guān)鍵字 */(3)運行Small RTOS在main函數(shù)中調(diào)用OSStart()后系統(tǒng)開始運行,OSStart()結(jié)束后運行優(yōu)先級為0的任務(wù)。注意:在調(diào)用OSStart()前不要使能總中斷標(biāo)志,系統(tǒng)會自動使能這個標(biāo)志,對于8051系列,這個標(biāo)志為EA。(4)建立任務(wù):Small RTOS使用靜態(tài)方法建立任務(wù),在config.h中有這樣一段代碼: #ifdef IN_OS_CPU_C extern void TaskA(void); extern void TaskB(void); extern void TaskC(void);

11、void(* const TaskFuctionOS_MAX_TASKS)(void)=TaskA,TaskB,TaskC; /函數(shù)數(shù)組TaskFuction保存了各個任務(wù)初始PC指針,其按任務(wù)ID(既優(yōu)先級次序)順序保存 #endif用戶只要定義好OS_MAX_TASKS,TaskFuction,任務(wù)將自動運行。其中TaskA等為任務(wù)對應(yīng)函數(shù)。注意:ID為0的任務(wù)為最高優(yōu)先級任務(wù),系統(tǒng)運行后首先執(zhí)行它。(5)刪除任務(wù),Small RTOS 1.10版不允許刪除任務(wù),因此,每個任務(wù)必須為無限循環(huán)結(jié)構(gòu)。(6)任務(wù)睡眠,任務(wù)可以調(diào)用OSWait()使自己睡眠,其原型如下:unsigned char

12、 OSWait(uint8 typ, uint8 ticks);功能描述: 系統(tǒng)等待函數(shù),任務(wù)調(diào)用此函數(shù)可以等待一定時間或信號輸入: typ: 等待事件類型,目前可以取以下值,或是其中任意個值的按位或K_SIG: 等待信號K_TMO: 等待超時ticks : 等待超時時的系統(tǒng)節(jié)拍數(shù),輸出 : NOT_OK : 參數(shù)錯誤TMO_EVENT : 超時到SIG_EVENT : 有信號如果任務(wù)等待信號,另一個任務(wù)可以調(diào)用OSSendSignal()使其進入就緒狀態(tài),其原型如下:void OSSendSignal(uint8 TaskId);功能描述: 中斷中給指定任務(wù)發(fā)送信號,既使指定任務(wù)就緒輸入:

13、TaskId : 任務(wù)ID輸出: 無中斷調(diào)用OSIntSendSignal()也可以喚醒睡眠任務(wù),其原型如下:void OSIntSendSignal(uint8 TaskId);功能描述: 任務(wù)中給指定任務(wù)發(fā)送信號,既使指定任務(wù)就緒輸入: TaskId : 任務(wù)ID輸出: 無用戶調(diào)用OSQPend和OSSemPend時也可能使任務(wù)睡眠,可參見相應(yīng)章節(jié)。(7)優(yōu)先級最低的任務(wù)優(yōu)先級最低的任務(wù)必須一直處于就緒狀態(tài),不允許調(diào)用OSWait等可能使自己進入休眠狀態(tài)的函授。(8)消息隊列和信號量Small RTOS使用簡化的消息隊列,實質(zhì)上出隊入隊的均為uint8類型變量,而不是指針。消息隊列和信號量

14、的使用請參見示例及SmallRTOS的系統(tǒng)調(diào)用。(9)Small RTOS 51 任務(wù)特殊處由于keil c51由于keil c51默認(rèn)不支持重入函數(shù),它的重入函數(shù)使用仿真的重入棧而不使用系統(tǒng)棧,而Small RTOS 51沒有進行重入棧管理,因此,用戶應(yīng)該保證各個任務(wù)的局部變量不會互相覆蓋(方法后面有介紹),并且不定義重入函數(shù)。(10)中斷程序編制keil c51 例子如下:#if EN_OS_INT_ENTER 0#pragma disable/* 除非最高優(yōu)先級中斷或是不需要系統(tǒng)管理的中斷,否則,必須加上這一句*/#endifvoid OSTickISR(void) interrupt

15、USER_ISR#if EN_OS_INT_ENTER 0OS_INT_ENTER();/* 中斷開始處理*/#endif/*用戶代碼在這*/OSIntExit(); /* 中斷結(jié)束處理,*/在其它CPU中,#pragma disable不是必須的,但是可能需要自己在OS_INT_ENTER()之前保存任務(wù)環(huán)境。如果某個中斷不需要OS管理,則可以只有編寫。Small RTOS的系統(tǒng)調(diào)用:(1)OSVersion()宏,返回Small RTOS版本號*100(2)OSRunningTaskID()宏,返回當(dāng)前正在運行的任務(wù)ID(3)OSWait()原型:uint8 OSWait(uint8 ty

16、p, uint8 ticks);功能描述: 系統(tǒng)等待函數(shù),任務(wù)調(diào)用此函數(shù)可以等待一定時間或信號輸入: typ: 等待事件類型,目前可以取以下值,或是其中任意個值的按位或,K_SIG: 等待信號,K_TMO: 等待超時,ticks : 等待超時時的系統(tǒng)嘀嗒數(shù);輸出 : NOT_OK : 參數(shù)錯誤;TMO_EVENT : 超時到;SIG_EVENT : 有信號全局變量: OSWaitTick調(diào)用模塊: OSIntSendSignal(4)OSSendSignal()原型:void OSSendSignal(uint8 TaskId)功能描述: 任務(wù)中給指定任務(wù)發(fā)送信號,既使指定任務(wù)就緒輸入: Ta

17、skId : 任務(wù)ID輸出: 無全局變量: OSTaskRuning調(diào)用模塊: OSSched(5)OSIntSendSignal()原型:void OSIntSendSignal (uint8 TaskId);功能描述: 中斷中給指定任務(wù)發(fā)送信號,既使指定任務(wù)就緒輸入: TaskId : 任務(wù)ID輸出: 無全局變量: OSTaskRuning調(diào)用模塊: 無(6)OSQCreate()原型:uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf);功能描述: 初始化消息隊列輸入: Buf:為隊列分配的存儲空間地址SizeOfBuf:為隊

18、列分配的存儲空間大小輸出: NOT_OK:參數(shù)錯誤OS_Q_OK:成功全局變量: 無調(diào)用模塊: 無(7)OSQPend()原型:uint8 OSQPend(uint8 idata *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick);功能描述: 等待消息隊列中的消息輸入: Ret:返回的消息Buf:指向隊列的指針Tick:等待時間輸出: NOT_OK:參數(shù)錯誤OS_Q_OK:收到消息OS_Q_TMO:超時到OS_Q_NOT_OK:無消息全局變量: 無調(diào)用模塊: OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRIT

19、ICAL,OS_EXIT_CRITICAL(8)OSQAccept()原型:uint8 uint8 OSQAccept(uint8 idata *Ret, uint8 OS_Q_MEM_SEL *Buf);功能描述: 無等待從消息隊列中取得消息輸入: Ret:返回的消息Buf:指向隊列的指針輸出: NOT_OK:參數(shù)錯誤OS_Q_OK:收到消息OS_Q_TMO:超時到OS_Q_NOT_OK:無消息全局變量: 無調(diào)用模塊: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(8)OSQIntPost()原型:uint8 OSQIntP

20、ost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data);功能描述: 中斷中FIFO方式發(fā)送消息輸入: Buf:指向隊列的指針Data:消息數(shù)據(jù)輸出: OS_Q_FULL:隊列滿OS_Q_OK:發(fā)送成功全局變量: 無調(diào)用模塊: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(9)OSQIntPostFront()原型:uint8 OSQIntPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data);功能描述: 中斷中LIFO方式發(fā)送消息輸入: Buf:指向隊列的指針Data:消息數(shù)

21、據(jù)輸出: OS_Q_FULL:隊列滿OS_Q_OK:發(fā)送成功全局變量: 無調(diào)用模塊: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(10)OSQPost()原型:uint8 OSQPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data);功能描述: FIFO方式發(fā)送消息輸入: Buf:指向隊列的指針Data:消息數(shù)據(jù)輸出: OS_Q_FULL:隊列滿OS_Q_OK:發(fā)送成功全局變量: 無調(diào)用模塊: OSQIntPost,OSSched(11)OSQPostFront()原型:uint8 OSQPostFront(

22、uint8 OS_Q_MEM_SEL *Buf, uint8 Data);功能描述: LIFO方式發(fā)送消息輸入: Buf:指向隊列的指針Data:消息數(shù)據(jù)輸出: OS_Q_FULL:隊列滿OS_Q_OK:發(fā)送成功全局變量: 無調(diào)用模塊: OSQIntPostFront,OSSched(12)OSQNMsgs()原型:uint8 OSQNMsgs(uint8 OS_Q_MEM_SEL *Buf);功能描述: 取得消息隊列中消息數(shù)輸入: Buf:指向隊列的指針輸出: 消息數(shù)全局變量: 無調(diào)用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(13)OSQSize()原型:

23、uint8 OSQSize(uint8 OS_Q_MEM_SEL *Buf);功能描述: 取得消息隊列總?cè)萘枯斎? Buf:指向隊列的指針輸出: 消息隊列總?cè)萘咳肿兞? 無調(diào)用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(14)OSQFlush()原型:void OSQFlush (uint8 OS_Q_MEM_SEL *Buf);功能描述: 清空隊列輸入: Buf:指向隊列的指針輸出: 無全局變量: 無調(diào)用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(15)OSSemCreate()原型:uint8 OSSemCreate(u

24、int8 index,uint8 Data);功能描述: 初始化消息隊列輸入: index:信號量索引data:信號量初始值輸出: NOT_OK:沒有這個信號量OS_SEM_OK:成功全局變量: 無調(diào)用模塊: 無(16)OSSemPend()原型:uint8 OSSemPend(uint8 index, uint8 Tick);功能描述: 等待一個信號量輸入: index:信號量索引Tick:等待時間輸出: NOT_OK:參數(shù)錯誤OS_SEM_OK:得到信號量OS_SEM_TMO:超時到OS_SEM_NOT_OK:沒有得到信號量全局變量: 無調(diào)用模塊: OSRunningTaskID,OSCl

25、earSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(17)OSSemAccept()原型:uint8 OSSemAccept(uint8 index);功能描述: 無等待請求信號量輸入: index:信號量索引輸出: NOT_OK:參數(shù)錯誤OS_SEM_OK:得到信號量OS_SEM_TMO:超時到OS_SEM_NOT_OK:沒有得到信號量全局變量: 無調(diào)用模塊: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(18)OSSemIntPost()原型:uint8 OSSemIn

26、tPost(uint8 index);功能描述: 中斷中發(fā)送一個信號量輸入: index:信號量索引輸出: NOT_OK:參數(shù)錯誤OS_SEM_OK:發(fā)送成功全局變量: 無調(diào)用模塊: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL(19)OSSemPost()原型:uint8 OSSemPost(uint8 index);功能描述: 發(fā)送一個信號量輸入: index:信號量索引輸出: NOT_OK:參數(shù)錯誤OS_SEM_OK:發(fā)送成功全局變量: 無調(diào)用模塊: OSSemIntPost,OSSched(20)OSSemQuery()原型:ui

27、nt8 OSSemQuery(uint8 index);功能描述: 查詢信號量輸入: index:信號量索引輸出: 信號量的值全局變量: 無調(diào)用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICALSmall RTOS的數(shù)據(jù)結(jié)構(gòu):(1)OSTaskRuning 定義: #if OS_MAX_TASKS 0 uint8 OSIntNesting; #endif OSIntNesting存儲中斷嵌套層數(shù)。(4)OSTaskID 定義: uint8 OSTaskID; OSTaskID存儲當(dāng)前運行任務(wù)的ID。(5)OSNextTaskID 定義: uint8 OSNextTas

28、kID; OSNextTaskID用于標(biāo)明將要運行的任務(wù)的ID(6)Os_Enter_Sum 定義: uint8 Os_Enter_Sum=0; Os_Enter_Sum是OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()使用的 信號量。(7)消息隊列數(shù)據(jù)結(jié)構(gòu) 定義(用戶程序中): uint8 OS_Q_MEM_SEL SerialDatan; 任務(wù)數(shù)小于9個時: Buf0:隊列中字節(jié)數(shù), Buf1:Buf總長度 Buf2:出對端, Buf3:等待隊列任務(wù)列表 Buf4Bufn-1:存儲消息 任務(wù)數(shù)大于8個時: Buf0:隊列中字節(jié)數(shù), Buf1:Buf總長度 Buf

29、2:出對端, Buf3、Buf4:等待隊列任務(wù)列表 Buf5Bufn-1:存儲消息(8)信號量數(shù)據(jù)結(jié)構(gòu) 定義: #if OS_MAX_TASKS 9 uint8 OS_SEM_MEM_SEL OsSemBufOS_MAX_SEMS*2; #else uint8 OS_SEM_MEM_SEL OsSemBufOS_MAX_SEMS*3; #endif 任務(wù)數(shù)小于9個時(index為0(OS_MAX_SEMS-1): OsSemBufindex * 2:信號量的值 OsSemBufindex * 2 + 1:等待信號量的任務(wù)列表 任務(wù)數(shù)小于9個時(index為0(OS_MAX_SEMS-1): O

30、sSemBufindex * 3:信號量的值 OsSemBufindex * 3 + 1、OsSemBufindex * 3 + 2:等待信號量 的任務(wù)列表Small RTOS 51的特殊的數(shù)據(jù)結(jié)構(gòu):(1)OSFastSwap 定義: #if OS_MAX_TASKS 1static unsigned char TickSum=0;#endif禁止中斷;保存任務(wù)環(huán)境;#if TICK_TIMER_SHARING 1TickSum = (TickSum + 1) % TICK_TIMER_SHARING;if (TickSum != 0)允許中斷;恢復(fù)任務(wù)環(huán)境;return;#endif#if

31、EN_OS_INT_ENTER 0OS_INT_ENTER(); /* 中斷開始處理 */#endif允許中斷;#if USER_TICK_TIMER_EN = 1UserTickTimer();/* 用戶函數(shù) */#endif#if EN_TIMER_SHARING 0OSTimeTick(); /* 調(diào)用系統(tǒng)時鐘處理函數(shù) */#elseOSIntSendSignal(TIME_ISR_TASK_ID);#endifOSIntExit();/* 中斷結(jié)束處理 */其中有一些CPU的禁止中斷和保存任務(wù)環(huán)境由CPU自動處理或是自動處理一部分。OS_TASK_SW()最終調(diào)用的函數(shù)或中斷:非中斷中

32、任務(wù)切換函數(shù)定義如下:void OS_TASK_SW(void)保存任務(wù)環(huán)境;堆??臻g變換;堆棧指針指向新的堆棧;OSTaskID = OSNextTaskID;恢復(fù)任務(wù)環(huán)境;恢復(fù)程序指針;Small RTOS 51(for keil)的特殊說明:目標(biāo)系統(tǒng)需求Small RTOS 51可以在沒有任何外部數(shù)據(jù)存儲器的單片8051系統(tǒng)上運行但應(yīng)用程序仍然可以訪問外部存儲器。Small RTOS 51可以使用C51支持的全部存儲器模塊,選擇記憶模型僅影響應(yīng)用目標(biāo)的位置。一般來說Small RTOS 51應(yīng)用程序工作在小模式下。Small RTOS 51沒有按照bank switching 程序設(shè)計,

33、不能使用code banking程序。可重入功能不允許從幾個任務(wù)或中斷過程調(diào)用非可再入C語言函數(shù)。非可再入C51函數(shù)將它們的參數(shù)和自動變量局部數(shù)據(jù)保存在靜態(tài)存儲器內(nèi)因此當(dāng)重復(fù)調(diào)用函數(shù)時這些數(shù)據(jù)會被改寫。非可再入C語言函數(shù)不可第歸調(diào)用,不可被多個任務(wù)同時調(diào)用,不可被一個或多個任務(wù)與一個或多個中斷同時調(diào)用。Small RTOS 51系統(tǒng)函數(shù)不會調(diào)用任何這樣的函數(shù)。那些僅使用寄存器作為參變量和自動變量的C語言函數(shù)總是可再入的而且可以從不同的Small RTOS 51任務(wù)中沒有任何限制的調(diào)用。C51編譯程序也提供可重入功能,參看“ C51 用戶手冊”以便獲得更多信息??稍偃牒瘮?shù)將他們的參變量和局部數(shù)據(jù)

34、變量儲存到一個可再入堆棧內(nèi)并且數(shù)據(jù)是被保護的以預(yù)防多重呼叫。然而如果你在你的應(yīng)用程序中使用可再入函數(shù)你必須保證這些功能不呼叫任何Small RTOS 51系統(tǒng)函數(shù)。而且那些可再入函數(shù)不會被Small RTOS 51任務(wù)調(diào)度所中斷。特別注意一點,可再入堆棧不得放在內(nèi)部RAM中。C51庫函數(shù)全部的可再入 C51 庫函數(shù)可以沒有任何限制的用于全部任務(wù)。非可再入c51庫函數(shù)與非可再入C語言函數(shù)在應(yīng)用時有著同樣的限制。多數(shù)據(jù)指針和數(shù)學(xué)單元的用法c51 編譯程序允許你使用8051派生類型的多數(shù)據(jù)指針和數(shù)學(xué)單元。因為Small RTOS 51不包括任何對這些硬件的管理,最好你不要與SmallRTOS 51

35、一起使用這些器件。如果你可以保證在使用這些派生硬件的程序執(zhí)行期間不會被任務(wù)調(diào)度中斷的話你可以使用多數(shù)據(jù)指針和數(shù)學(xué)單元。寄存器段Small RTOS 51分配全部任務(wù)到寄存器段0。因此全部的任務(wù)函數(shù)必須用c51的默認(rèn)設(shè)置registerbank 0 編譯。不需要Small RTOS 51管理的中斷函數(shù)可以使用剩余的寄存器段。局部變量keil c51采用變量覆蓋的方法分配局部變量,而不是把局部變量分配到堆棧中,當(dāng)在keil c51使用Small RTOS時,編譯系統(tǒng)會把各個任務(wù)的局部變量分配在同一塊內(nèi)存,造成程序運行錯誤。因此,最多只能允一個任務(wù)函數(shù)與?CO?OS_CPU_C進行覆蓋分析,禁止任務(wù)函數(shù)與?CO?OS_CPU_C進行覆蓋分析的方法如下:在Progect-BL51 Misc-Overlay里填?CO?

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論