基于工步执行的附加超时机制的一种模式

前言

该模式主体是一个switch-case结构,所谓工步即为case常量表达式的值,一般为数字常量,也成为显性工步;通过default这一特殊机制,实现隐性工步的执行;而每一工步所执行的间隔就需要定时器来控制,这也是实现超时机制的方法。

这种模式还可以衍生出其他的模式,灵活性很大,总体上像是一个多路复用的模式,而我在这里只介绍一种结合定时器实现带超时机制的工步执行方法。

流程图

代码模式

c 复制代码
if(Flag_10ms){//10ms 执行间隔
    swtich(step){
        case 1:{
            //do something
            break;}
        case 2:{break;}
        case 3:{break;}

        case timeout1:{//超时终止工步值,根据需求调节
            //do someting
            break;
        }
        case timeout2:{//多级超时
            //do someting
            break;
        }
        default:{
            //if ... 判断可选工步执行条件(超时工步除外)
            step = 1; //触发相应可选工步
            timeout = 0
            //else
            step = timeout_start+(timeout++)

        }
    }
}

一个实例

这是在做CAN Bootloader时使用的一个实例

c 复制代码
void CAN_Loader(void){
	static uint8_t step=0,timeout=0;
	uint32_t tmp_cmd = 0,tmp_addr = 0;
	switch(step){

		case 1:{ //工步1
			
			tmp_cmd = join_u8_buf_to_u32(CAN0_Rx_Msg.Data);
			switch(tmp_cmd){
				case CMD_RESET:{
					break;
				}
				case CMD_UPDATE_APP:{
					step = 3; //跳转工步
					break;
				}
				
				default:{
					step = 4; //超时起始工步值,隐性工步
					break;
				}
			}
			
			break;
		}
		case 2:{ //工步2
			step = 4;
			break;
		}
		case 3:{ //工步3
			//do something
			step = 4;
		}
		case 200:{//超时功能(about 4s
			printf("someting is timeout\n");
			step = 0;
			timeout = 0;
			break;
		}
		default:{ //默认工步,即隐性执行工步,由于触发显性工步的条件判断

			if((CAN0_MSG_OBJ.CAN_Msg_Vailed_Flag == CAN0_MSG_VALID) || \
				(CAN0_MSG_OBJ.CAN_Msg_Vailed_Flag == CAN0_MSG_BUSY)){//条件判断

				if(Cmd_Status == CMD_STATUS_NULL) step = 1;//跳转工步
				else if(Enable_Update_Flag) step = 3;//跳转工步
				CAN0_MSG_OBJ.CAN_Msg_Vailed_Flag = CAN0_MSG_NULL;
				timeout = 0;//超时计数清零
			}else {
				step = 4+(timeout++);//超时计数
				
			}
			break;
		}
	}
}

step为什么不从0开始,因为考虑到习惯上初始化时为0,所以就不要工步为0了。

总结

这种方式,虽然简单、灵活、易于扩展与延伸,但是有一个明显的缺点,就是除超时机制是以执行间隔来运行的,但是其他工步执行的间隔要2倍的执行间隔,因为需要在default中判断触发条件后才会执行相应工步。

相关推荐
ajassi20006 小时前
AI语音智能体开发日记(一)如何为“小智”服务器启用并调试 License 功能
笔记·ai·嵌入式·ai编程
ARM+FPGA+AI工业主板定制专家1 天前
国产化RK3576+FPGA架构|晶圆传输机器人高速定位+AI瑕疵检测一体化方案
fpga开发·架构·机器人·嵌入式·fpga·工控·机器人运控
Discipline~Hai1 天前
ARM03-蜂鸣器和中断
c语言·arm开发·单片机·嵌入式硬件·嵌入式
一杯原谅绿茶1 天前
安卓烧录工具PhonixCard-4.2.8下载
嵌入式
青衫嵌入式2 天前
FreeRTOS中断优先级配置不对也会HardFault?这次用一个血的教训讲明白
嵌入式
零涂毕业设计3 天前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
wdfk_prog3 天前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式
潘潘的嵌入式日记4 天前
嵌入式安全重构——新老两套同时跑
嵌入式·架构设计·验证·代码重构
Fu_Lin_4 天前
Qt 嵌入式从零基础到精通总纲
开发语言·qt·嵌入式·qt嵌入式
潘潘的嵌入式日记4 天前
一个宏在调试阶段挡住所有误操作
安全·嵌入式··调试·编译期·bring-up