PICC——嵌入汇编

2020-02-14来源: eefocus关键字:PICC  嵌入汇编  实时性

简介:单片机系统强调的是控制的实时性,为了实现这一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。这样,一个项目中就会出现 C 和汇编混合编程的情形,我们在此讨论一些混合编程的基本方法和技巧。


有两个原因决定了用 C 语言进行单片机应用程序开发时使用汇编语句的必要性:


单片机的一些特殊指令操作在标准的 C 语言语法中没有直接对应的描述,例如 PIC 单片机的清看门狗指令“clrwdt”和休眠指令“sleep”;


单片机系统强调的是控制的实时性,为了实现这一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。这样,一个项目中就会出现 C 和汇编混合编程的情形,我们在此讨论一些混合编程的基本方法和技巧。


嵌入行内汇编的方法


在 C 原程序中直接嵌入汇编指令是最直接最容易的方法。如果只需要嵌入少量几条的汇编指令,PICC 提供了一个类似于函数的语句:

asm("clrwdt")

双引号中可以编写任何一条 PIC 的标准汇编指令。例如:

for (;;) {

asm("clrwdt"); //清看门狗

Task();

ClockRun();

asm("sleep"); //休眠

asm("nop"); //空操作延时

}


如果需要编写一段连续的汇编指令,PICC 支持另外一种语法描述:用“#asm”开始汇编指令段,用“#endasm”结束。例如下面的一段嵌入汇编指令实现了将 0x20~0x7F 间的

RAM 全部清零:

#asm

movlw 0x20

movwf _FSR

clRF _INDF

incf _FSR,f

btfss _FSR,7

goto $-3

#endasm


C 语言中定义的全局或静态变量寻址是最容易的,因为这些变量的地址已知且固定。按C 语言的语法标准,所有 C 中定义的符号在编译后将自动在前面添加一下划线符“_”,因此,若要在汇编指令中寻址 C 语言定义的各类变量,一定要在变量前加上一“_”符号,我们在上面例中已经体现了这一变量引用的法则,因为 FSR 和 INDF 等所有特殊寄存器是以 C 语言语法定义的,因此汇编中需要对其寻址时前面必须添加下划线。


对于 C 语言中用户自定义的全局变量,用行内汇编指令寻址时也同样必须加上“_” ,下面的例 11-10 说明了具体的引用方法:

volatile unsigned char tmp; //定义位于bank0的字符型全局变量


void Test(void) //测试程序

{

#asm //开始行内汇编

clrf _STATUS //选择bank0

movlw 0x10 //设定初值

movwf _tmp //tmp=0x10

#endasm //结束行内汇编

if (tmp==0x10) { }; //开始C语言程序

关键字:PICC  嵌入汇编  实时性 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488249.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PICC——基本知识(变量)
下一篇:PICC ME16 C简要说明书

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PICC ---- 函数
简介:一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 2K字长的限制一般不会对程序代码的编写产生太多影响。函数的代码长度限制PICC决定了C原程序中的一个函数经编译后生成的机器码一定会放在同一个程序页面内。中档系列的 PIC 单片机其一个程序页面的长度是 2K字,换句话说,用 C 语言编写的任何一个函数最后生成的代码不能超过 2K字。一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 2K字长的限制一般不会对程序代码的编写产生太多影响。如果为实现特定的功能确实要连续编写很长的程序,这时就必须把这些连续的代码拆分成若干函数,以保证每个
发表于 2020-02-13
PICC ---- 各种变量修饰
volatile — 易变型变量声明PICC 中还有一个变量修饰词在普通的 C 语言介绍中一般是看不到的,这就是关键词“volatile”。顾名思义,它说明了一个变量的值是会随机变化的,即使程序没有刻意对它进行任何赋值操作。在单片机中,作为输入的 IO端口其内容将是随意变化的;在中断内被修改的变量相对主程序流程来讲也是随意变化的;很多特殊功能寄存器的值也将随着指令的运行而动态改变。所有这种类型的变量必须将它们明确定义成“volatile”类型,例如:volatile unsigned char STATUS @ 0x03;volatile bit commFlag;“volatile”类型定义在单片机的 C 语言编程中是如此的重要,是因为
发表于 2020-02-13
PICC中主程序和中断调用同一个子程序的问题
#pragma interrupt_level 1void function (void){}然后在中断函数那写句#pragma interrupt_level 1void interrupt(void){function();}void main (void){function();}程序中出现重入现象是错误的。PICC具有的重入保护可以防止这种现象的出现。换言之,在PIC架构的单片机中,楼主的做法是错误的。主程序和中断程序是不允许调用同一子程序的。比如子程序A,在主程序中被调用,这时发生中断,该子程序又在中断程序中被调用,这时就发生程序重入。在别的构造的单片机中,如果堆栈可以扩展,则重入问题可以解决,但PIC的堆栈的层数固定
发表于 2020-02-13
PIC8位在PICC中的数据类型
简介:PIC8位MCU的内存都是8位字节结构的,所以PICC中对于数据的划分都是以8位为基础的。在汇编中,我们对一个地址为0X20的内存附值:movlw 255;movwf 0x20;但一个内存是8位结构,能表示最大的数是255。要是超过了会怎么样呢?movlw 256;movwf 0x20;通过DEBUG后,可以看出0X20中的值不是256,而是0了。这里可以看出PIC处理器计算过程是当计算结果超过内存能容纳的最大数(也就是所谓溢出),则自动抛弃最高位。如下:255 - 25611111111-100000000256的2进制有9位,于是PIC处理器就自动抛弃最高位1,剩下的8个0放入内存,于是就成了0了。这过程是由硬件自动
发表于 2020-02-13
PIC单片机如何从汇编转向PICC
一、如何从汇编转向PICC首先要求你要有C语言的基础。C代码的头文件一定要有#include,它是很多头文件的集合,C编译器在pic.h 中根据你的芯片自动载入相应的其它头文件。这点比汇编好用。载入的头文件中其实是声明芯片的寄存器和一些函数。static volaTIle unsigned char TMR0 @ 0x01;staTIc volaTIle unsigned char PCL @ 0x02;staTIc volatile unsigned char STATUS @ 0x03;可以看出和汇编的头文件中定义寄存器是差不多的。如下:TMR0 EQU 0X01;PCL EQU 0X02;STATUS EQU 0X03;都是
发表于 2020-01-06
PIC单片机如何从汇编转向PICC
通过PICC编译环境下,对PIC单片机程序进行操作研究
PICC基本上符合ANSI标准,但是不支持函数的递归调用,其主要原因是PIC单片机特殊的堆栈结构。PIC单片机中的堆栈是硬件实现的,其深度已随芯片固定,无法实现需要大量堆栈操作的递归算法;另外在PIC单片机中实现软件堆栈的效率也不是很高。为此,PICC编译器采用一种“静态覆盖”技术,以实现对C语言函数中的局部变量分配固定的地址空间。经这样处理后产生出的机器代码效率很高。当代码量超过4KB后,C语言编译出的代码长度与全部用汇编代码实现的差别已经不是很大(<10%),当然前提是在整个C代码编写过程中需时时注意所编写语句的效率。PICC中的变量类型和标准C语言一样,这里不再重复。为了使编译器产生最高效的机器码,PICC把单片机中
发表于 2019-12-11
通过PICC编译环境下,对PIC单片机程序进行操作研究
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved