嵌入式c语言中方式一函数调用后错误状态旗标全局变量参与赋值运算,记录有效数据
我在文章“c语言常量、变量按照功能划分”中提到c语言中的变量全局变量分为两类一类是私有全局变量另一类为公共全局变量按照实现的功能进行划分可以划分为两类一种为记录错误状态旗标的变量另外一种为记录真正数值的变量。并且文章中提到我在以前驱动模块代码编写过程中忽略定义使用原生数据类型小数据类型的全局变量造成使用c语言对驱动细节描述不够细致有所缺失这种在后面编程过程中要加强锻炼。今天主要讲解这一类容易被忽略的错误状态旗标全局变量主要讲解这类全局变量的使用我们先看这样的代码if (motor_step_setmotor_step_current motor_step_set0xA0000) { MOTOR_DIR_BACKWARD(); // 因宏定义调用真正为函数调用相当于算法动作完成某些过程 motor_move_dir MOTOR_MOVE_BACKWARD; // 果状态全局变量记录上述过程 motor_update_period(htim6, speed_period); } else if (motor_step_set motor_step_current) { MOTOR_DIR_FORWARD(); // 因宏定义调用真正为函数调用相当于算法动作完成某些过程 motor_move_dir MOTOR_MOVE_FORWARD; // 果状态全局变量记录上述过程 motor_update_period(htim6, speed_period); } else { cmd_data[4] 0xFF; cmd_data[5] 0xFF; cmd_data[6] 0xFF; cmd_data[7] 0xFF; }上述代码中的状态全局变量motor_move_dir记录着马达转动的方向是某一个枚举值要么往前要么往后要么停止。这个全局变量到底被赋值写入哪一个枚举值是由什么确定的呢从代码中我们可能知道答案是由前面的函数调用宏定义调用替代后为函数调用配置输出引脚输出高电平决定的。该函数调用没有利用返回值也就是既不是错误状态码也不是返回某一个运算结果不参与任何运算。也就是我以前说的方式一编写的函数被父函数调用不参与任何运算但是毕竟调用完成了某些过程行为如果引起某些状态变化可以直接在后面使用状态对应全局变量进行“赋值运算”。这个过程有点像以前的公分制每天去地里干活完成了某些过程行为晚上回家后记录下来记录的过程就是赋值的过程。这个过程函数调用是“因”状态全局变量是“果”。总结方式一编写的函数被父函数传参调用后完成某些过程行为虽然没有返回值无法参与后面任何逻辑运算或者算术运算如果函数调用后引起某些状态全局变量数值变动的话需要紧跟着函数调用后面使用赋值运算符修改对应状态全局变量的值。方式一函数被调用并不是没有任何影响毕竟完成某些过程行为需要后面使用状态旗标错误全局变量参与赋值运算写入对应正确数值。提示1函数调用无论是否有返回值都会产生某些有效数据需要记录或者参与某些运算也包括赋值运算。2全局变量的特点全局变量的生命周期为整个项目可以在一个函数中对全局变量写入有效数据然后退出在后面其他函数中再对整个全局变量进行处理这就是全局变量不同于临时栈变量的一个特点。