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

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

}

51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址相关推荐

  1. 51c语言延时作用,51单片机C语言延时函数怎么定义和使用

    描述 51单片机C语言延时函数怎么定义 C语言定义延时函数主要通过无意义指令的执行来达到延时的目的.C程序中可使用不同类型的变量来进行延时设计.经实验测试,使用unsigned char类型具有比un ...

  2. sqlserver数据库,使用substring函数截取不固定位置字符串。

    sqlserver数据库,使用substring函数截取不固定位置字符串. 当我们在向页面写入数据库查询出来的数据的时候,有一些不必要的字符串,相信大家肯定会在后台的java代码中进行处理再返回到页面 ...

  3. 51单片机串口中断功能的设置

    51单片机的串口功能就是和外界进行通讯,所谓的"外界"也就是与单片机进行交互的媒介,最常用的就是我们经常使用的计算机.平板或者其他设备(比如另一个单片机配合显示模块使用). 既然和 ...

  4. 51单片机中变量的存储 xdata bdata idata pdata区别

    先来看data.bdata.idata.pdata.xdata.code指代的意思. 然后我们对应到51单片机的存储空间: 从上面可以知道: 1.51的存储空间分为指令空间和数据空间,他们独立编址.指 ...

  5. 51单片机c语言编程函数,单片机C语言教程:C51函数

    其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段.有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模 ...

  6. (学习笔记)手把手教你学51单片机:变量进阶与点阵LED

    一.变量的作用域 作用域:变量的有效范围.分为:局部变量和全局变量. 1.1局部变量 在函数内部声明的变量,只在本函数内部可以使用. 1.2全局变量 在函数外声明的变量就是全局变量. 二.变量的存储类 ...

  7. 基于51单片机的1602LCD时钟、可以设置闹钟(带仿真)

    基于51单片机的1602LCD时钟.可以设置闹钟 最近做了个51单片机的时钟.具有设置时间.闹钟等功能 程序分为3个模块.程序比较简单.由于用于学习交流用没有做掉电运行功能. 供大家学习. isis仿 ...

  8. 51单片机的nop延时延时函数

    nop()–延时函数 1.C语言中没有_nop_()函数,在51C中一般包含在头文件中 #include "intrins.h" 2.该函数是在51单片机中用的延时函数,nop() ...

  9. SD卡SPI读写模式,基于51单片机的讲解

    经过验证测试,sd卡使用的spi模式为模式3(mode3),即CPOL和CPHA均为1,时钟线高电平空闲,第二个边沿(上升沿)进行采样. 下面为51单片机软spi读写一个字节时序(模式3)的代码示例, ...

最新文章

  1. 一文教会你写90%的shell脚本!
  2. Linux下互斥量与条件变量详细解析
  3. avisynth_c.h:825:3: error: unknown type name ‘HMODULE’
  4. 【直播回放】60分钟剖析GAN如何用于人脸的各种算法
  5. SpringBoot+Jquery+jsTree实现页面树型结构
  6. 将C4C Service Request中的summary和其他附件同步到ERP的Billing Request去
  7. FastJsonUtils 需要fastjson
  8. QT计算机控制进程,Qt 学习之路 2(69):进程
  9. derby数据库的数据_Derby数据库备份
  10. [UE4] Load Class Assest 返回 Null 的解决方法:在资产路径后面加 _C
  11. 会话,授权,认证概念解析
  12. gatsby_将Gatsby默认启动程序转换为使用样式化组件
  13. javascript createelement_如何创建与框架无关的JavaScript插件
  14. Nginx Location 工作流程图及总结
  15. iOS 获取通讯录权限和权限提示弹框
  16. 区块链实战超级账本视频教程|区块链视频教程
  17. ul阻燃标准有几个等级_最详细的UL阻燃等级介绍说明,快看过来
  18. 微商大咖,从香港代购开始,做到流水十几亿平台创始人的董小姐
  19. 双人五子棋游戏用C++实现
  20. C/C++程序员的编程修养

热门文章

  1. mysql relay log_windows下mysql主从出现Failed to open the relay log(relay_log_pos 248)解决办法...
  2. bcc校验码计算_CRC校验你会吗?计算、校验、C语言实现,三步教你轻松搞定
  3. 第九届国际冬季脑机接口会议(BCI2021)
  4. 南非的5DT数据手套使用说明
  5. java 查找一行_Java培训之工具类通用的查询一行多列,非实体
  6. 小鹏发布会上硬刚特斯拉AutoPilot:有视频有真相,特斯拉不懂中国路况
  7. 全球权威声纹识别竞赛斩获双料冠军 网易AI Lab智能技术领先国际
  8. 已开源!谷歌将AutoML应用到Transformer架构,实现机器翻译最佳性能
  9. 我平常整理了CString的一些用法,很实用,发给你共享,相信你以后遇到CString的问题都会迎刃而解:...
  10. Android 6.0 变更