一、設置方法所需結構體
typedef struct TASK_COMPONENTS {
unsigned char Run; // 程序運行標記:0-不運行,1-運行 ,這里是程序會不會運行
unsigned char Timer; // 計時器, 這個是用于在定時器中減減的
unsigned char ItvTime; // 任務運行間隔時間, 這個是用于更新參數的
void (*TaskHook)(void); // 要運行的任務函數 函數指針
} TASK_COMPONENTS; // 任務定義
二、構建任務表
/**************************************************************************************
* Variable definition 這里添加你的任務。。。。
**************************************************************************************/
static TASK_COMPONENTS TaskComps[] =
{
{0, 0,2, RGB_MODE1}, //任務一
{0, 0,1000, Led}, //任務二
};
三、任務標志檢測,在定時器中斷中調用
/**************************************************************************************
* FunctionName : TaskRemarks() //放到定時器中
* Description : 任務標志處理
**************************************************************************************/
void TaskRemarks(void) //要放到 timer中斷中
{
uchar i;
uchar TaskMax = sizeof(TaskComps)/sizeof(TASK_COMPONENTS);
for(i = 0; i < TaskMax; i++)
{
if(TaskComps[i].Timer) // 時間不為0 , 可是我有一個問題, 什么時候用 . 什么時候用 ->
{
TaskComps[i].Timer--;
}
else
{
if(TaskComps[i].Timer == 0) //如果計時到
{
TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢復計時器值,從新下一次
TaskComps[i].Run = 1; // 任務可以運行, 任務的延遲已經過了, 可以繼續運行了
}
}
}
}
四、任務處理,在while(1)中調用
/************************************************************************************** * FunctionName : TaskProcess() **************************************************************************************/ void TaskProcess(void) { uchar i; uchar TaskMax = sizeof(TaskComps)/sizeof(TASK_COMPONENTS); for (i=0; i<TaskMax; i++) // 逐個任務時間處理 { if(TaskComps[i].Run) //如果任務可以運行 { TaskComps[i].TaskHook(); // 運行任務, 這個是一個函數, 在運行完這個函數后, 我們下一步操作就是清除標志位 TaskComps[i].Run = 0; // 標志清0 } } }
完整程序
#include "WS51F0030.h" #include "RGB.h" #define Time0Def 65536-2668 //2ms #define uchar unsigned char #define uint unsigned int void Led(void) { P14 = ~P14; } typedef struct TASK_COMPONENTS { unsigned char Run; // 程序運行標記:0-不運行,1-運行 ,這里是程序會不會運行 unsigned char Timer; // 計時器, 這個是用于在定時器中減減的 unsigned char ItvTime; // 任務運行間隔時間, 這個是用于更新參數的 void (*TaskHook)(void); // 要運行的任務函數 函數指針 } TASK_COMPONENTS; // 任務定義 /************************************************************************************** * Variable definition 這里添加你的任務。。。。 **************************************************************************************/ static TASK_COMPONENTS TaskComps[] = { {0, 0,2, RGB_MODE1}, {0, 0,1000, Led}, }; //2. 任務運行標志出來,此函數就相當于中斷服務函數,需要在定時器的中斷服務函數中調用此函數,這里獨立出來,便于移植和理解。 /************************************************************************************** * FunctionName : TaskRemarks() //放到定時器中 * Description : 任務標志處理 **************************************************************************************/ void TaskRemarks(void) //要放到 timer中斷中 { uchar i; uchar TaskMax = sizeof(TaskComps)/sizeof(TASK_COMPONENTS); for(i = 0; i < TaskMax; i++) { if(TaskComps[i].Timer) // 時間不為0 , 可是我有一個問題, 什么時候用 . 什么時候用 -> { TaskComps[i].Timer--; // 減去一個節拍 } else { if(TaskComps[i].Timer == 0) //如果計時到 { TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢復計時器值,從新下一次 TaskComps[i].Run = 1; // 任務可以運行, 任務的延遲已經過了, 可以繼續運行了 } } } } //3. 任務處理:實現任務管理操作, 用于循環判斷哪個任務需要運行了 /************************************************************************************** * FunctionName : TaskProcess() **************************************************************************************/ void TaskProcess(void) { uchar i; uchar TaskMax = sizeof(TaskComps)/sizeof(TASK_COMPONENTS); for (i=0; i<TaskMax; i++) // 逐個任務時間處理 { if(TaskComps[i].Run) //如果任務可以運行 { TaskComps[i].TaskHook(); // 運行任務, 這個是一個函數, 在運行完這個函數后, 我們下一步操作就是清除標志位 TaskComps[i].Run = 0; // 標志清0 } } } void delay_1ms(void) { int j; for(j=0; j<17700; ++j); } /*************************** *系統時鐘初始化 ***************************/ void System_Init(void) { delay_1ms(); SCCON = 0x00;//使能HRC HRCON |= 0x80; delay_1ms(); SCCON = 0x00;//使能HRC HRCON |= 0x80; delay_1ms(); } /***************************************************** *全局中斷打開 *****************************************************/ void ISR(void) { EA = 1; } /***************************************************** * 中斷服務函數 1ms *****************************************************/ void timer0_isr (void) interrupt 1 { TL0 = Time0Def & 0xff; //初始值低字節,TL0 的高 3 位是無效的 TH0 = Time0Def >> 8; //初始值高字節(1ms@16MHz) 0.993ms TaskRemarks(); } /***************************************************** *函數功能:Timer0初始化配置 *****************************************************/ void Timer0_Init(void) { ET0 = 0; TL0 = Time0Def & 0xff; //初始值低字節,TL0 的高 3 位是無效的 TH0 = Time0Def >> 8; //初始值高字節(1ms@16MHz) 0.993ms TMOD = 0x01; //定時器,時鐘為系統時鐘 12 分頻 ET0 = 1; //開中斷 定時器 0 中斷使能控制位 TR0 = 1; //啟動定時器 } void Gpio_Init(void) { P14F = 0x02; //LED P05F = 0x02; } int main(void) { uint i = 0; System_Init(); Gpio_Init(); Timer0_Init(); ISR(); while(1) { TaskProcess(); } }
浙公網安備 33010602011771號