发布时间:2022-12-6 分类: 电商动态
这些知识是在普通阅读中获得的,分散的,我已经总结并在这里分享了
全局变量VS函数参数
Linux下的驱动程序编程中的全局变量,使用很多,例如中断服务函数ISR,基本上可以使用全局变量作为数据更新和事件触发器。将参数传递给函数的效率通常低于直接使用全局变量,特别是如果参数的数量太大。参数传递,你需要先将参数推送到堆栈,等等,在程序运行完毕后,再从堆栈中拉出,这个过程比全局变量更复杂。但是,如果全局变量太多,那么设计管理的问题就在这里。稍后难以控制这些变量的修改,这对功能的模块化具有不利影响。
I=I + 1;我++; I - ;
就执行效率而言,这三个语句通常在for()或while()中引用。 3》 2》 1
这与生成的汇编语言有关。总的来说,影响并不过分夸大。
switch-case语句
switch-case语句也用在很多语句中。
这里的第一个优化原则是将具有最高发生概率的条件置于第一判断位置。这可以有效地减少比较次数,从而获得更好的结果。或者,有一种更好的方法来替换switch-case语句,即使用查找表
例如
Switch(msg_type){case DATA: handle_data_fun();打破; case RTS: handle_rts_fun();打破; .......}
在这里,您可以使用函数指针和查找表来获取handle_fun方法。
在初始化期间,处理功能被放置在* handle_fun [MAX]的相应位置。
Int(* handle_fun [MAX])(struct msg_t * msg); int msg_type=msg-> type; handle_fun [MSG_TYPE](MSG); //可以
此方法用于Linux网络协议,相应的表查找方法是哈希表结构。
sturct 和 union的使用
Sturcut的使用,必须考虑到字节,结构,不同顺序,sizeof的问题是不同的,所以调整位置,尽量确保结构的大小是最小的。
例如,union的使用对于不同包的数据结构是不同的,因此尝试使用union来区分不同的包结构,以便程序更具可读性。
volatile的使用
这是驱动程序编程中非常有用的标志。目标是阻止编译器优化当前变量。特别是涉及硬件寄存器的值时。
乘除运算的简化
乘法和除法运算对于手臂来说太致命,并且手臂的乘法和除法会生成一堆装配指令来完成。因此,通常可以通过位操作来执行适当的简化,例如移位,取低位。例如,a * 8=a<<< 3;
Inline 函数
实现更简单函数的函数以及调用非常简单的函数可以在函数之前添加到内联标识符中。生成装配时这可能更有效。也可以替换更复杂的define语句。