历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2019年04月18日 | 51单片机中将变量、数组、函数设置在固定位置

2019-04-18 来源:eefocus

一、不带初值的变量或数组


直接使用_at_ 关键字加上地址就行。


如:


 unsigned char idata myvar _at_ 0x40;


 unsigned char code myvar[10] _at_ 0x40;


_at_ 关键字的前后都有空格。


二、带初值的变量或数组


要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,要进行如下操作:

1、在工程中建立一个新的文件,如InitVars.c,在其中对要处理的变量赋初值(假设是code变量):

char code myVer = {"COPYRIGHT 2001-11"};

2、然后将该文件加入工程,编译,打开M51文件,若定义的是code型,则在

* * *   C O D E   M E M O R Y   * * *

下可找到:

CODE    xxxxH     xxxxH     UNIT         ?CO?INITVARS

然后在:

Project->Options for Target ...->BL51 Locate:Code

中填入:

?CO?INITVARS(0x200)

再次编译即可。


1、相应地,如为xdata变量,则InitVars.c中写:

char xdata myVer = {"COPYRIGHT 2001-11"};

然后将该文件加入工程,编译,打开M51文件,在

* * *  X D A T A   M E M O R Y  * * *

下可找到:

XDATA   xxxxH     xxxxH     UNIT         ?XD?INITVARS

然后在:

Project->Options for Target ...->BL51 Locate:Xdata

中填入:

?XD?INITVARS(0x200)

再次编译即可。相应地,若定义的是data/idata等变量,则相应处理即可。


三、函数的定位


假如要把C源文件 tools.c 中的函数

int BIN2HEX(int xx)

{

  ...

}

放在CODE MEMORY的0x1000处,先编译该工程,然后打开该工程的M51文件,在

* * *   C O D E   M E M O R Y   * * *

行下找出要定位的函数的名称,应该形如:

CODE    xxxxH     xxxxH     UNIT         ?PR?_BCD2HEX?TOOLS

然后在:

Project->Options for Target ...->BL51 Locate:Code

中填写如下内容:

?PR?_BCD2HEX?TOOLS(0x1000)

再次Build,在M51中会发现该函数已放在CODE MEMORY的0x1000处了


如果同时定位多个函数,中间用“,”隔开就行了:


   ?PR?myTest1?MAIN(0x3900), ?PR?myTest2?MAIN(0x4000)


四、知道函数地址但不知道函数名字的调用方法(使用函数指针调用绝对地址处的函数)


1、定义调用的函数原形


typedef void (*CALL_MYTEST)(void);


这是一个回调函数的原形, 参数为空.


2、定义相应的函数指针变量


CALL_MYTEST    myTestCall = NULL;


3、函数指针变量赋值, 指向我们定位的绝对地址的函数


myTestCall = 0x3900;


4、函数指针调用


                     if (myTestCall != NULL)


                     {


                            myTestCall();                // 调用函数指针处的函数 myTest1, 置 PC 指针为 0x3900


                     }


推荐阅读

史海拾趣

埃派克森微电子(Apexone)公司的发展小趣事

在埃派克森微电子的发展过程中,著名投资机构多尔基金和华登国际的风险投资起到了重要的推动作用。这些投资不仅为公司提供了资金支持,还带来了宝贵的市场资源和管理经验。借助这些资源,埃派克森加快了国际化步伐,积极拓展海外市场,与全球范围内的客户和合作伙伴建立了紧密的合作关系。

DALLAS公司的发展小趣事

在1980年代,Dallas公司凭借其创新的DS1820温度传感器产品,成功打开了新市场的大门。这款温度传感器以其高精度、低功耗和易于集成的特性,赢得了众多客户的青睐。它的推出不仅为Dallas公司带来了显著的收入增长,也为公司后续的产品研发和市场拓展奠定了坚实的基础。

Eska公司的发展小趣事

Eska公司注重技术传承与创新发展。作为奥地利唯一一家仍在为手套制造业培训学徒和技术工人的企业,Eska坚持手套传统工艺和技术的秉承。同时,公司也积极引入新技术和新材料,不断提升产品的性能和质量。这种技术传承与创新相结合的发展模式,使得Eska在保持传统优势的同时,也能不断适应市场的变化和发展。

COTO TECHNOLOGY公司的发展小趣事

