OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15904|回复: 14

keil For ARM 函数绝对定义分析和讨论

[复制链接]

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
发表于 2013-8-8 11:11:50 | 显示全部楼层 |阅读模式
  我写了一个函数,我要把它放到FLASH 的第31区,地址为0x0801F000 这个地方,我在网上搜了一个方法。
虽然达到了效果网上说加个__at;且包含头文件#include "absacc.h"

这种方法只适用于 数组的绝对定义。方法如下:
u8 TestBUF[8]  __at(
0x0801F000 )={0X34,0X66,0X03,0X34,0X23,0X77,0X77,0X77};
但是呢。对于一个函数。比如 void __at(0x0801F000 ) Test_ABC(void){...自己代码}; 这种方法是不行的。。
通过查看keil里的FLASH 发现是空的。说明他的代码就没放进去;

那么,网上还有个方法可行,但是不是我要的。共享出来。方法就是:
1、先为需要定位的函数设置节名,这里我以main主函数为例:
void  __attribute__ ((section ("mymain-这里随便定义英文名,我以mymain为名")))  main  (void)

2、在分散加载文件中设定main存放地址:
APP_LOAD 0x00050000  OVERLAY
{
        MAIN_EXE +0
        {
                app.o(mymain)  ;;app.o就是我的main主函数所在的C文件模块app.c
                                                 ;;mymain就是刚才定义的一个节其实就是代表main主函数
                                 ;;这里可以看到mymain的节(也就是main函数)
                                 ;;被放在地址0x00050000处,这样就完成了函数地址定位的功能
        }
        APP_EXE +0
        {
               *(+RO)
        }
};
还是拿我的函数为例子,
1.
void   __attribute__ ((section ("ABC_MY")))  Test_ABC(void){...自己代码};
2.APP_LOAD 0x0801F000 OVERLAY
{
        MAIN_EXE +0
        {
                Test.o(ABC_MY)  ;;    我的这个函数Test_ABC放在Test.c里,那么我这里改成TEST.O    }
        APP_EXE +0
        {
               *(+RO)
        }
};


以上仿造人家的方法我也实现了。但是发现有问题2;
第一个问题,在我要放的地址0x0801F000 
啊,确实有了代码不是过去检测的FF FF FF 了,而且在keil 生成的一个后缀叫.map的文件里也找到了我的函数是放在了0x0801F000 范围里。但是他放的位置 是0x0801F001;加了一位;这里这是我莫名其妙的第一个问题,
第二个问题,在后缀叫.map的文件里。这个文件是介绍本程序的所有涉及内容存放的一个文件。。我发现他身后排列的那些比如 usart_init()函数啊,还有各种函数,。都会随着我改这个0x0801F000 这个地址而顺序排列。,也就是说。我地址一改。其他函数。顺位不变且都跟到了这个地址身后顺序排列。说的还不清楚。举个例子,A是我的测试程序,A放0x01;那么其他程序BCDEFG排列分别是0x02;0x03;0x04;0x05;0x06;0x07; 当我把我的A 放到了0x21;那么我的其他程序。BCDEFG跟过来了。依次跟到了0x22,0x23,0x24,0x25,0x26,0x27;   这是第二个问题。比较头疼。

以上内容为我研究的结果,我拿来和大家分享的同时也希望大家帮我解决一下。我想让我的A放到0X21。我不想让BCDEFG的函数跟过来。他们还放到他们曾经的地址0x02.。。。。等。。。。。求大神指点
具有资深STM32点灯技术,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-8-8 11:26:52 | 显示全部楼层
回复【楼主位】敌害:
---------------------------------
你这个有点类似整个程序都进行了偏移哦...
你为什么要做单独一个函数存放到特定地址呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
 楼主| 发表于 2013-8-8 12:02:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
领导说:让这么弄。所以就的这么弄。作为一个干活的可以有想法,但不可以否决领导的决定。所以。求助来了
具有资深STM32点灯技术,
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-8-8 14:46:37 | 显示全部楼层
领导果然有想法.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2013-8-8 15:45:53 | 显示全部楼层
请查阅ARM Compiler-specific Features,给函数分配指定的Section,具体不记得了,看着办吧。

于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
 楼主| 发表于 2013-8-8 17:44:05 | 显示全部楼层
回复【5楼】styleno1:
---------------------------------
是了。但是这东西一时半会儿让我自己写也写不出来。这不抄人家的也失败了。。。呵呵呵呵呵呵呵
具有资深STM32点灯技术,
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-8-8 21:41:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2011-2-27
在线时间
0 小时
发表于 2014-6-28 10:50:15 | 显示全部楼层
lz的问题我只知道一部分,那个地址加一是因为这个本地址已经被你定义的第一个symbol占用了;所以就跟着了加1了,
回复 支持 反对

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-9-1
在线时间
0 小时
发表于 2015-1-22 09:16:02 | 显示全部楼层
回复【3楼】敌害:
---------------------------------
哥们,你好,想问下你那个用__attribute__是怎么实现函数地址绑定的,谢谢!
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-6-30 15:43:01 | 显示全部楼层
有用,方便用完然后擦掉
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-12-25
在线时间
20 小时
发表于 2016-8-13 16:52:15 | 显示全部楼层
solo 发表于 2016-6-30 15:43
有用,方便用完然后擦掉

这个你实现了吗
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-12-25
在线时间
20 小时
发表于 2016-8-13 16:52:29 | 显示全部楼层
楼主实现了吗???
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-8-13 17:04:19 | 显示全部楼层
qilima 发表于 2016-8-13 16:52
楼主实现了吗???

你指哪个?分配绝对地址?还是自擦除?
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1367
金钱
1367
注册时间
2014-2-13
在线时间
169 小时
发表于 2016-8-13 17:10:23 | 显示全部楼层
qilima 发表于 2016-8-13 16:52
楼主实现了吗???

分配绝对地址:http://www.amobbs.com/thread-5654908-1-1.html
关于自擦除,多说一点,32的FLASH鉴于分区都很大,单独占用一个扇区代价太大,所以不擦使用写0(flash的特性,初始化为1,且只能从1写0)的方法也可以达到目的。
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-12-25
在线时间
20 小时
发表于 2016-8-15 09:49:21 | 显示全部楼层
solo 发表于 2016-8-13 17:10
分配绝对地址:http://www.amobbs.com/thread-5654908-1-1.html
关于自擦除,多说一点,32的FLASH鉴于分 ...

很有用的小技巧,十分感谢!!!
我来看下链接
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 09:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表