MCU裸机任务调度架构
第1章 方式一(平均主义)
int main(int argc, char **argv){/* RTC 初始化 */bsp_RTC_Init(&rtc);/* 串口初始化 */uartInit(115200);/* LED初始化 */ledInit();while(1){// 任务1(获取传感器数据)// 任务2// 任务3}
}
1.1 平均主义的缺陷
获取传感器数据可以600ms去读取一次,但是按照上面的架构,可能十几微妙就去获取一次传感器的数据,照成CPU的浪费;
第2章 方式二(基于时基)
不同的时间点执行不同的任务
2.1 时基机制
uint8_t flag_1ms = 0; // 每来1ms, 该标志位被置位为1;
uint8_t cnt_1ms = 0; // 每来1ms, 该毫秒计数值加1;uint8_t flag_10ms = 0; // 10ms时间到, 该标志位被置位为1;
uint8_t cnt_10ms = 0; // 10ms时间到, 该毫秒计数值加1;uint8_t flag_100ms = 0; // 100ms时间到, 该标志位被置位为1;
uint8_t cnt_100ms = 0; // 100ms时间到, 该毫秒计数值加1;uint8_t flag_1s = 0; // 1000ms时间到, 该标志位被置位为1;
uint8_t cnt_1s = 0; // 1000ms时间到, 该毫秒计数值加1;int main(int argc, char **argv){while(1){// 1ms时间到达if(flag_1ms == 1){flag_1ms = 0;cnt_1ms++;// 累加到10ms后if(cnt_1ms >= 10){cnt_1ms = 0;flag_10ms = 1;}// TODO: 1ms到后需要执行的任务}// 10ms时间到达if(flag_10ms == 1){flag_10ms = 0;cnt_10ms++;// 累加到100ms后if(cnt_10ms >= 10){cnt_10ms = 0;flag_100ms = 1;}// TODO: 10ms到后需要执行的任务}// 100ms时间到达if(flag_100ms == 1){flag_100ms = 0;cnt_100ms++;// 累加到1000ms后if(cnt_100ms >= 10){cnt_100ms = 0;flag_1s = 1;}// TODO: 100ms到后需要执行的任务}// 1s时间到达if(flag_1s == 1){flag_1s = 0;cnt_1s++;// TODO: 1s到后需要执行的任务}}
}
2.1 时基机制的缺陷
主循环内部出现很多if判断;