打印
[STM32F1]

关于STM32F把一个函数固定到flash地址编译问题

[复制链接]
5861|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuangt|  楼主 | 2014-1-20 08:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想问大家一下,STM32F中怎么把函数固定到自定义的flash地址(如固定在0x08001000)
比如,我想把
void calc(void)
{
        u8 i;
        i++;
}
这个函数固定到0x0800F000内存当中,要怎么实现呢?


另外我试了一下,可以把变量定义到固定地址当中,方法如下:
u8 temp  __attribute__((at(0x0800F000))) = 0xAA;

这样编译好后,0x0800F000里存的数据就是0xAA了
用同样的法方,把函数定义到0x0800F000里面,就会报错,希望大家能帮帮我,谢谢
沙发
airwill| | 2014-1-20 10:50 | 只看该作者
用 连接命令吧. 看一下编译连接手册.

使用特权

评论回复
板凳
yuangt|  楼主 | 2014-1-20 15:50 | 只看该作者
链接命令能单独对一个函数设置吗?

使用特权

评论回复
地板
airwill| | 2014-1-20 21:45 | 只看该作者
是的, 通过段地址的方式控制.

使用特权

评论回复
5
yanwenbin33| | 2014-1-21 17:43 | 只看该作者
话说,想法不错,但是你要确定你程序在你想跳转的地址(0x0800f000)处编译器没有设置其他函数或者变量。链接脚本。。。。。。

使用特权

评论回复
6
yanwenbin33| | 2014-1-21 17:49 | 只看该作者
上面你的给temp一个值不会出错而给函数一个地址会出错的原因在于:在编译的时候,函数和变量的地址都放在符号表中,就是说真正访问函数和变量是通过地址访问的,你给内存地址里放数据是没有问题的(0xaa),但是你强制把编译器分配给函数的地址换成你想要的地址(0x0800f000),你让执行这个程序的时候上哪里找函数去?其他的模块都认为函数在A地址,可函数却被你强制转到0x0800f000处去了;所以就出错啦。看编译原理。。。。。

使用特权

评论回复
7
woshansi| | 2014-1-25 21:03 | 只看该作者
建议lz把程序放到后面的地址,你给的地址太靠前了,可能会有大问题,可能会和一些别的数据有冲突,一开始的地方好像是引导程序区

使用特权

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

本版积分规则

6

主题

34

帖子

1

粉丝