一個簡單而經典的RTX51 Tiny應用實例

關於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 
#include 
 
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的控制任務退出系統。


分享到:


相關文章: