Bootstrap

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判断;

;