一、中斷服務函數
1、中斷:應內部或外部異步事件的請求中止當前任務,而去處理異步事件所要求的任務的過程叫做中斷。
學會如何在UCOSIII下編寫中斷服務函數!
如果用UCOIII會先進行條件編譯,然后執行中斷服務程序,最后會退出UCOIII中斷。中斷函數如下:
void USART1_IRQHandler(void) //串口1中斷服務程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //使用UCOS操作系統
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數據
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
else USART_RX_STA|=0x8000; //接收完成了
}
else //還沒收到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;//接收數據錯誤,重新開始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS
OSIntExit(); //退出中斷
#endif
}
進入和退出中斷服務函數
進入中斷服務函數以后使用函數OSIntEnter()
void OSIntEnter (void)
{
if (OSRunning != OS_STATE_OS_RUNNING)//判斷UCOSIII是否運行
{
return
}
if (OSIntNestingCtr >= (OS_NESTING_CTR)250u)//判斷中斷嵌套次數
{
return;
}
OSIntNestingCtr++;//記錄中斷嵌套次數,UCOSIII最多支持250級的中斷嵌套
}
退出中斷服務函數時要調用函數OSIntExit();
UCOSIII臨界段代碼保護
臨界段代碼也叫做臨界區,是指那些必須完整連續運行,不可被打斷的代碼段。當訪問這些臨界段代碼的時候需要對這些臨界段代碼進行保護。
兩種不同的保護方式:
①當宏OS_CFG_ISR_POST_DEFERRED_EN為0時,UCOSIII使用關中斷的方式來保護臨界段代碼,當設置為1的時候就會采用給調度器上鎖的方式來保護臨界段代碼。
②UCOSIII定義了一個進入臨界段代碼的宏:OS_CRITICAL_ENTER(),定義了兩個退出臨界段代碼的宏:OS_CRITICAL_EXIT和OS_CRITICAL_EXIT_NO_SCHED()。
比如在主函數,在創建開始函數時,認為是不可打斷的,所有進行保護,創建完后再解除保護:
int main(void)
{
OS_ERR err;//錯誤值:都是宏定義,根據對應數值找到返回錯誤值代表的意思
CPU_SR_ALLOC();
delay_init(168); //時鐘初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組配置
uart_init(115200); //串口初始化
LED_Init(); //LED初始化
OSInit(&err); //初始化UCOSIII
OS_CRITICAL_ENTER();//進入臨界區
//創建開始任務
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任務控制塊
(CPU_CHAR * )"start task", //任務名字
(OS_TASK_PTR )start_task, //任務函數
(void * )0, //傳遞給任務函數的參數
(OS_PRIO )START_TASK_PRIO, //任務優先級
(CPU_STK * )&START_TASK_STK[0], //任務堆棧基地址
(CPU_STK_SIZE)START_STK_SIZE/10, //任務堆棧深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任務堆棧大小
(OS_MSG_QTY )0, //任務內部消息隊列能夠接收的最大消息數目,為0時禁止接收消息
(OS_TICK )0, //當使能時間片輪轉時的時間片長度,為0時為默認長度,
(void * )0, //用戶補充的存儲區
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務選項
(OS_ERR * )&err); //存放該函數錯誤時的返回值
OS_CRITICAL_EXIT(); //退出臨界區
OSStart(&err); //開啟UCOSIII
while(1);
}
UCOSIII時間管理
任務延時
UCOSIII中的任務是一個無限循環并且還是一個搶占式內核,為了使高優先級的任務不至于獨占CPU,可以給其他優先級較低任務獲取CPU使用權的機會,UCOSIII中除空閑任務外的所有任務必須在合適的位置調用系統提供的延時函數,讓當前的任務暫停運行一段時間并進行一個任務切換。
延時函數有兩種,OSTimeDly()和OSTimeDlyHMSM()。
OSTimeDly()函數有三種工作模式:相對模式、周期模式和絕對模式。
void OSTimeDly (OS_TICK dly,//時間片數
OS_OPT opt,//工作模式
OS_ERR *p_err)//錯誤碼
OSTimeDlyHMSM()函數僅在相對模式下工作。
void OSTimeDlyHMSM (CPU_INT16U hours,//時
CPU_INT16U minutes,//分
CPU_INT16U seconds,//秒
CPU_INT32U milli,//微妙
OS_OPT opt,//工作模式,不同的工作模式時間范圍不一致
OS_ERR *p_err)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
取消任務的延時
延時任務任務可通過在其他任務中調用函數OSTimeDlyResume()取消延時而進入就緒狀態,此函數最后會引發一次任務調度。
獲取和設置系統時間
UCOSIII定義了一個CPU_INT32U類型的全局變量OSTickCtr來記錄系統時鐘節拍數,在調用OSInit()時被初始化為0,以后每發生1個時鐘節拍,OSTickCtr加1。
OSTimeSet()允許用戶改變當前時鐘節拍計數器的值,慎用!!!!!
OSTimeGet()用來獲取動遷時鐘節拍計數器的值。
上一篇:UCOSIII任務間的通信
下一篇:UCOSIII的5個系統任務及鉤子函數編寫
推薦閱讀
史海拾趣
隨著Crane Co.在電子行業的不斷發展和壯大,公司開始積極參與國際展覽和會議。在某次重要的國際展覽上,Crane Co.展示了其全系列的流體處理產品,包括創新的閥門和泵類產品。這些產品憑借其卓越的性能和先進的技術,吸引了眾多參展商和客戶的關注。通過這次展覽,Crane Co.進一步鞏固了其在電子行業的地位,并為未來的市場拓展奠定了堅實基礎。
通過以上五個故事,我們可以看到Crane Co.在電子行業發展的歷程中,始終保持著對技術創新和產品質量的不懈追求。正是這些努力,使得Crane Co.能夠在激烈的市場競爭中脫穎而出,成為行業內的佼佼者。
隨著Crane Co.在電子行業的不斷發展和壯大,公司開始積極參與國際展覽和會議。在某次重要的國際展覽上,Crane Co.展示了其全系列的流體處理產品,包括創新的閥門和泵類產品。這些產品憑借其卓越的性能和先進的技術,吸引了眾多參展商和客戶的關注。通過這次展覽,Crane Co.進一步鞏固了其在電子行業的地位,并為未來的市場拓展奠定了堅實基礎。
通過以上五個故事,我們可以看到Crane Co.在電子行業發展的歷程中,始終保持著對技術創新和產品質量的不懈追求。正是這些努力,使得Crane Co.能夠在激烈的市場競爭中脫穎而出,成為行業內的佼佼者。
人才是企業發展的根本。DDK公司深知人才的重要性,因此一直致力于人才培養和引進。公司建立了完善的人才培養機制,通過內部培訓、外部引進等多種方式,不斷吸引和培養了一批批優秀的電子工程師、研發人員和管理人才。這些人才為公司的發展提供了強大的智力支持和人才保障。
在電子行業的早期階段,CEI憑借其卓越的研發團隊和創新能力,成功開發出一款具有革命性的新型電容器。這款電容器以其高效能、長壽命和穩定性強的特點,迅速在市場中獲得認可。CEI借此機會,進一步擴大了生產規模,提高了產品質量,逐漸確立了其在電子行業中的領先地位。
BOOKHAM公司深知人才是企業發展的核心。因此,公司一直致力于引進和培養高素質的人才。通過與高校和研究機構的合作,公司吸引了大批優秀的科研人員和工程師加入。同時,公司還建立了完善的培訓體系,為員工提供持續的學習和發展機會。這些措施使得BOOKHAM公司擁有一支技術實力強大、富有創新精神的人才隊伍,為公司的發展提供了有力保障。
C&D公司深知品質是企業的生命線,因此始終堅守品質至上的原則。公司建立了嚴格的質量管理體系,從原材料采購到生產制造,再到產品出廠,每一個環節都嚴格把控,確保產品的品質達到最高標準。同時,C&D公司還注重品牌建設,通過廣告宣傳、社交媒體營銷等方式,提升品牌知名度和美譽度。
我現在用VS2005 得移動設備下得Win32編寫應用軟件。發現在VS2005移動設備下,沒有包含CBitmap Button類。 請問我才能怎么實現位圖控件呢? 謝謝!!!… 查看全部問答∨ |
|
Wince5.0 中RTL8139的驅動支持RTL8139D的芯片么 我用的CEPC的BSP,平臺是PC104,網卡是RTL8139D,我在PB中加入了RTL8139的驅動,去掉了enable KITL選項,可是系統啟動后一切正常,就是ping不通, error code 11010 ping自己能ping通, ipconfig也正常,網口發送指示燈都不閃,我覺得根本包就沒 ...… 查看全部問答∨ |
|
注冊表 DefaultIcon 下 比如 my.dll,0 那個0表示的是什么? 我看文檔說是第0個資源,我目前是想讓顯示一個圖標,那么我在my.dll 里怎么設置這個資源呢?快下班了,大家幫忙下,找了半天了沒結果 還比如說 視頻的快捷方式 22#:MSPIMG?pi ...… 查看全部問答∨ |
|
我用PSAM卡的加密密鑰(我寫入psam卡的)對一串字符加密,命令如下: 80 FA 00 00 10 31 21 11 01 01 01 01 01 31 21 11 01 01 01 01 01 得到的是61 16(加密數據的長度),沒有加密后的密文.為什么?為什么? 注:通用DES計算初始化已經做過,并且成功.… 查看全部問答∨ |
|
摘要:介紹在i.MX27芯片上利用16C652芯片來擴展串口的方案,詳細闡述i.MX27芯片與16C652芯片之間的接口設計、CPLD設計、驅動設計。 關鍵詞: i. ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析