前言:
裸机开发软件架构处理不好,代码堆的越多,可读性越差,会显得代码很臃肿,后期不便于维护,同时也变相增加工作量,如果这样的代码交给下一个人维护,那简直是头大,恨不得重塑架构。
裸机时间片调度软件架构:
首先要宏定义,代码如下:
#define SYSTICK_1S_FLAG (0) //1s
#define SYSTICK_2S_FLAG (1) //2s
#define APP_SET_BIT(val,bit) val |= (1<<bit) //置1
#define APP_CLR_BIT(val,bit) val &=~(1<<bit) //清0
#define APP_TEST_BIT(val,bit) val&(1<<bit) //位测试
定时器中断调用时钟节拍函数TIM6_TimeTick,这个函数也可以放在定时器回调函数,这里的定时器设置1ms一个周期,代码如下:
uint16_t u16_SysTickFlag;
void TIM6_TimeTick(void)
{
static uint16_t time_1s=0;
static uint16_t time_2s=0;
time_1s++;
time_2s++;
if(time_1s>=1000)
{
time_1s=0;
APP_SET_BIT(u16_SysTickFlag,SYSTICK_1S_FLAG);
}
if(time_2s>=2000)
{
time_2s=0;
APP_SET_BIT(u16_SysTickFlag,SYSTICK_2S_FLAG);
}
}
中断调用时钟节拍函数,代码如下:
void TIM6_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_IRQn 0 */
/* USER CODE END TIM6_IRQn 0 */
HAL_TIM_IRQHandler(&htim6);/
TIM6_TimeTick();
}
main函数按时间片调度执行任务,代码如下:
while(1)
{
if(APP_TEST_BIT(u16_SysTickFlag,SYSTICK_1S_FLAG))
{
fun_task1();
APP_CLR_BIT(u16_SysTickFlag,SYSTICK_1S_FLAG);
}
if(APP_TEST_BIT(u16_SysTickFlag,SYSTICK_2S_FLAG))
{
fun_task2();
APP_CLR_BIT(u16_SysTickFlag,SYSTICK_2S_FLAG);
}
...
...
}
这样设计架构,主函数中就很清晰地看出不同时间片调度的任务函数,每个任务函数相当于一个模块,这样也更体现了模块化编程,条理清晰,思路明确。