土豪这个词用在接下来要出场的C语言再合适不过了。他们在嵌入式C语言里占尽了奢华,但是毕竟我们更需要一个节约型的微生态环境。在这里简单给大家分析一下嵌入式C语言编程时用到的除法与移位。
除法土豪
除法在嵌入式微处理器里可算是一个消耗大户,复杂的实现方式不仅占用了大师宝贵的计算时间而且精度有限情况下占用了大片的RAM。因此,常常在各类文章里看到,编程人员应该使用右移运算来代替除法。这个右移方法没有问题,也确实能提高微处理器的计算能力,节省处理时间。但是,我们必须要注意到,这种方式只适用于整数运算的2的倍数的除法,即除以2、4、8、16等数值。“尽量使用右移来替代除法”这个说法,我是不赞成的。主要因为目前的编程环境都可以优化,像这种以2的倍数的除法,编译器如果认为移位运算要好于除法,那么其就会自觉地编译成为移位运算,而无须用户干预。
这里我们再假设一种情况:我们在进行一次数据采集处理,每组数据共16个,然后我们通过迭代的方式将这16个数据求和,然后,再右移4位(除以16)。可是,也许这里就为我们日后的更新程序埋一下了个重大隐患。恰巧我们求和的迭代次数是通过一个#define来定义的,而某次采集我们不需要16个数据,而是15个,我们将其更新为15。这样,我们就不得不再重新设计、编写我们的程序——将无聊的移位全部换成除法。当然,如果我们没有意识到这次求平均的除数是移位4次的问题,那么,15个数据将仍然被除以16以求平均,结果可想而知。
用移位操作时用移位,用除法是就是除法
软件的各种bug,有些是来自原作者,而更多的是来自那些对程序的更新、维护、移植时所造成的。因此,软件代码的应该有较强的可读性与良好的可移植性。除非是那些特殊的函数与结构自己来搞定,大部分的优化还是交给编译器去做吧!