打印
[PIC®/AVR®/dsPIC®产品]

单片机如何将某个函数定义到某个绝对地址区间

[复制链接]
781|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangchui|  楼主 | 2022-10-16 09:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
单片机如何将某个函数定义到某个绝对地址区间

使用特权

评论回复
沙发
huangchui|  楼主 | 2022-10-16 09:32 | 只看该作者
想要将某个函数内的代码都放到0xF000-0xFF00这个地址内,该如何操作。
看了XC8的手册,用PSECT还有ORG这些,没这么看懂

使用特权

评论回复
板凳
dengdc| | 2022-10-16 09:34 | 只看该作者
能否使用code @ at 关键词。。。

使用特权

评论回复
地板
huangchui|  楼主 | 2022-10-16 09:36 | 只看该作者
可以的,不过我发现其他代码也会跟在这个绝对地址之后,而不是他们原来的地址

使用特权

评论回复
5
huangchui|  楼主 | 2022-10-16 09:38 | 只看该作者
查看了XC8的用户指南,我用了__section说明符来给函数分配到段,如下图所示,指南中提到,想要将这个段定义到指定地址,需要用“-L-:直接调整链接器选项” ,这是XC8命令行驱动程序

使用特权

评论回复
6
huangchui|  楼主 | 2022-10-16 09:41 | 只看该作者
我按照指南在Extra linker options (额外的链接器选项) 字段输入-L-pmyData=0xBC00,见下图

使用特权

评论回复
7
huangchui|  楼主 | 2022-10-16 09:43 | 只看该作者
事实上,并没有将这个段放置在我指定的地址

使用特权

评论回复
8
huangchui|  楼主 | 2022-10-16 09:47 | 只看该作者

使用特权

评论回复
9
huangchui|  楼主 | 2022-10-16 09:50 | 只看该作者

使用特权

评论回复
10
meeagle| | 2022-10-16 17:44 | 只看该作者
汇编可以用ORG伪指令轻松定位到绝对地址,楼主这是想做加密算法?

使用特权

评论回复
11
lcczg| | 2022-10-19 11:22 | 只看该作者
本帖最后由 lcczg 于 2022-10-19 17:39 编辑

你好,请使用-Wl,-pmyData=0xBC00
Wl 将后面的选项视为Linker选项处理。
最新的编译器手册里没有-L-选项,而是Wl。
https://ww1.microchip.com/downlo ... or-PIC-50002737.pdf

使用特权

评论回复
12
tpgf| | 2022-11-4 08:59 | 只看该作者
在单片机编程使用中,会涉及到将某些函数定义到指定的code区。此时需要对工程文件进行配置修改才可完成

使用特权

评论回复
13
nawu| | 2022-11-4 09:16 | 只看该作者
函数定位:
假如要把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处了
2 、赋初值的变量定位:
要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,则如下操作:
在工程中建立一个新的文件,如InitVars.c,在其中对要处理的变量赋初值(假设是code变
量):
char code myVer = {"COPYRIGHT 2001-11"};
然后将该文件加入工程,编译,打开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)
再次编译即可。
相应地,如为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等变量,则相应处理即可。

使用特权

评论回复
14
aoyi| | 2022-11-4 10:10 | 只看该作者
再定位段的选择指令是: RSEG 段名

它用来选择一个在前面已经定义过的再定位段作为当前段

使用特权

评论回复
15
zljiu| | 2022-11-4 10:32 | 只看该作者
CSEG [AT 绝对地址表达式] //绝对代码段

DSEG [AT 绝对地址表达式] //内部绝对数据段

XSEG [AT 绝对地址表达式] //外部绝对数据段

ISEG [AT 绝对地址表达式] //内部间接寻址绝对数据段

BSEG [AT 绝对地址表达式] //绝对位寻址段

使用特权

评论回复
16
gwsan| | 2022-11-4 10:44 | 只看该作者
函数绝对地址定位

       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

使用特权

评论回复
17
tfqi| | 2022-11-4 11:22 | 只看该作者
直接使用_at_ 关键字加上地址就行。

如:

unsigned char idata myvar _at_ 0x40;

unsigned char code myvar[10] _at_ 0x40;

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

使用特权

评论回复
18
Jacquetry| | 2022-11-4 19:40 | 只看该作者
可以使用at指令

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

918

主题

12323

帖子

4

粉丝