關於RTX51 Tiny嵌入式實時操作系統的描寫敘述請參考本人的上一篇博文(RTX51 Tiny實時操作系統學習筆記—初識RTX51 Tiny)。
本篇博文。我將通過一個實例代碼,帶大家深入了解一下RTX51 Tiny,讓大家認識到RTX51 Tiny的魅力和方便之處。
以下的代碼將要實現的功能是:使LED0每隔1秒切換一次狀態(ON/OFF)。LED1每0.7秒切換一次狀態。LED2每0.4秒切換一次狀態,LED3每0.2秒切換一次狀態。
下面是我的代碼:
/******************************************************* task1 : LED0每 1s改變一次狀態 task2 :LED1每0.7s改變一次狀態 task3 :LED2每0.4s改變一次狀態 task4 :LED3每0.2s改變一次狀態 *******************************************************/ #include <rtx51tny.h> #include <reg52.h> typedef unsigned char uchar; typedef unsigned int uint; sbit LED0 = P2^0; sbit LED1 = P2^1; sbit LED2 = P2^2; sbit LED3 = P2^3; sbit KEY0 = P1^7; void job0(void) _task_ 0 { LED0 = 1; LED1 = 1; LED2 = 1; LED3 = 1; //關閉四個LED os_create_task(1); //創建任務1 os_create_task(2); //創建任務2 os_create_task(3); //創建任務3 os_create_task(4); //創建任務4 os_create_task(5); //創建任務5 os_delete_task(0); //刪除自己(task0),使task0退出任務鏈表 } void job1(void) _task_ 1 { while(1){ LED0 = !LED0; os_wait(K_TMO, 100, 0); //等待100個時鍾滴答(ticks),即1s //配置文件ConfTny.A51中INT_CLOCK EQU 10000; default is 10000 cycles //意思是時鍾滴答為10000個機器周期。即10000*1uS=10ms } } void job2(void) _task_ 2 { while(1){ LED1 = !LED1; os_wait(K_TMO, 70, 0); //等待(延時)0.7s } } void job3(void) _task_ 3 { while(1){ LED2 = !LED2; os_wait(K_TMO, 40, 0); //等待(延時)0.4s } } void job4(void) _task_ 4 { while(1){ LED3 = !LED3; os_wait(K_TMO, 20, 0); //等待(延時)0.2s } } void job5(void) _task_ 5 { while(1){ if(0 == KEY0){ //推斷按鍵是否按下 LED3 = 1; os_delete_task(4); //按鍵按下時關閉LED3,使task4退出任務鏈表,LED3不再閃爍 } } }
代碼分析:
在RTX51 Tiny應用中,我們不須要編寫main函數。由於main函數已經由RTX51 Tiny內核實現了。一個基於RTX51 Tiny的應用程序,都是從任務0(task0)開始執行的。上面的代碼中。除了task0之外,其它的任務都是一個while(1)死循環。task0的作用是負責系統的初始化,上述代碼在這個任務中首先關閉了四個LED。然后通過os_create_task(id)函數創建了五個任務,task0的最后一個步驟是通過os_delete_task(id)函數刪除自身,使task0退出任務鏈表。
task1~task4分別控制LED0~LED3以不同的頻率閃爍。task5用來實現按鍵檢測。當檢測到按鍵按下時。使LED3關閉並使LED3的控制任務退出系統。