- 打卡等级:偶尔看看I
- 打卡总天数:16
- 最近打卡:2025-05-01 07:09:37
已绑定手机
中级会员
- 积分
- 233
|
发表于 2025-2-21 16:45:52
|
显示全部楼层
pcw 第八集 定时器周期性调度任务.zip
(3.97 MB, 下载次数: 25)
第八集 定时器周期性调度任务
官方给了一个利用定时器周期性调度度任务的模板
我把模板裁减最小化,分析了一下:
#include "config.h"
#include "io.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
//----------以上为USB参数赋值----
typedef struct
{
u8 Run; //任务是否运行:Run/Stop
u16 TIMCount; //运行的时间片
u16 TRITime; //重载值,前面减完从这里又复制去
void (*TaskHook) (void); //任务函数 用指针指向函数,不能带参数.
} TASK_COMPONENTS;
static TASK_COMPONENTS Task_Comps[]=
{
//状态 计数 周期 函数
{0, 500, 500, LED0_Blink}, /* task 1 Period: 300ms */
{0, 1000, 1000, LED1_Blink}, /* task 1 Period: 600ms */
{0, 2000, 2000, LED2_Blink}, /* task 1 Period: 600ms */
{0, 10, 10, KEY_Task}, /* task 1 Period: 600ms */
};
u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps[0]);
void main(void)
{
//-----------------------------------------------------------------------------
Sys_init(); //系统初始化
//----------------------------------------------------------------
//----------1毫秒@24.000MHz------定时器初始化--
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
while(1)
{
u8 i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps.Run) /* If task can be run */
{
Task_Comps.Run = 0; /* Flag clear 0 */
Task_Comps.TaskHook(); /* Run task */
}
}
}
}
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
u8 i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps.TIMCount) /* If the time is not 0 */
{
Task_Comps.TIMCount--; /* Time counter decrement */
if(Task_Comps.TIMCount == 0) /* If time arrives */
{
/*Resume the timer value and try again */
Task_Comps.TIMCount = Task_Comps.TRITime;
Task_Comps.Run = 1; /* The task can be run */
}
}
}
}
|
|