PIC单片机 C编程技巧
时间:11-13
来源:互联网
点击:
总线的读字节为例,原厂的代码是:
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i = 0; i < 8; i++)
{
if(read_bit()) value| = 0 x 01// reads byte in, one byte at a time and then
// shifts it left
delay(10); // wait for rest of timeslot
}
return(value);
}
虽 然可以用,但编译后执行效率并不高效,这也是很多朋友认为C 一定不能和汇编相比的认识提供了
说法。其实完全可以深入了解C 和汇编之间的关系,写出非常高效的C 代码,既有C 的便利,又有汇编的
效率。首先对 for (i = 0; i < 8;
i++) 做手术,改成递减的形式:for(i=8;i!=0;i--),因为CPU 判断一个数是否是0
(只需要一个指令),比判断一个数是多大来的快 (需要3 个指令)。再对value| = 0 x 01value| = 0 x 01
仔细研究C 语言的位移操作,可以发现C 总是先把标志位清0,然后再把此位移入字节中,也就是说,当
前移动进字节的位一定是0。那么,既然已经是0 了,我们就只剩下一个步骤:判断总线状态是否是高来
决定是否改写此位,而不需要判断总线是低的情况。于是改写如下代码:
for(i=8;i!=0;i--){
value>>=1; //先右移一位,value 最高位一定是0
if(read_bit()) value|=0x80; //判断总线状态,如果是高,就把value 的最高位置1
}
这样一来,整个代码变得极其高效,编译后根本就是汇编级的代码。再举一个例 子:
在采集信号方面,经常是连续采集N 次,最后求其平均值。
一般的,无论是用汇编或C,在采集次数上都推荐用8,16,32、64、 128、256 等次数,因为这些数都比
较特殊,对于MCU 计算有很大好处。
我们以128 次采样为例:注:sampling()为外部采样函数。
unsigned int total;
unsigned char i,val;
for(i=0;i<128;i++){
total+=sampling();
}
val=total/128;
以 上代码是很多场合都可以看见的,但是效率并不怎么样,狂浪费资源。
结合C 和汇编的关系,再加上一些技巧,就可以写出天壤之别的汇编级的C 代码出来,首先分析128 这个
数是0B10000000,发现其第7 位是1,其他低位全是0,那么就可以判断第7 位的状态来判断是否到了128
次采样次数。在分析除以128 的运算,上面的代码用了除法运算,浪费了N 多资源,完全可以用右移的方
法 来代替之,val=total/128 等同于val=(unsigned
char)(total>>7);再观察下 去:total>>7 还可以变通成
(total<1)>>8,先左移动一位,再右移动8 位,不就成了右移7 位了么?可知道位移1,4,8 的操作只需要
一个指令哦。有上面的概验了,就可以写出如下的代码:
unsigned int total;
unsigned char i=0
unsigned char val;
while(!(i&0x80)){ //判断i 第7 位,只需要一个指令。
total+=sampling();
i++;
}
val=(unsigned char)((total<1)>>8); //几个指令就代替了几十个指令的除法运算
哈哈,发现什么?代码量竟然 可以减少一大半,运算速度可以提高几倍。
再回头,就可以理解为什么采样次数要用推荐的一些特殊值了。
9、C 程序优化
对程序进行 优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予
盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果 优化了程序的执行速度,通常会带
来代码增加的副作用,很难鱼与熊掌兼得,只能在设计时掌握一个平衡点。
一、程序结构的优化
1、程 序的书写结构
虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一
个书写清晰、明了的程序,有利 于以后的维护。在书写程序时,特别是对于While、for、do…while、if…elst、
switch…case 等语句或这些语句嵌套组合时,应采用“缩格”的书写形式,
2、标识符
程序中使用的用户标识符除要遵循标识符的命名规则以外,一般不要用代 数符号(如a、b、x1、y1)作
为变量名,应选取具有相关含义的英文单词(或缩写)或汉语拼音作为标识符,以增加程序的可读性,如:
count、 number1、red、work 等。
3、程序结构
C 语言是一种高级程序设计语言,提供了十分完备的规范化流程控制结构。因此在采用C 语言设计单
片机应用系统程序时,首先要注意尽可能采用结构化的 程序设计方法,这样可使整个应用系统程序结构清
晰,便于调试和维护。于一个较大的应用程序,通常将整个程序按功能分成若干个模块,不同模块完成不
同 的功能。各个模块可以分别编写,甚至还可以由不同的程序员编写,一般单个模块完成的功能较为简单,
设计和调试也相对容易一些。在C 语言中,一个函数就可以认为是一个模块。所谓程序模块化,不仅是要
将整个程序划分成若干个功能模块,更重要的是,还应该注意保持各个模块之间变量 的相对独立性,即保
持模块的独立性,尽量少使用
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i = 0; i < 8; i++)
{
if(read_bit()) value| = 0 x 01// reads byte in, one byte at a time and then
// shifts it left
delay(10); // wait for rest of timeslot
}
return(value);
}
虽 然可以用,但编译后执行效率并不高效,这也是很多朋友认为C 一定不能和汇编相比的认识提供了
说法。其实完全可以深入了解C 和汇编之间的关系,写出非常高效的C 代码,既有C 的便利,又有汇编的
效率。首先对 for (i = 0; i < 8;
i++) 做手术,改成递减的形式:for(i=8;i!=0;i--),因为CPU 判断一个数是否是0
(只需要一个指令),比判断一个数是多大来的快 (需要3 个指令)。再对value| = 0 x 01value| = 0 x 01
仔细研究C 语言的位移操作,可以发现C 总是先把标志位清0,然后再把此位移入字节中,也就是说,当
前移动进字节的位一定是0。那么,既然已经是0 了,我们就只剩下一个步骤:判断总线状态是否是高来
决定是否改写此位,而不需要判断总线是低的情况。于是改写如下代码:
for(i=8;i!=0;i--){
value>>=1; //先右移一位,value 最高位一定是0
if(read_bit()) value|=0x80; //判断总线状态,如果是高,就把value 的最高位置1
}
这样一来,整个代码变得极其高效,编译后根本就是汇编级的代码。再举一个例 子:
在采集信号方面,经常是连续采集N 次,最后求其平均值。
一般的,无论是用汇编或C,在采集次数上都推荐用8,16,32、64、 128、256 等次数,因为这些数都比
较特殊,对于MCU 计算有很大好处。
我们以128 次采样为例:注:sampling()为外部采样函数。
unsigned int total;
unsigned char i,val;
for(i=0;i<128;i++){
total+=sampling();
}
val=total/128;
以 上代码是很多场合都可以看见的,但是效率并不怎么样,狂浪费资源。
结合C 和汇编的关系,再加上一些技巧,就可以写出天壤之别的汇编级的C 代码出来,首先分析128 这个
数是0B10000000,发现其第7 位是1,其他低位全是0,那么就可以判断第7 位的状态来判断是否到了128
次采样次数。在分析除以128 的运算,上面的代码用了除法运算,浪费了N 多资源,完全可以用右移的方
法 来代替之,val=total/128 等同于val=(unsigned
char)(total>>7);再观察下 去:total>>7 还可以变通成
(total<1)>>8,先左移动一位,再右移动8 位,不就成了右移7 位了么?可知道位移1,4,8 的操作只需要
一个指令哦。有上面的概验了,就可以写出如下的代码:
unsigned int total;
unsigned char i=0
unsigned char val;
while(!(i&0x80)){ //判断i 第7 位,只需要一个指令。
total+=sampling();
i++;
}
val=(unsigned char)((total<1)>>8); //几个指令就代替了几十个指令的除法运算
哈哈,发现什么?代码量竟然 可以减少一大半,运算速度可以提高几倍。
再回头,就可以理解为什么采样次数要用推荐的一些特殊值了。
9、C 程序优化
对程序进行 优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予
盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果 优化了程序的执行速度,通常会带
来代码增加的副作用,很难鱼与熊掌兼得,只能在设计时掌握一个平衡点。
一、程序结构的优化
1、程 序的书写结构
虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一
个书写清晰、明了的程序,有利 于以后的维护。在书写程序时,特别是对于While、for、do…while、if…elst、
switch…case 等语句或这些语句嵌套组合时,应采用“缩格”的书写形式,
2、标识符
程序中使用的用户标识符除要遵循标识符的命名规则以外,一般不要用代 数符号(如a、b、x1、y1)作
为变量名,应选取具有相关含义的英文单词(或缩写)或汉语拼音作为标识符,以增加程序的可读性,如:
count、 number1、red、work 等。
3、程序结构
C 语言是一种高级程序设计语言,提供了十分完备的规范化流程控制结构。因此在采用C 语言设计单
片机应用系统程序时,首先要注意尽可能采用结构化的 程序设计方法,这样可使整个应用系统程序结构清
晰,便于调试和维护。于一个较大的应用程序,通常将整个程序按功能分成若干个模块,不同模块完成不
同 的功能。各个模块可以分别编写,甚至还可以由不同的程序员编写,一般单个模块完成的功能较为简单,
设计和调试也相对容易一些。在C 语言中,一个函数就可以认为是一个模块。所谓程序模块化,不仅是要
将整个程序划分成若干个功能模块,更重要的是,还应该注意保持各个模块之间变量 的相对独立性,即保
持模块的独立性,尽量少使用
PIC单片机C编程技 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)