实现任务调度——使用定时器输出比较
唔,今天被问了一下,如何去做代码的一个响应框架,下班了就想写一下然后就算是作为随笔吧。
1.手册解读
在这里使用的是通用定时器TIMER3,从手册中我们可以看到,在输出比较模式下有四个比较寄存器:
通过手册我们可以知道:
而我们就是利用的是输出比较功能中的相应中断使能位(TIMx_DIER 寄存器中的 CCXIE 位)置 1,将生成中断。并且在当前的比较中断中获取比较寄存器的值动态修改,让不同的时基中断一直进行下去。
2.定时器比模式实现任务调度示意图
这样我们便可在每个不同时基的中断中去执行相应的程序。同时也可以设定快的时基与慢的时基,达到程序处理中将任务分为快速处理(快速层)与慢速处理(慢速层)的效果。
3.代码实现
(1)定时器初始化函数
void TIM_Task_Dispatch_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM3, 83999, TIM_PSCReloadMode_Immediate);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);
TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
TIM_Cmd(TIM3, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
(2)中断服务函数
4.实现效果图
(1)逻辑分析仪下不同时基中断的产生:
任务1:
任务2:
任务3:
任务4:
(2)串口打印效果:
(3)具体的任务调度的时间,可以根据个人的需求来设定,这里只是简单的举例。
5.最后附上工程的详细代码链接(免费):https://download.csdn.net/download/tiange1996/85031202