这些知识都是在平时阅读中零散得来的,自己总结了一下,在此分享。全局变量VS函数参数Linux下驱动程序编程中的全局变量,用处很多,比如中断服务函数ISR,基本上全局变量可以作为数据更新和事件触发器。一般来说,给函数传递参数的效率比直接使用全局变量要低,尤其是在参数数量过多的情况下。传递参数需要先将参数压入栈中,程序运行完毕后再从栈中拉取。这个过程比全局变量更复杂。但是,如果全局变量过多,这里就会设计管理问题,后期对这些变量的修改就很难控制,对功能的模块化产生不利影响。i=i+1;i++;i--;这三个语句通常在for()或while()中引用。在执行效率方面,3》2》1与最终生成的汇编语言有关。一般来说,影响不会太夸张。switch-case语句switch-case语句也是用到很多的语句。这里的第一个优化原则是:把出现概率最高的条件放在判断最高的位置。这样可以有效减少比较次数,达到更好的效果。或者,有一个更好的方法来替换switch-case语句,即使用查找表,例如switch(msg_type){caseDATA:handle_data_fun();break;caseRTS:handle_rts_fun();break;……}这里获取handle_fun的方法可以换成函数指针和查表的方法。处理函数都在初始化的过程中,放在*handle_fun[MAX]对应的位置int(*handle_fun[MAX])(structmsg_t*msg);intmsg_type=msg->type;handle_fun[msg_type](msg);//就是这个方法在linux网络协议中用的比较多。一般对应的查表方式是哈希表结构。sturct和union的使用在使用sturcut的时候,必须要考虑字节对齐的问题。在struct中,排列顺序和sizeof不同,所以要调整位置,保证struct的size最小。union的使用,比如不同包的数据结构是不一样的,所以尽量使用union来区分不同的包结构,这样程序的可读性更好。volatile的使用是驱动程序编程中一个非常有用的标志。目的是防止编译器优化当前变量。特别是涉及到硬件寄存器的值时。乘法和除法的简化乘法和除法操作对于arm来说太致命了。arm的乘法和除法生成一堆汇编指令来完成。因此,一般可以通过移位、取低位等位操作进行适当的简化。例如,a*8=a<<3;内联函数对于实现比较简单的函数,以及调用非常普通的函数的函数,可以在函数前加上内联标志。这样在生成编译的时候可以更有效。它还可以替代更复杂的定义语句。
