历史上的今天
返回首页

历史上的今天

今天是: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通常在中断服务函数定义时使用,我们可以为不同的中断服务函数指定不同的寄存器组,这样可以减少堆栈操作,提高程序运行效率。


推荐阅读

史海拾趣

CONTTEK Group GmbH公司的发展小趣事

CONTTEK Group GmbH公司深知品质是企业的生命线。因此,公司建立了严格的质量管理体系,从原材料的采购到产品的生产、检测、包装等每一个环节都进行严格把控。这种对品质的执着追求,使得公司的产品赢得了客户的广泛信赖和好评。许多知名电子企业都选择与CONTTEK Group GmbH公司建立长期合作关系,共同推动电子行业的发展。

CETC公司的发展小趣事

作为一家大型国有企业,CETC始终将社会责任放在首位。公司积极参与社会公益事业,捐款捐物支持灾区重建和贫困地区的教育事业。同时,CETC还注重环保和可持续发展,在生产过程中采用环保材料和工艺,降低对环境的影响。这些举措不仅提升了公司的社会形象,也赢得了社会各界的广泛赞誉。

以上五个故事分别从科研突破、产业合作、海外市场布局、人才培养与团队建设以及社会责任等方面描述了CETC公司的发展过程。这些故事都是基于CETC在电子行业中的实际表现和公开资料进行的创作,旨在客观展现公司的发展历程和成就。当然,CETC的发展故事远不止这些,更多精彩的故事还需要我们进一步去发掘和了解。

Avel Lindberg公司的发展小趣事

为了进一步提升公司的国际影响力,CETC开始积极布局海外市场。公司先后在美国、欧洲等地设立了研发中心和分支机构,与当地企业开展深度合作,共同研发适应市场需求的产品。同时,CETC还积极参加国际电子展会和论坛,展示公司的最新技术和产品,吸引了众多国际客户的关注。通过这些努力,CETC成功打开了海外市场的大门,为公司的长远发展注入了新的动力。

Asia Electronics Ind Co Ltd公司的发展小趣事

面对日益激烈的市场竞争,Asia Electronics Ind Co Ltd深知优化供应链管理的重要性。公司加强与供应商的合作与沟通,确保原材料的质量和供应的稳定性。同时,公司还引入先进的供应链管理系统,实现供应链的透明化和高效化。通过优化供应链,公司降低了生产成本,提高了生产效率,为公司的持续发展提供了有力保障。

E-T-A [E-T-A Circuit Breakers]公司的发展小趣事

E-T-A公司自创立以来,一直由Ellenberger和Poensgen家族掌控。家族成员代代相传,将公司的传统和价值观延续至今。同时,公司也注重培养新一代的管理和技术人才,为公司的持续发展注入新的活力。在家族传承的基础上,E-T-A公司不断追求创新,致力于为客户提供更加优质的产品和服务。

EPCOS (TDK)公司的发展小趣事

自成立以来,EPCOS一直致力于技术创新和产品拓展。公司不断投入研发资源,开发出了一系列高性能、高品质的电子元器件产品。这些产品广泛应用于通信、消费、汽车和工业电子等领域,赢得了众多客户的信赖和好评。同时,EPCOS还积极拓展国际市场,与全球众多知名企业建立了长期稳定的合作关系。

问答坊 | AI 解惑

变压器知识

[U][ip] 变压器是变换交流电压、电流和阻抗的器件,当初级线圈中通有交流电流时,铁芯(或磁芯)中便产生交流磁通,使次级线圈中 感应出电压(或电流)。变压器由铁芯(或磁芯)和线圈组成,线圈有两个或两个以上的绕组,其中接电源的绕组叫初 ...…

查看全部问答>

DSP 程序动态加载问题

选用的是TMS320C6713 外挂FLASH和SDRAM 程序分为3部分 1K bootload汇编程序 基本通信程序 算法主程序 上电后EDMA自动从FLASH加载1K bootload代码到IRAM,利用bootload程序将基本通信程序加载到IRAM,利用_c_int00跳转到基本通信程序执行。再利用 ...…

查看全部问答>

在飞凌S3C6410开发板上成功移植VXWORKS嵌入式操作系统!

本文出自 飞凌嵌入式官方网站  www.witech.com.cn VXWORKS是当今最稳定可靠的嵌入式实时操作系统,TE6410作为高端嵌入式开发板,已经被成功移植 VXWORKS,附件为相关文档(版权问题,部分内容未能发布,此文档仅作为参考,希望对朋友们 ...…

查看全部问答>

PB编译的时候遇到错误,哪位能帮我一下啊,谢谢!

我是一名新手,我用wince5.0编译一个新建的PB的时候,提示有下面的错误: making: FATAL ERROR:Cannot open F:\\新建文件夹\\2222\\Reldir\\smdk2440a_ARMV4I_Relea\\postproc\\platform.bib making: FATAL ERROR:Cannot open F:\\新建文件夹\\ ...…

查看全部问答>

pic18f452定时器中断问题

OSCCON=0x70; //内部时钟8Mhz PORTD=0; TRISD=0; T0CON=0x05; //关定时器,16位,内部时钟源,64分频 TMR0H=??; //0.1s    TMR0L=?? 如何计算这两个值使时间为0.1s?在线等啊 我算出来一直多了2倍 诶…

查看全部问答>

请教STM32USBIAP!!

我做一个HID类设备,需要加IAP功能,但是不想用做两个设备。也就是说我要用HID类设备来更新程序,不用STM的DFU。…

查看全部问答>

请教uint16定义

在下列定义中 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的器件工作,会有什么副作用?反过来又怎么样?…

查看全部问答>

DIY一节7号电池点亮超高亮LED做停电应急用

一、电路原理图准备     一节镍氢电池的电压只有1.2V,而超高亮LED需要3.3V以上的工作电压才能保证足够的亮度。因此。必须设法将电压升高,常见的升压电路一般有二种形式,即高频振荡电路和电磁感应升压电路。对于升压电路,有两种电路 ...…

查看全部问答>