博客
关于我
51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
阅读量:606 次
发布时间:2019-03-12

本文共 1463 字,大约阅读时间需要 4 分钟。

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

直接使用_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

                     }

 

转载地址:http://htqxz.baihongyu.com/

你可能感兴趣的文章
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>