历史上的今天
今天是: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
}
史海拾趣
|
核心的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 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 各位高手帮忙指点一下,按照下图中的cxa1238芯片的22脚接的本振,可是怎么调频率总是680k左右,我的载频是35M,所以本振应该是在45M左右,可是怎么调可调电容,它频率总不变啊!!!!找也没找出原因 ...… 查看全部问答> |
|
研究ADS1115一段时间了,终于搞定啦,其实操作还是蛮简单的,主要分为三部分的步骤,本次列子是模拟IIC操作的哦。。。。。 其实主要分为三部分, 第一部分:write config register 1 0x90 最后一位是R/W位,高为读,低 ...… 查看全部问答> |
|
BGA焊接,你也是高手 BGA的焊接,对DIY爱好者始终是个难题,很多人对它望而却步。手工焊接时,如果第一次没有成功,很可能将它这个芯片丢弃,实在可惜。我们可以研究一下工厂里对它的焊接过程,找一找手工焊接的方法。 本帖的目的 ...… 查看全部问答> |
|
前一段小版在论坛下载中心上传了一份资源《科学鬼才:电子电路设计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 *************** ...… 查看全部问答> |




