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