的HRTOS雙任務(wù)LED應(yīng)用實(shí)例)
1. 前言傳統(tǒng)8051裸機(jī)開發(fā)中當(dāng)程序功能逐漸增加時(shí)通常需要在主循環(huán)中不斷判斷各種狀態(tài)。例如while(1) { if(flag1) task1(); if(flag2) task2(); }當(dāng)任務(wù)數(shù)量增加后代碼維護(hù)難度逐漸提升。RTOS通過任務(wù)調(diào)度機(jī)制可以將不同功能拆分為獨(dú)立任務(wù)使程序結(jié)構(gòu)更加清晰。本文使用HRTOS實(shí)現(xiàn)兩個(gè)LED任務(wù)高優(yōu)先級(jí)任務(wù)快速閃爍LED普通優(yōu)先級(jí)任務(wù)慢速閃爍LED展示HRTOS基本任務(wù)創(chuàng)建和調(diào)度方式。2. 開發(fā)環(huán)境硬件STC系列8051單片機(jī)LED指示燈軟件Keil C51HRTOS系統(tǒng)特點(diǎn)優(yōu)先級(jí)搶占式調(diào)度支持多任務(wù)運(yùn)行支持任務(wù)延時(shí)3. 系統(tǒng)設(shè)計(jì)本案例包含兩個(gè)任務(wù)任務(wù)優(yōu)先級(jí)周期Fast LED Task72個(gè)系統(tǒng)TickSlow LED Task325個(gè)系統(tǒng)Tick任務(wù)關(guān)系HRTOS Scheduler | ----------------- | | Fast LED Task Slow LED Task Priority 7 Priority 3 | LEDFast任務(wù)優(yōu)先級(jí)更高因此系統(tǒng)調(diào)度時(shí)優(yōu)先響應(yīng)。4. 任務(wù)創(chuàng)建HRTOS任務(wù)創(chuàng)建接口os_task_create( task_entry, task_id, priority, stack_size );參數(shù)說明參數(shù)說明task_entry任務(wù)入口函數(shù)task_id任務(wù)編號(hào)priority任務(wù)優(yōu)先級(jí)stack_size任務(wù)堆棧大小創(chuàng)建快速LED任務(wù)os_task_create( (unsigned int)fast_led_task, FAST_TASK_ID, FAST_PRIORITY, FAST_STACK );創(chuàng)建慢速LED任務(wù)os_task_create( (unsigned int)slow_led_task, SLOW_TASK_ID, SLOW_PRIORITY, SLOW_STACK );5. LED任務(wù)實(shí)現(xiàn)快速任務(wù)static void fast_led_task(void) { while(1) { LED_FAST !LED_FAST; os_delay(FAST_DELAY); } }任務(wù)執(zhí)行流程LED翻轉(zhuǎn) ↓ 進(jìn)入延時(shí) ↓ 釋放CPU ↓ 等待下一次調(diào)度慢速任務(wù)結(jié)構(gòu)相同static void slow_led_task(void) { while(1) { LED_SLOW !LED_SLOW; os_delay(SLOW_DELAY); } }6. 運(yùn)行效果系統(tǒng)運(yùn)行后LED0快速閃爍LED1慢速閃爍兩個(gè)任務(wù)相互獨(dú)立運(yùn)行。即使增加更多任務(wù)例如串口通信傳感器采集Modbus通信也可以按照類似方式創(chuàng)建任務(wù)。7. 與裸機(jī)程序?qū)Ρ嚷銠C(jī)main() | -- LED1處理 | -- LED2處理 | -- 串口處理 | -- 傳感器處理任務(wù)之間相互影響。HRTOSScheduler / | \ LED1 LED2 UART每個(gè)功能獨(dú)立運(yùn)行。8. 總結(jié)通過本案例可以看到HRTOS能夠在8051資源有限的平臺(tái)上實(shí)現(xiàn)多任務(wù)管理。相比傳統(tǒng)裸機(jī)輪詢方式RTOS可以提高程序結(jié)構(gòu)清晰度簡化多功能應(yīng)用開發(fā)支持任務(wù)優(yōu)先級(jí)管理