历史上的今天
今天是:2025年06月21日(星期六)
2018年06月21日 | Keil C51对C语言的关键词扩展之十八:using
2018-06-21 来源:eefocus
在8051系列单片机中,内部ram的前32个字节被分为4组,每组8个寄存器。每组的8个寄存器名字都为R0-R7。通过设置PSW寄存器的两个位,可以选择使用4组寄存器中的哪一组。
寄存器组在处理中断或者使用实时操作系统时非常有用,可以在进入中断或者切换任务时使用不同寄存器组,而不用把8个寄存器的内容保存到堆栈。在退出中断或返回原任务时,只需切换回原来的寄存器组即可。
指定一个函数使用的寄存器组:
void rb_function (void) using 3
{
.
.
.
}using后跟数字0-3,不允许使用符号表达式指定代替该数字常量。只有定义函数时才可使用using关键词,在做函数原型声明时不允许使用using关键词。
using声明的函数具有以下特征:
1)函数入口处,当前使用的寄存器组被保存到堆栈;
2)指定的寄存器组被设置;
3)函数退出前,原来的寄存器组被恢复;
下面展示了using的用法,请注意生成的汇编程序中函数入口、出口处的代码:
C程序:
1
2 extern bit alarm;
3 int alarm_count;
4 extern void alfunc (bit b0);
5
6 void falarm (void) using 3 {
7 1 alarm_count++;
8 1 alfunc (alarm = 1);
9 1 }
生成的汇编程序:
0000 C0D0 PUSH PSW /* 函数入口处,将原来的寄存器组保存到堆栈 */
0002 75D018 MOV PSW,#018H /* 切换到新的寄存器组 */0005 0500 R INC alarm_count+01H 0007 E500 R MOV A,alarm_count+01H 0009 7002 JNZ ?C0002 000B 0500 R INC alarm_count 000D ?C0002: 000D D3 SETB C 000E 9200 E MOV alarm,C 0010 9200 E MOV ?alfunc?BIT,C 0012 120000 E LCALL alfunc
0015 D0D0 POP PSW /* 函数退出前,切换到原来的寄存器组 */ 0017 22 RET
返回值保存在寄存器中的函数不能使用using。
即使使用相同的寄存器组,使用using的函数也不能返回bit类型的值。
using通常在中断服务函数定义时使用,我们可以为不同的中断服务函数指定不同的寄存器组,这样可以减少堆栈操作,提高程序运行效率。
史海拾趣
|
选用的是TMS320C6713 外挂FLASH和SDRAM 程序分为3部分 1K bootload汇编程序 基本通信程序 算法主程序 上电后EDMA自动从FLASH加载1K bootload代码到IRAM,利用bootload程序将基本通信程序加载到IRAM,利用_c_int00跳转到基本通信程序执行。再利用 ...… 查看全部问答> |
|
在飞凌S3C6410开发板上成功移植VXWORKS嵌入式操作系统! 本文出自 飞凌嵌入式官方网站 www.witech.com.cn VXWORKS是当今最稳定可靠的嵌入式实时操作系统,TE6410作为高端嵌入式开发板,已经被成功移植 VXWORKS,附件为相关文档(版权问题,部分内容未能发布,此文档仅作为参考,希望对朋友们 ...… 查看全部问答> |
|
我是一名新手,我用wince5.0编译一个新建的PB的时候,提示有下面的错误: making: FATAL ERROR:Cannot open F:\\新建文件夹\\2222\\Reldir\\smdk2440a_ARMV4I_Relea\\postproc\\platform.bib making: FATAL ERROR:Cannot open F:\\新建文件夹\\ ...… 查看全部问答> |
|
OSCCON=0x70; //内部时钟8Mhz PORTD=0; TRISD=0; T0CON=0x05; //关定时器,16位,内部时钟源,64分频 TMR0H=??; //0.1s TMR0L=?? 如何计算这两个值使时间为0.1s?在线等啊 我算出来一直多了2倍 诶… 查看全部问答> |
|
在下列定义中 struct HISPCP_BITS { // bits description Uint16 HSPCLK:3; // 2:0 Rate relative to SYSCLKOUT Uint16 rsvd1:13; & ...… 查看全部问答> |
|
LPC1114在keil MDK下载报错flash timeout 各位大大! 我的原理图 利用keilV4.13a下载的时候,总是如下报错: 但是,Utilities setting中已显示检测到ARM core,如下图: 网上百度了很多,感觉是flash算法的问题,请问哪位大大能帮我看看? 原理图上reset管脚直接置高的作 ...… 查看全部问答> |
|
关于单片机IO电压3.3V和5V的区别和优缺点?概念很模糊。 就51系列而言,单片机电压有3.3伏和5伏之分。各IO口输入输出高低电平时电压允许值可看芯片手册,相关驱动电流也可以查看到。但不解的是:5v的单片机能不能驱动或说使3.3v的器件工作,会有什么副作用?反过来又怎么样?… 查看全部问答> |
|
一、电路原理图准备 一节镍氢电池的电压只有1.2V,而超高亮LED需要3.3V以上的工作电压才能保证足够的亮度。因此。必须设法将电压升高,常见的升压电路一般有二种形式,即高频振荡电路和电磁感应升压电路。对于升压电路,有两种电路 ...… 查看全部问答> |




