Linux 程序规划的一些优化办法
这些常识是在往常的阅览中,零星的取得的,自己总结了一下,共享在这儿
全局变量VS函数参数
全局变量在Linux下的驱动编程里面,用的是十分多,例如中止服务函数ISR,基本上都能够用全局变量来作为数据的更新,及事情的触发。给函数传递参数的功率一般来说,要低于直接运用全局变量,尤其是参数的数目太多的时分。参数传递,是需求先将参数push到stack中,等程序运转结束,再从stack中pull出来,进程上要比global variable杂乱。可是,全局变量过多的话,这儿面就规划到办理的问题了,到后边就很难去操控这些变量的修正,这关于函数的模块化有晦气的影响。
i=i+1;
i++;
i–;
这三个句子都一般引用在for()或许是while()里面,从履行功率上来说 3》2》1
这和终究生成的汇编语言有关,一般来说,影响不会太夸大。
switch-case句子
switch-case句子,也是用的十分多的句子。
这儿首要的优化准则便是:将发生概率最高的条件,放在最早判别的方位。这样就能够有用的下降
比较的次数,到达更优的作用。或许,有一种更好的办法来代替switch-case句子的办法,便是运用查表
比方
switch(msg_type)
{
case DATA:
handle_data_fun();
break;
case RTS:
handle_rts_fun();
break;
…….
}
这儿就能够用函数指针和查表的办法,取得handle_fun的办法来代替。
处理函数都在初始化的进程中,放到*handle_fun[MAX]相应的方位上
int (*handle_fun[MAX])(struct msg_t *msg);
int msg_type = msg->type;
handle_fun[msg_type](msg);//即可
这种办法,在Linux的网络协议里面,用的十分多,一般对应的查表办法为hash表结构。
sturct 和 union的运用
sturcut 运用,一定要考虑到字节对其的问题,struct中,不同的组织次序,sizeof是不同的所以要调整好方位,尽量确保struct的size最小。
union的运用,比方对不同包的数据结构上,是不一样的,所以尽量运用union来区别不同的包结构这样对程序的可读性比较好。
volatile的运用
这在驱动编程方面是十分有用的一个标志。意图是不让编译器compiler把当时的变量优化掉。尤其是涉及到硬件寄存器的值的时分。
乘除运算的简化
乘除运算,对arm来说太丧命,arm的乘除都生成一堆的汇编指令才干完结。所以一般能够通过位操作,比方移位,取低位来进行恰当的化简。比方 a*8 = a<<3;
Inline 函数
在完成比较简单功用的函数,以及那些调用十分普通的函数,都能够在函数前参加inline的标识。这样在发生汇编的时分,能够更有用。也能够代替较杂乱的define句子。