历史上的今天
返回首页

历史上的今天

今天是:2025年02月14日(星期五)

正在发生

2020年02月14日 | PICC——嵌入汇编

2020-02-14 来源:eefocus

简介:单片机系统强调的是控制的实时性,为了实现这一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。这样,一个项目中就会出现 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语言程序

推荐阅读

史海拾趣

Frequency Electronics Inc公司的发展小趣事

高频电子的业务范围广泛且多元化,主要包括FEI-NY、Gillam-FEI和FEI-Zyfer三个部门。FEI-NY部门主要负责纽约总部设施和子公司FEI-Asia与FEI-Elcom的运营;Gillam-FEI部门则负责比利时与法国的业务,并专注于电缆网络同步产品的设计、研发和生产;FEI-Zyfer部门则主要经营公司加州业务,并设计生产附带GPS技术的产品。这种多元化业务布局不仅降低了公司的经营风险,还实现了各业务之间的战略协同和资源共享。

Broadcom(博通)公司的发展小趣事

进入21世纪,随着网络泡沫的破灭,博通陷入了严重的财务困境。亏损累计高达65亿美元,股价大幅下跌,公司甚至不得不裁员以维持运营。然而,正是在这样的困境中,博通展现出了坚韧不拔的精神。通过优化产品结构、调整市场策略,博通逐渐走出了低谷,并在2003年推出了全球第一个802.11b单片机,重新赢得了市场的关注。

Eurosil Electronics Ltd公司的发展小趣事

作为一家有社会责任感的企业,Eurosil始终关注社会公益事业。公司积极参与各种公益活动,如捐赠教育设施、支持贫困地区发展等。通过这些活动,Eurosil不仅回馈了社会,也提升了企业的社会形象和品牌价值。同时,公司还鼓励员工参与志愿服务活动,培养员工的公益意识和社会责任感。

Andersen Laboratories Inc公司的发展小趣事

自1997年成立以来,AnalogicTech便致力于技术创新,不断推动电子行业的发展。公司总部位于硅谷,设计中心则分布在圣塔克拉拉和上海,汇聚了全球顶尖的研发人才。凭借深厚的技术底蕴和创新能力,AnalogicTech成功研发出一系列具有颠覆性的产品,为当今最具创造性的消费品提供了强大的技术支持。

EPSON公司的发展小趣事

随着业务的不断发展,EPSON开始积极拓展国际市场。公司先后在全球五大洲设立了多个生产和研发机构,以及销售和服务网点,以便更好地服务全球客户。通过不断拓展海外市场,EPSON逐渐实现了全球化战略,其产品和服务已经覆盖全球多个国家和地区。

ETTINGER公司的发展小趣事

在快速发展的电子行业中,Ettinger始终坚持传统工艺和品质至上的原则。公司不仅仍然由Ettinger家族所有,所有的产品制作也依然保持纯手工制作,以确保每一件产品都达到最高的品质标准。这种对品质和工艺的执着追求,使得Ettinger在竞争激烈的电子行业中独树一帜,赢得了消费者的信任和尊重。

问答坊 | AI 解惑

44B0X中文资料.大家支持下

44B0X中文资料.大家支持下…

查看全部问答>

PCB上的模拟地和数字地有什么区别

各位兄台,咨询个问题,PCB上的模拟地和数字地有什么区别?模拟地和数字地接到哪里去?信号地是不是也有讲究…

查看全部问答>

关于eboot的依赖lib的编译

小弟在编译EBOOT的时候发现fulllibc.lib这个库一直找不到在哪里编译出来, 有人试过,依次的编译eboot的所需要的库吗?…

查看全部问答>

VC2005做的pocket pc程序怎么能让界面不在自动全屏?

用vs.net2005中的C++做的pocketpc程序运行后界面总是自动全屏化,该怎么解决?…

查看全部问答>

51单片机串口发送问题

为什么我这样不能发?那个TI不处理我至少应该收到一个啊?                              for(m=0;m…

查看全部问答>

用分立元器件怎样做射频卡?

各位大牛好,我最近参加了学校的电子设计竞赛,做的题目是《RFID打卡器和射频卡设计》,题目要求射频卡不能直接用现成的卡,像Mifare 1k(s50)这样的。从拿到题目到现在几天了,我都没搞懂怎样用分立元件做射频卡 ,恳求大侠们指点一下 。…

查看全部问答>

哪位大侠可以给我完整深入的说一下TMS320F2812,我的毕业设计要用到

哪位大侠可以给我完整深入的说一下TMS320F2812,我的毕业设计做的就是DSP,因为没学过,所以现在用就很吃力。 希望那个大哥大姐帮我一下,越详细越好,一些硬件结构,外部电路,寄存器设置等等,谢谢了。…

查看全部问答>

MDK环境下编译LM3S8962程序出现RL-ARM is not allowed with this license

.\\Obj\\Memory.axf: Error: L9937E: RL-ARM is not allowed with this license, 该问题是没有支持Real-Time OS功能,需要在license中加入这个,如下图所示,就可以正常编译了 [ 本帖最后由 hansonhe 于 2012-3-20 14:06 编辑 ]…

查看全部问答>

STM32由入门到精通2012年3月版

STM32由入门到精通2012年3月版,很值得看看!!!! …

查看全部问答>