c语言定义绝对地址变量,C51中变量和函数的绝对地址定位问题.doc

本文详细介绍了如何在C51语言中通过`_at_`关键字进行变量的绝对地址定位,并在KeilC编译器中通过`Project->OptionsforTarget->BL51Locate`选项卡定位函数到特定地址。同时,讲解了如何使用函数指针调用绝对地址的函数,包括函数指针的定义、赋值和调用过程。
摘要由CSDN通过智能技术生成

C51中变量和函数的绝对地址定位问题

C51中变量和函数的绝对地址定位问题:

1.??变量绝对地址定位

???????1)????在定义变量时使用?_at_?关键字加上地址就可.

??????????????e.g.

?????????????????????unsigned char idata myvar _at_ 0x40;

??????????????把变量?myvar?定义在?idata?的?0x40?处,?在?M51?文件中可以找到这麽一行

????????????IDATA???0040H?????0001H?????ABSOLUTE????

??????????????表示有变量在?idata?的?0x0040?处绝对地址定位.

???????2)????使用?KeilC?编译器定义绝对地址的变量,?方法待查.

?

2.??函数绝对地址定位

???????1)????在程序中编写一函数?myTest

??????????????void myTest(void)

??????????????{

?????????????????????// Add your code here

??????????????}

???????2)????使用?KeilC?编译器定位绝对地址的函数,?打开?Project -> Options for Target?菜单,

??????????????选中?BL51 Locate?选项卡,?在?Code:?中输入:

???????????????PR?myTest?MAIN(0x4000)

??????????????把函数?myTest?定位到程序区的?0x4000?处,

??????????????再次编译就可以了.

???????3)????一次定位多个函数的方法

??????????????同样地,?在程序中再编写另外一个函数?myTest1

??????????????void myTest1(void)

??????????????{

?????????????????????// Add your code here

??????????????}

??????????????在?Options for Target?菜单的?BL51 Locate?选项卡的?Code:?中输入:

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

??????????????把函数?myTest1?定位在程序区的?0x3900?处,?把函数?myTest?定义在程序区的?0x4000处,

??????????????重新编译就可以了.

??????????????在?M51?文件中可以找到下面的内容:

?

??????????????>> 3.obj TO Reader RAMSIZE (256) CODE (?PR?MYTEST1?MAIN (0X3900), ?PR?MYTEST?MAIN?(0X4000))

?

????????????????????3665H?????029BH??????????????????*** GAP ***

????????????CODE????3900H?????0014H?????UNIT??????????PR?MYTEST1?MAIN

????????????????????3914H?????06ECH??????????????????*** GAP ***

????????????CODE????4000H?????0014H?????UNIT??????????PR?MYTEST?MAIN

???????4)????函数的调用:

??????????????程序中直接调用函数的方式就不说明了,?这里重点讲使用函数指针调用绝对地址处的函数的方法.

??????????????(1)???定义调用的函数原形

?????????????????????typedef void (*CALL_MYTEST)(void);

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

??????????????(2)???定义相应的函数指针变量

?????????????????????CALL_MYTEST????myTestCall = NULL;

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

?????????????????????myTestCall = 0x3900;

??????????????指向函数?myTest1

??????????????(4)???函数指针调用

?????????????????????if (myTestCa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值