国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
RTOS51
信號(hào)量
Rtos51的信號(hào)量是一個(gè)數(shù)組,第一個(gè)字節(jié)存放信號(hào)的計(jì)數(shù),第二個(gè)字節(jié)存放等待此信號(hào)的任務(wù)標(biāo)志(如果大于9個(gè)使用2個(gè)字節(jié),1是等待,2是不等待)。
函數(shù)
OSSemPend(uint8 index, uint8 tick)
是等待一個(gè)信號(hào)量,先把此任務(wù)對(duì)應(yīng)的等待信號(hào)標(biāo)志置成1(這一點(diǎn)有點(diǎn)不理解,完全可以直接判斷當(dāng)前信號(hào)量是否大于1,如果是的話直接得到信號(hào)不就行了),然后保存此信號(hào)量的索引到堆棧(這一點(diǎn)沒(méi)有切身的體會(huì),所以不特別的肯定,老覺(jué)得蹦來(lái)蹦去的有點(diǎn)亂,需要深入了解,暫時(shí)擱置),清除此任務(wù)的就緒標(biāo)志(OSClearSignal(uing8 taskID)),切換任務(wù),返回時(shí)把sp出棧,檢查等待時(shí)間是否到,不到的話一直執(zhí)行上面的操作,當(dāng)任務(wù)返回時(shí),清除等待標(biāo)志(必需的,因?yàn)橹皇窃诎l(fā)送信號(hào)量時(shí)清除此標(biāo)志,如果是因?yàn)槌瑫r(shí)或原來(lái)就有信號(hào)量的話,等待標(biāo)志就不會(huì)被清除,就會(huì)出錯(cuò))檢查信號(hào)量的大小,如果大于1說(shuō)明是收到信號(hào)執(zhí)行的,否則是因?yàn)槌瑫r(shí)執(zhí)行的。
因?yàn)楹芏嗟胤蕉颊{(diào)用了OSScheld()函數(shù),所以他一定是可重入函數(shù)。
函數(shù)OSSemIntPost(uint8 index)
給制定的信號(hào)量發(fā)信號(hào),首先把信號(hào)計(jì)數(shù)加1,然后按照優(yōu)先級(jí)從高到底(bit 0 to bit 7)依次檢查此信號(hào)量的等待列表,當(dāng)檢查到有任務(wù)等待時(shí),清除此等待標(biāo)志,并向此任務(wù)發(fā)送就緒標(biāo)志(OSSendSignal(uint8 taskID))。
函數(shù)uint8 OSSemPost(uint8 index)
此函數(shù)調(diào)用OSSemIntPost()然后切換任務(wù)。
消息隊(duì)列
發(fā)現(xiàn)一個(gè)問(wèn)題,可能昨天試驗(yàn)信號(hào)量的時(shí)候就有只是沒(méi)有發(fā)現(xiàn),就是在建立一個(gè)消息隊(duì)列時(shí)要放到創(chuàng)建任務(wù)的前面,否則很可能還沒(méi)有創(chuàng)建消息隊(duì)列,在任務(wù)中就已經(jīng)開(kāi)始使用了,造成程序執(zhí)行不正常。同樣對(duì)于信號(hào)量。
OSQPend(uint8 *ret, uint8 OS_Q_MEM_SEL *buf, uint8 tick)
處理過(guò)程和信號(hào)量的相似,只是如果有消息的話會(huì)把消息內(nèi)容放到ret指向的空間返回。
當(dāng)tick是0的話他就是無(wú)限制的等待一個(gè)消息(信號(hào)),因?yàn)樵趘oid OSTimeTick(void)中首先判斷等待時(shí)間是否是0,在不是的情況下減一,然后判斷是0的話使任務(wù)就緒,如果原來(lái)就是0的話,就不能通過(guò)超時(shí)進(jìn)入就緒態(tài),故只能是靠消息或信號(hào)來(lái)進(jìn)入就緒態(tài)。
用系統(tǒng)函數(shù)作比較精確的定時(shí),SMALL RTOS51的滴答可以配制成各種中斷中加1,默認(rèn)配置成定時(shí)中斷0,觀察發(fā)現(xiàn)沒(méi)有設(shè)置初值,故一次中斷的計(jì)數(shù)0x10000個(gè)機(jī)器周期,在6m晶振大約是130ms,很難實(shí)現(xiàn)定時(shí)1s的要求。
Q1:系統(tǒng)時(shí)鐘節(jié)拍怎么定義,怎么調(diào)用?
A1: 各個(gè)任務(wù)運(yùn)行都需要一個(gè)周期性的信號(hào)指示,即每一個(gè)任務(wù)允許運(yùn)行的時(shí)間片是多少,必須規(guī)定好。這個(gè)時(shí)間片就是系統(tǒng)時(shí)鐘節(jié)拍。
在Small RTOS51 中時(shí)鐘節(jié)拍服務(wù)函數(shù)是OSTimeTick()。此函數(shù)在定義在OS_core.c文件中。注意,由于時(shí)間片是靠定時(shí)器來(lái)產(chǎn)生,所以必須相對(duì)應(yīng)的有一個(gè)定時(shí)器時(shí)間節(jié)拍中斷服務(wù)程序OSTickISR( ),這個(gè)定時(shí)器時(shí)間中斷服務(wù)程序的格式是:
Void OSTickISR(void)  interrupt OS_TIME_ISR
可以看出,這是keil c 中中斷服務(wù)程序。其中中斷入口地址OS_TIME_ISR是在OS_CPU.h文件中定義的,OS_TIME_ISR取值必須是1或者3或者其他(1為T(mén)imer0,3為T(mén)imer1,其他則根據(jù)單片機(jī)類型來(lái)定)。
由于系統(tǒng)必須周期性的調(diào)用OSTimeTick(),以此保證時(shí)間片產(chǎn)生的準(zhǔn)時(shí)。有兩個(gè)方法來(lái)保證:1.由于定時(shí)器中斷服務(wù)程序調(diào)用是系統(tǒng)響應(yīng)中斷時(shí)候就進(jìn)入,不需要我們?nèi)斯じ缮?,所以在定時(shí)器時(shí)鐘中斷服務(wù)程序 OSTickISR()來(lái)調(diào)用OSTimeTick(); 2.由于Small RTOS51具有一個(gè)發(fā)送信號(hào)函數(shù)OSIntSendsignal ( Task ID),此函數(shù)能使任務(wù)ID=Task ID的任務(wù)無(wú)條件處于就緒狀態(tài),并且優(yōu)先級(jí)最高,所以在定時(shí)器時(shí)鐘中斷服務(wù)程序中調(diào)用函OSIntSendsignal(Task ID),使任務(wù)ID=Task ID的任務(wù)無(wú)條件處于就緒狀態(tài),退出中斷以后任務(wù)ID=Task ID的任務(wù)能夠立即執(zhí)行,我們?cè)僭诖巳蝿?wù)中調(diào)用OSTimeTick()函數(shù)即可。
注意:
1.       由于OSIntSendsignal(Task ID)能改變?nèi)蝿?wù)的優(yōu)先級(jí),所以建議在優(yōu)先級(jí)最高的任務(wù)中調(diào)用OSTimeTick()函數(shù)。也就是任務(wù)ID=0的任務(wù)。
2.       由于用戶函數(shù)調(diào)用時(shí)鐘節(jié)拍服務(wù)函數(shù)OSTimeTick(),則同時(shí)要通過(guò)某種方法啟動(dòng)任務(wù)調(diào)度程序,一般是以K_SIG為參數(shù)調(diào)用函數(shù)OSWait()。這兩個(gè)函數(shù)形成固定組合.
例如:任務(wù)中調(diào)用時(shí)鐘節(jié)拍服務(wù)函數(shù)示例
Void Task(void)
{ while(1)
{······
OSTimeTick();
OSWait(K_SIG, 0);/*這里的OSWait()函數(shù)中第二個(gè)參數(shù)0沒(méi)有任何意義*/
······}
}
3.  用戶在編寫(xiě)一個(gè)程序時(shí)候,必須根據(jù)所選用的定時(shí)器,修改OS_TIME_ISR的取值。
Q2:系統(tǒng)節(jié)拍定時(shí)器規(guī)定了時(shí)間片的大小,由于硬件定時(shí)器定時(shí)有限,假如我要規(guī)定系統(tǒng)節(jié)拍為1S,有沒(méi)有辦法實(shí)現(xiàn)呢?
A2:有,由于Small RTOS51的系統(tǒng)時(shí)間片分配程序?yàn)镺STimeTick(),而不是系統(tǒng)定時(shí)器中斷服務(wù)程序OSTickISR();所以只要定義一個(gè)計(jì)數(shù)器,這個(gè)計(jì)數(shù)器放在定時(shí)器中斷服務(wù)程序OSTickISR()里面進(jìn)行計(jì)數(shù);再在OSTimeTick()上根據(jù)計(jì)數(shù)器的值來(lái)判斷,就可以實(shí)現(xiàn)長(zhǎng)時(shí)間片的實(shí)現(xiàn)。
在Small RTOS51中有一個(gè)宏TICK_TIMER_SHARING  這個(gè)宏是定義進(jìn)入硬件中斷多少次為一個(gè)系統(tǒng)定時(shí)器軟中斷,也就是進(jìn)入定時(shí)器多少次中斷為一個(gè)系統(tǒng)時(shí)間片。 Small RTOS51 中規(guī)定:TICK_TIMER_SHARING取值為1,則表示進(jìn)入定時(shí)器中斷1次為一個(gè)系統(tǒng)定時(shí)器軟中斷,即時(shí)間片為1個(gè)定時(shí)器定時(shí)時(shí)間。
OSTickISR(Void)interrupt OS_TIMER_ISR 函數(shù)在OS_CPU.C文件中定義。
對(duì)于 OSTickISP(void)interrupt OS_TIMER_ISR定時(shí)器硬件中斷服務(wù)函數(shù)中定義
# if TICK_TIMER_SHARING>1
Static  uint8  TickSum=0;
#endif
這個(gè)變量 TickSum這個(gè)變量放在中斷函數(shù)里面定義,我是不能理解。我理解為每次進(jìn)入中斷函數(shù)內(nèi)部,uint TickSum都會(huì)重新賦值。永遠(yuǎn)是TickSum=0。我理解TickSum應(yīng)該定義為一個(gè)全局變量并且賦值為0。以后每次進(jìn)入定時(shí)器硬件中斷服務(wù)函數(shù)以后,就執(zhí)行TickSum=+1的語(yǔ)句。
并且再判斷TickSum+1是否等于TICK_TIMER_SHARING。假如等于則說(shuō)明分配的系統(tǒng)時(shí)間片大小已經(jīng)到了,要把TickSum重新賦值為0。
將程序OSTickISP(void)interrupt OS_TIMER_ISR中的(5)(6)句作些修改。
#if TICK_TIMER_SHARING >1
TickSum = (TickSum + 1) % TICK_TIMER_SHARING;
if (TickSum != 0)
{
Return ;
}
else
{TickSum=0;}
#endif
那么最后的整體程序修改如下:
#if EN_OS_INT_ENTER >0
#pragma disable                                        /* 除非最高優(yōu)先級(jí)中斷,否則,必須加上這一句                 */
#endif
void OSTickISR(void) interrupt OS_TIME_ISR
{
···········
這里開(kāi)始應(yīng)該寫(xiě)上定時(shí)器重新賦值的語(yǔ)句。假如不是自動(dòng)重裝的話
··············
#if EN_USER_TICK_TIMER > 0
UserTickTimer();                     /* 用戶函數(shù)    */
#endif
#if TICK_TIMER_SHARING >1
TickSum=+1;
If (TickSum = = TICK_TIMER_SHARING)
{TickSum = 0;}
Else
{
return;
}
#endif
#if EN_OS_INT_ENTER > 0
OS_INT_ENTER();     /* 中斷開(kāi)始處理*/
#endif
#if EN_TIMER_SHARING > 0
OSTimeTick(); /* 調(diào)用系統(tǒng)時(shí)鐘處理函數(shù),處理系統(tǒng)任務(wù)調(diào)度任務(wù) */
#else
OSIntSendSignal(TIME_ISR_TASK_ID);   /* 喚醒ID為T(mén)IME_ISR_TASK_ID的任務(wù)*/
#endif
OSIntExit();                                        /* 中斷結(jié)束處理  */
}
注意:
1。程序中有 If EN_USER_TICK_TIMER>0  UserTickTimer( ) #endif  這樣的語(yǔ)句。中
EN_USER_TICK_TIMER的意思是禁止(0)或者允許(1)系統(tǒng)定時(shí)中斷服務(wù)程序中調(diào)用用戶
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
RTOS內(nèi)功修煉記(四)— 小小的時(shí)鐘節(jié)拍,撐起了內(nèi)核半邊天!
C# 定時(shí)執(zhí)行函數(shù)(winForm)
函數(shù)防抖
實(shí)時(shí)操作系統(tǒng)的任務(wù)睡眠
Linux時(shí)間子系統(tǒng)之八:動(dòng)態(tài)時(shí)鐘框架(CONFIG
Linux時(shí)間子系統(tǒng)之六:高精度定時(shí)器(HRTIMER)的原理和實(shí)現(xiàn)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服