第八集 定时器周期性调度任务
- 任务定义与初始化
- 每个任务都有一个状态变量(
run
),用于指示该任务是否应该被执行。
- 为每个任务设置了计数器(
time_count
)和重载值(如300毫秒、600毫秒、900毫秒),用以控制任务的执行周期。
- 代码组织
- 将不同功能模块分离到各自的
.c
和 .h
文件中,例如 IO.c
/IO.h
用于输入输出操作,test.c
/test.h
用于测试或特定任务逻辑等。
- 在新增任务时,在相应的结构体数组中添加新的条目,并确保正确配置其初始参数(如周期、函数指针等)。
- 错误处理
- 遇到编译错误时,仔细检查错误信息,特别是关注可能由文件名冲突或字符编码问题引起的乱码现象,避免使用可能导致问题的中文字符,尽量使用英文命名。
- 确保所有必要的选项被正确选择,比如时钟频率、单片机型号等。同时确认“当目标文件变化时自动装载下载命令”选项已勾选,以保证程序能顺利下载到单片机。
- 功能验证
- 通过观察LED按照预定的时间间隔闪烁来验证多任务调度系统的正确性。
- 实现了非阻塞式的按键检测机制,并结合串口通信打印出按键按下的消息,进一步测试了系统的响应能力。
- 优化建议
- 移除不再需要的代码段,使主程序更加简洁明了。
- 为关键部分添加详细的注释,帮助理解和维护代码。
- 始终使用最新版本的开发工具和库,以获得更好的兼容性和性能。
代码学习:
多任务调度处理LED和按键。
static TASK_COMPONENTS Task_Comps[]=
{
//状态 计数 周期 函数
{0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms /
{0, 600, 600, LED1_Blink}, / task 1 Period: 600ms /
{0, 900, 900, LED2_Blink}, / task 1 Period: 600ms /
{0, 10, 10, KEY_Task}, / task 1 Period: 600ms */
};
void main(void)
{
Sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init(); //定时器初始化
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
Task_Pro_Handler_Callback(); //执行功能函数
}
}
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps[i].TIMCount) /* If the time is not 0 /
{
Task_Comps[i].TIMCount--; / Time counter decrement /
if(Task_Comps[i].TIMCount == 0) / If time arrives */
{
/*Resume the timer value and try again /
Task_Comps[i].TIMCount = Task_Comps[i].TRITime;
Task_Comps[i].Run = 1; / The task can be run */
}
}
}
}
//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps[i].Run) /* If task can be run /
{
Task_Comps[i].Run = 0; / Flag clear 0 /
Task_Comps[i].TaskHook(); / Run task */
}
}
}