COTO TECHNOLOGY的故事始于1917年,当时它在美国罗德岛州的普罗维登斯以Coto Coil Incorporated的名字诞生,专注于线圈绕组的设计与制造。这个初创公司凭借对技术的深入理解和对质量的执着追求,逐渐在电子行业中崭露头角。它的线圈绕组产品以高精度、高稳定性而受到市场的青睐,为公司的初步发展奠定了坚实的基础。

Etco Inc公司的发展小趣事

自1947年成立以来,Etco Inc公司一直致力于电子连接技术的研发与创新。在20世纪70年代,公司成功研发出一款新型的高性能连接器,该产品凭借其卓越的性能和可靠性,迅速在汽车电子行业中占据了一席之地。这一技术突破不仅为Etco带来了可观的市场份额,还奠定了其在电子连接器领域的技术领先地位。

FARNELL公司的发展小趣事

在电子行业的快速发展中,市场竞争也日益激烈。FARNELL公司面临着来自国内外同行的竞争压力。为了应对这些挑战,FARNELL公司加强了内部管理,提高了运营效率;同时,公司还加大了对新产品、新技术的研发投入,以保持其在市场中的竞争力。

问答坊 | AI 解惑

903恒温电烙铁电路图

核心的IC就是运放,或者LM324,LM358,通过双向可控硅来控制加热芯通断! 温度控制采用热电偶,或者热敏电阻;电源采用220VAC直接RC降压。 成本比较低廉,损坏之后可以参考此电路进行维修!…

查看全部问答>

请教!!!使用Driverstudio,Defaultpnp的问题

使用DRIVERMONITOR显示 IRP: Major=IRP_MJ_PNP Minor= (0x18) defaultPnp--.  IRP 856C8790, STATUS c00000bb 调用m_lower.ActivateConfiguration配置时,返回AC_FAILED_TO_OPEN_PIPE_OBJECT, 是我端点配置错误吗? 应该跟底下的固 ...…

查看全部问答>

lineMakeCall 失败 错误号为 LINEERR_INVALBEARERMODE 的原因

我的调用顺序为: lineOpen --------------Success lineTranslateAddress     -----success 设置为: lpCallParams->dwTotalSize      = dwSizeOfCallParams;         lpCallParam ...…

查看全部问答>

如何在PDA上开发蓝牙程序

如何在PDA上开发蓝牙程序与蓝牙串口芯片控制单片机进行串口通信(非微软协议栈)…

查看全部问答>

一个有关cxa1238的图,高手请指点一下

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 各位高手帮忙指点一下,按照下图中的cxa1238芯片的22脚接的本振,可是怎么调频率总是680k左右,我的载频是35M,所以本振应该是在45M左右,可是怎么调可调电容,它频率总不变啊!!!!找也没找出原因 ...…

查看全部问答>

关于ads1115学习心得体会

研究ADS1115一段时间了,终于搞定啦,其实操作还是蛮简单的,主要分为三部分的步骤,本次列子是模拟IIC操作的哦。。。。。 其实主要分为三部分, 第一部分:write config register 1   0x90   最后一位是R/W位,高为读,低 ...…

查看全部问答>

BGA焊接 , 你也是高手!

BGA焊接,你也是高手   BGA的焊接,对DIY爱好者始终是个难题,很多人对它望而却步。手工焊接时,如果第一次没有成功,很可能将它这个芯片丢弃,实在可惜。我们可以研究一下工厂里对它的焊接过程,找一找手工焊接的方法。 本帖的目的 ...…

查看全部问答>

关于《科学鬼才:电子电路设计64讲》资源涉嫌侵权的处理

前一段小版在论坛下载中心上传了一份资源《科学鬼才:电子电路设计64讲》(帖子链接https://bbs.eeworld.com.cn/thread-418842-1-1.html)。今天接人民邮电出版社通知,说该资源涉嫌侵权。为避免不必要的纷争,论坛决定将该资源删除。由此给大家带 ...…

查看全部问答>

利用msp430g2253实现串口通信,利用串口调制助手测试

程序是这样的,但是串口调试助手无法接收到数据我理想的效果是向430发送hello,430回复hello world #include void main(void) {         WDTCTL=WDTPW+WDTHOLD;  // Stop WDT         if( ...…

查看全部问答>

【TIVA C Launchpad 学习笔记六】定时器四种模式:单次计时,周期计时,数捕获,计时捕获

模式一&模式二:单次计时&周期计时/******************************************* 开发坏境:CCSv5.4 开发板:TIVA C Launchpad(TM4C123GH6PM) 程序功能:16位定时器,单次定时模式和周期性定时模式 程序说明: 编程者:Linchpin *************** ...…

查看全部问答>