微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC 单片机 C 语言编程简介(4)

PIC 单片机 C 语言编程简介(4)

时间:11-22 来源:互联网 点击:

如何才能在编写程序时知道

这些局部变量的寻址符号(具体地址在最后连接后才能决定,编程时无需关心)。一个最实

用也是最可靠的方法是先编写一小段 C 代码,其中有最简单的局部变量操作指令,然后参

考图 11-5(B)对话框选择“Compile to assembly only”,把此 C 原代码编译成对应的 PICC 汇

编指令;查看 C 编译器生成的汇编指令是如何寻址这些局部变量的,你自己编写的行内汇

编指令就采用同样的寻址方式。例如,例 11-12 的一小段 C 原代码编译出的汇编指令

//C 原程序代码

void Test(unsigned char inVar1, inVar2)

{

unsigned char tmp1, tmp2;

inVar1++;

inVar2--;

tmp1 = 1;

tmp2 = 2;

}

//编译器生成的汇编指令

_Test

; _tmp1 assigned to ?a_Test+0 //tmp1 的寻址符为 ?a_Test+0


_Test$tmp1 set


?a_Test


; _tmp2 assigned to ?a_Test+1 //tmp2 的寻址符为 ?a_Test+1


_Test$tmp2 set


?a_Test+1


; _inVar1 assigned to ?a_Test+2 //inVar1 的寻址符为 ?a_Test+2

_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 实现局部变量操作的寻址方式

基于上面得到的 PICC 编译后局部变量的寻址方式,我们在 C 语言程序中用嵌入汇编指

令时必须采样同样的寻址符以实现对应变量的存取操作,见下面的例 11-13。

//C 原程序代码

void Test(unsigned char inVar1, inVar2)

{

unsigned char tmp1, tmp2;

#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--)

{

#asm

rrf ?_RR_Shift16+0,w

rrf ?_RR_Shift16+1,f

rrf ?_RR_Shift16+0,f

#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 文件

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top