一、中斷服務(wù)函數(shù)
1、中斷:應(yīng)內(nèi)部或外部異步事件的請(qǐng)求中止當(dāng)前任務(wù),而去處理異步事件所要求的任務(wù)的過(guò)程叫做中斷。
學(xué)會(huì)如何在UCOSIII下編寫(xiě)中斷服務(wù)函數(shù)!
如果用UCOIII會(huì)先進(jìn)行條件編譯,然后執(zhí)行中斷服務(wù)程序,最后會(huì)退出UCOIII中斷。中斷函數(shù)如下:
void USART1_IRQHandler(void) //串口1中斷服務(wù)程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //使用UCOS操作系統(tǒng)
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數(shù)據(jù)
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收錯(cuò)誤,重新開(kāi)始
else USART_RX_STA|=0x8000; //接收完成了
}
else //還沒(méi)收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數(shù)據(jù)錯(cuò)誤,重新開(kāi)始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS
OSIntExit(); //退出中斷
#endif
}
進(jìn)入和退出中斷服務(wù)函數(shù)
進(jìn)入中斷服務(wù)函數(shù)以后使用函數(shù)OSIntEnter()
void OSIntEnter (void)
{
if (OSRunning != OS_STATE_OS_RUNNING)//判斷UCOSIII是否運(yùn)行
{
return
}
if (OSIntNestingCtr >= (OS_NESTING_CTR)250u)//判斷中斷嵌套次數(shù)
{
return;
}
OSIntNestingCtr++;//記錄中斷嵌套次數(shù),UCOSIII最多支持250級(jí)的中斷嵌套
}
退出中斷服務(wù)函數(shù)時(shí)要調(diào)用函數(shù)OSIntExit();
UCOSIII臨界段代碼保護(hù)
臨界段代碼也叫做臨界區(qū),是指那些必須完整連續(xù)運(yùn)行,不可被打斷的代碼段。當(dāng)訪問(wèn)這些臨界段代碼的時(shí)候需要對(duì)這些臨界段代碼進(jìn)行保護(hù)。
兩種不同的保護(hù)方式:
①當(dāng)宏OS_CFG_ISR_POST_DEFERRED_EN為0時(shí),UCOSIII使用關(guān)中斷的方式來(lái)保護(hù)臨界段代碼,當(dāng)設(shè)置為1的時(shí)候就會(huì)采用給調(diào)度器上鎖的方式來(lái)保護(hù)臨界段代碼。
②UCOSIII定義了一個(gè)進(jìn)入臨界段代碼的宏:OS_CRITICAL_ENTER(),定義了兩個(gè)退出臨界段代碼的宏:OS_CRITICAL_EXIT和OS_CRITICAL_EXIT_NO_SCHED()。
比如在主函數(shù),在創(chuàng)建開(kāi)始函數(shù)時(shí),認(rèn)為是不可打斷的,所有進(jìn)行保護(hù),創(chuàng)建完后再解除保護(hù):
int main(void)
{
OS_ERR err;//錯(cuò)誤值:都是宏定義,根據(jù)對(duì)應(yīng)數(shù)值找到返回錯(cuò)誤值代表的意思
CPU_SR_ALLOC();
delay_init(168); //時(shí)鐘初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組配置
uart_init(115200); //串口初始化
LED_Init(); //LED初始化
OSInit(&err); //初始化UCOSIII
OS_CRITICAL_ENTER();//進(jìn)入臨界區(qū)
//創(chuàng)建開(kāi)始任務(wù)
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任務(wù)控制塊
(CPU_CHAR * )"start task", //任務(wù)名字
(OS_TASK_PTR )start_task, //任務(wù)函數(shù)
(void * )0, //傳遞給任務(wù)函數(shù)的參數(shù)
(OS_PRIO )START_TASK_PRIO, //任務(wù)優(yōu)先級(jí)
(CPU_STK * )&START_TASK_STK[0], //任務(wù)堆棧基地址
(CPU_STK_SIZE)START_STK_SIZE/10, //任務(wù)堆棧深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任務(wù)堆棧大小
(OS_MSG_QTY )0, //任務(wù)內(nèi)部消息隊(duì)列能夠接收的最大消息數(shù)目,為0時(shí)禁止接收消息
(OS_TICK )0, //當(dāng)使能時(shí)間片輪轉(zhuǎn)時(shí)的時(shí)間片長(zhǎng)度,為0時(shí)為默認(rèn)長(zhǎng)度,
(void * )0, //用戶補(bǔ)充的存儲(chǔ)區(qū)
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務(wù)選項(xiàng)
(OS_ERR * )&err); //存放該函數(shù)錯(cuò)誤時(shí)的返回值
OS_CRITICAL_EXIT(); //退出臨界區(qū)
OSStart(&err); //開(kāi)啟UCOSIII
while(1);
}
UCOSIII時(shí)間管理
任務(wù)延時(shí)
UCOSIII中的任務(wù)是一個(gè)無(wú)限循環(huán)并且還是一個(gè)搶占式內(nèi)核,為了使高優(yōu)先級(jí)的任務(wù)不至于獨(dú)占CPU,可以給其他優(yōu)先級(jí)較低任務(wù)獲取CPU使用權(quán)的機(jī)會(huì),UCOSIII中除空閑任務(wù)外的所有任務(wù)必須在合適的位置調(diào)用系統(tǒng)提供的延時(shí)函數(shù),讓當(dāng)前的任務(wù)暫停運(yùn)行一段時(shí)間并進(jìn)行一個(gè)任務(wù)切換。
延時(shí)函數(shù)有兩種,OSTimeDly()和OSTimeDlyHMSM()。
OSTimeDly()函數(shù)有三種工作模式:相對(duì)模式、周期模式和絕對(duì)模式。
void OSTimeDly (OS_TICK dly,//時(shí)間片數(shù)
OS_OPT opt,//工作模式
OS_ERR *p_err)//錯(cuò)誤碼
OSTimeDlyHMSM()函數(shù)僅在相對(duì)模式下工作。
void OSTimeDlyHMSM (CPU_INT16U hours,//時(shí)
CPU_INT16U minutes,//分
CPU_INT16U seconds,//秒
CPU_INT32U milli,//微妙
OS_OPT opt,//工作模式,不同的工作模式時(shí)間范圍不一致
OS_ERR *p_err)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
取消任務(wù)的延時(shí)
延時(shí)任務(wù)任務(wù)可通過(guò)在其他任務(wù)中調(diào)用函數(shù)OSTimeDlyResume()取消延時(shí)而進(jìn)入就緒狀態(tài),此函數(shù)最后會(huì)引發(fā)一次任務(wù)調(diào)度。
獲取和設(shè)置系統(tǒng)時(shí)間
UCOSIII定義了一個(gè)CPU_INT32U類型的全局變量OSTickCtr來(lái)記錄系統(tǒng)時(shí)鐘節(jié)拍數(shù),在調(diào)用OSInit()時(shí)被初始化為0,以后每發(fā)生1個(gè)時(shí)鐘節(jié)拍,OSTickCtr加1。
OSTimeSet()允許用戶改變當(dāng)前時(shí)鐘節(jié)拍計(jì)數(shù)器的值,慎用?。。。?!
OSTimeGet()用來(lái)獲取動(dòng)遷時(shí)鐘節(jié)拍計(jì)數(shù)器的值。
上一篇:UCOSIII任務(wù)間的通信
下一篇:UCOSIII的5個(gè)系統(tǒng)任務(wù)及鉤子函數(shù)編寫(xiě)
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- ROHM推出“PFC+反激控制參考設(shè)計(jì)”,助力實(shí)現(xiàn)更小巧的電源設(shè)計(jì)!
- 實(shí)現(xiàn)自我溝通和與世界溝通的新方式
- 上汽集團(tuán)將推10萬(wàn)級(jí)半固態(tài)電池車型
- Bourns 推出其最小封裝尺寸 AEC-Q200 認(rèn)證車規(guī)級(jí)厚膜電阻
- 特斯拉大量使用激光雷達(dá)!
- 為何只有特斯拉采用PC芯片,而其他車企采用手機(jī)級(jí)車規(guī)芯片?
- 孚能科技:全固態(tài)電池進(jìn)入中試生產(chǎn)階段,計(jì)劃年底建成 0.2GWh 中試線
- 三星顯示獲梅賽德斯-邁巴赫S級(jí)48英寸OLED屏幕訂單
- Clearmotion全主動(dòng)懸掛系統(tǒng)將搭載保時(shí)捷,蔚來(lái)ET9已應(yīng)用
- R-SARC上車國(guó)產(chǎn)車型 京西智行讓智能底盤科技平權(quán)
- 【搶樓贏禮】聊聊我用過(guò)的MOSFET!
- 挑戰(zhàn)極限,你敢看嗎?下載文檔+觀看視頻,了解航空和政府應(yīng)用解決方案
- 有獎(jiǎng)直播: 解讀安森美半導(dǎo)體電源解決方案 ,聚焦服務(wù)器電源、光伏逆變器
- 下載白皮書(shū)贏好禮:Multi-Die 系統(tǒng)的早期架構(gòu)性能和功耗分析
- TI DLP知識(shí)有獎(jiǎng)快問(wèn)快答排位賽
- 【備戰(zhàn)國(guó)賽】超多電賽干貨資料等你下載!蓋樓助力電賽贏積分
- 有獎(jiǎng)直播:恩智浦基于RT06F的人臉識(shí)別技術(shù)解決方案
- TE Connectivity利用傳感和連接解決方案,賦能電動(dòng)汽車發(fā)展 參與有好禮!
- 國(guó)產(chǎn)芯5月:曬一曬,初露鋒芒的國(guó)產(chǎn)車規(guī)芯片你知多少?
- 韓以臺(tái)灣原料加工生產(chǎn)氟化氫,盼忘擺脫對(duì)日依賴
- 新任CFO黃仁昭:臺(tái)積電將告別何麗梅時(shí)代!
- 華為幫某西方國(guó)家研發(fā)芯片
- 公募投科創(chuàng)板最新要求:嚴(yán)禁跟風(fēng)炒作 追漲殺跌
- 我們應(yīng)該在今年換5G嗎?
- 意法半導(dǎo)體和艾睿電子聯(lián)合發(fā)布符合小型發(fā)動(dòng)機(jī)排放新規(guī)的電子燃油噴射參考設(shè)計(jì)方案
- 安費(fèi)諾推新型HSD電纜組件 適用于車載信息娛樂(lè)系統(tǒng)應(yīng)用
- 智能語(yǔ)音助手:大陸集團(tuán)開(kāi)發(fā)車用自適應(yīng)聲控?cái)?shù)字伴侶
- 韓國(guó)研究人員研發(fā)全球首個(gè)三進(jìn)制半導(dǎo)體 或影響AI/自動(dòng)駕駛汽車等應(yīng)用
- 特斯拉升級(jí)AEB系統(tǒng) 防止車輛撞到行人/騎行者
- 如果你想?yún)⑴cDIY,但又沒(méi)思路,看過(guò)來(lái)?。?!
- wince5.0中,GetServiceHandle函數(shù)的使用問(wèn)題
- 華為高速數(shù)字電路設(shè)計(jì)教材
- 請(qǐng)問(wèn)下24bit的lvds發(fā)送芯片用于點(diǎn)亮18bit的LCD屏
- MC34063 輸出電壓對(duì)稱性
- 從零開(kāi)始學(xué)電路仿真Multisim與電路設(shè)計(jì)Protel技術(shù)
- 多功能隨身電源設(shè)計(jì)
- ad10繪制多層板時(shí),
- LED電子顯示屏驅(qū)動(dòng)芯片問(wèn)題
- EVC4.0+sp3+ppc2003,在同事機(jī)器上都正常,裝到我機(jī)器上單步調(diào)試變得超級(jí)慢