PIC 单片机 C 语言编程简介(4)
如何才能在编写程序时知道
这些局部变量的寻址符号(具体地址在最后连接后才能决定,编程时无需关心)。一个最实
用也是最可靠的方法是先编写一小段
考图 11-5(B)对话框选择“Compile to assembly only”,把此 C 原代码编译成对应的 PICC 汇
编指令;查看 C 编译器生成的汇编指令是如何寻址这些局部变量的,你自己编写的行内汇
编指令就采用同样的寻址方式。例如,例 11-12 的一小段 C 原代码编译出的汇编指令
//C 原程序代码
void Test(unsigned char inVar1, inVar2)
{
inVar1++;
inVar2--;
tmp1 = 1;
tmp2 = 2;
}
//编译器生成的汇编指令
_Test
;
_Test$tmp1 set
?a_Test
;
_Test$tmp2 set
?a_Test+1
;
_Test$inVar1 set ?a_Test+2
44line
;_inVar1 stored from w
bcf
bcf
movwf ?a_Test+2
//第一个字符型行参由 W 寄存器传递
;ht16.c: 43: unsigned char tmp1, tmp2;
incf
45line
;ht16.c: 45: inVar2--;
decf
46line
;ht16.c: 46: tmp1 = 1;
clrf
incf
47line
;ht16.c: 47: tmp2 = 2;
movlw 2
movwf ?a_Test+1
48line
;ht16.c: 48: }
return
//行参 inVar2 的寻址符为 ?_Test
例 11-12
基于上面得到的 PICC 编译后局部变量的寻址方式,我们在 C 语言程序中用嵌入汇编指
令时必须采样同样的寻址符以实现对应变量的存取操作,见下面的例 11-13。
//C 原程序代码
void Test(unsigned char inVar1, inVar2)
{
#asm
//开始嵌入汇编
incf
decf
movlw
addwf
rrf
0x10
?a_Test+0,f
?a_Test+1,f
?a_Test+2,f
?_Test,w
//tmp1++;
//tmp2--;
//inVar1 +=
//inVar2 循环右移一位
}
rrf
#endasm
?_Test,f
//结束嵌入汇编
例 11-13
如果局部变量为多字节形式组成,例如整型数、长整型等,必须按照 PICC 约定的存储
格式进行存取。前面已经说明了 PICC 采用“Little endian”格式,低字节放在低地址,高字
节放在高地址。下面的例 11-14 实现了一个整型数的循环移位,在 C 语言中没有直接针对循
环移位的语法操作,用标准 C 指令实现的效率较低。
//16 位整型数循环右移若干位
unsigned int RR_Shift16(unsigned int var, unsigned char count)
{
}
while(count--)
{
#endasm
}
return(var);
//移位次数控制
//开始嵌入汇编
//最低位送入 C
//var 高字节右移 1 位,C 移入最高位
//var 低字节右移 1 位
//结束嵌入汇编
//返回结果
例 11-14
11.9.4
C
最佳的配合。笔者从实际应用中得到一些经验供读者一起分享。
㈠
相比于汇编语言,用 C
语句指令加上模块化的程序易于日常管理和维护、程序在不同平台间的移植方便。所以既然
用了 C 语言编程,就尽量避免使用嵌入汇编指令或整个地编写汇编指令模块文件。PICC 已
具备高效的优化功能,如果在写 C 原程序时就十分注意程序的编译和运行效率问题,加上
PICC 的后道编译优化,最后得到的代码效率不会比全部用汇编编写的代码差多少,尤其是
程序量较大时。另外,PICC 对数据存储空间的利用率肯定比用户人工定位变量时的利用率
要高,同时还提供完整的库函数支持。C 语言的语法功能强大,能够高效率地实现绝大部分
控制和运算功能。因此,除了一些十分强调单片机运行时间的代码或 C 语言没有直接对应
的操作可以考虑用汇编指令实现外,其它部分都应该用 C 语言编写。
以上面的例 11-14 进一步说明,变量的循环右移操作用 C 语言实现非常不方便,PIC 单
片机已有对应的移位操作汇编指令,因此用嵌入汇编的形式实现效率最高。同时对移位次数
的控制,本质上说变量 count 的递减判零也可以直接用汇编指令实现,但这样做节约不了多
少代码,用标准的 C 语言描述更直观,更易于维护。
一句话:用了 C 语言后,就不要再老想着用汇编。
㈡
这和上面的慎用汇编指令的说法并不矛盾。如果确实需要用汇编指令实现部分代码以提
高运行效率,应尽量使用行内汇编,避免编写纯汇编文件(*.as 文件
PIC单片机C语言编 相关文章:
- PIC单片机C语言编程教程(1)(11-22)
- PIC 单片机 C 语言编程简介(2)(11-22)
- PIC 单片机 C 语言编程简介(3)(11-22)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)