打印
[ARM入门]

求教:关于MDK的代码绝对定位

[复制链接]
3170|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jady_force|  楼主 | 2016-1-19 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用MDK460开发一个项目,遇到了代码绝对定位问题,特来求教
我需要把一个.C文件内所有函数指定分配到一个地址,SCT加载文件如下
ER_IROM2 0x12A0000 0x10000
{      
  PLC_DRV.o(+RO)    ;这个就是我要指定分配地址的文件PLC_DRV.C的目标文件
}
这样写确实部分实现了我的预期:PLC_DRV.C的所有函数都老实的分配到了0x12A0000开始的64K地址内。
但是问题来了,观察MAP文件
Symbol Name                Value              Ov Type        Size      Object(Section)
ntyk                              0x012a0000    ARM Code      96       plc_drv.o(.text)
stx_check                      0x012a0060    ARM Code      92       plc_drv.o(.text)
plc_drv                         0x012a00bc    ARM Code       1772    plc_drv.o(.text)  
PLC_DRV.C里的三个函数在目标段的64K地址内似乎是乱序分配的?并不是我想的按C文件内顺序分配地址。
我的本意是:
1,PLC_DRV.C的所有函数都分配在指定的地址段
2,指定的地址段的首地址必须能分配给某个PLC_DRV.C文件内的函数(公用入口),这里我想要将0x12A0000分配给plc_drv这个函数
目前1已经实现,但2死活做不到,无论我怎么调整PLC_DRV.C文件内的函数排列顺序,MDK都视而不见。
我只要将plc_drv这个函数指定在0x12A0000,其他函数的分配只要在64K范围内,顺序无所谓。但是现在弄了一天了,还是没实现,甚至我都没弄明白MDK究竟是依据什么来对一个C文件的函数进行地址分配的。
或者单纯通过SCT加载文件的方式不能实现我的要求,需要使用其他方法?
请大家指点,谢谢




相关帖子

沙发
jady_force|  楼主 | 2016-1-19 10:26 | 只看该作者
在线等

使用特权

评论回复
板凳
飞翔天空| | 2016-1-19 10:39 | 只看该作者
在函数前设置段名 __attribute__((section (".sec1")))
也可以用 pragma  :
#pragma arm section rodata = ".sec1"
....
...
#pragma arm section
具体用法查下手册
-------------------
然后在 scat 文件中分配段地址

ER_IROM2 0x12A0000 0x10000
{      
  *(.sec1)
}

可以多设置几个段, 以满足顺序要求

使用特权

评论回复
地板
jady_force|  楼主 | 2016-1-19 10:55 | 只看该作者
用多段定义的方式应该能实现,但问题是我现在不知道这个C文件内会有多少函数
这个是一个开发模板,以后要提供给第三方使用的。
我想做的简单些,第三方只要修改这个文件就可以了。
如果用多段的方式,那么以后SCT文件都要不断修改,基本上修改一次PLC_DRV.C,SCT文件也要修改。
比如我现在定义三个段,大小分别是1000,2000,3000字节,这就意味着对应的三个函数大小也要在这个范围内。
实际上第三方使用时,文件内的函数大小是我没办法控制的,同样的,函数个数我也没办法限制。
我能规定的,就是这个文件有一个公用入口函数plc_drv,地址要在0x012a0000。

使用特权

评论回复
5
jady_force|  楼主 | 2016-1-19 10:58 | 只看该作者
用IAR的话,很简单就实现了,以前的模板使用的很好。
这次因为换了个CPU,只能用MDK,没想到这么难搞。

使用特权

评论回复
6
飞翔天空| | 2016-1-19 14:07 | 只看该作者
这样试试
{
*(.sec1)
PLC_DRV.o(+RO)
}

使用特权

评论回复
7
jady_force|  楼主 | 2016-1-19 16:30 | 只看该作者
试过了,不行

使用特权

评论回复
8
acguy| | 2016-1-19 18:03 | 只看该作者
还是Gcc ldscripts好用,mdk顺序无法指定。

使用特权

评论回复
9
苏山人家| | 2016-1-20 09:23 | 只看该作者
做一个函数指针结构体,固定结构体就好了。

使用特权

评论回复
10
yklstudent| | 2016-1-20 09:27 | 只看该作者
函数绝对定位啊;变量可以,函数也是可以的啊

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