OpenEdv-开源电子网

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

BIN文件编译完成后只能放在一个地址上运行吗?

[复制链接]

0

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-6-26
在线时间
5 小时
发表于 2015-3-24 10:57:39 | 显示全部楼层 |阅读模式
5金钱
我用UCOS来加载执行bin文件,因为堆栈和中断沿用uCOS任务的设置值,故不需要重新设置bin文件的堆栈和中断地址。目前已经运行起来了,相当于uCOS的一个任务。但我不理解为何该bin文件一定要在指定位置才能正常运行,我把它加载到偏移源地址1024位置处运行时失败。难道说文件中函数和指令地址都是绝对地址而不是偏移地址么?还是什么原因?请教大家!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-6-26
在线时间
5 小时
 楼主| 发表于 2015-3-24 11:25:00 | 显示全部楼层
我要做的其实是在不停止bin文件运行的情况下更新它,具体思路是在另外的区域加载新文件,然后在适当时候切换过去执行(切换时间要求比较严格),这样就要求bin文件在两个区域都可以执行。大家有没有什么好办法?
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-5-10
在线时间
12 小时
发表于 2015-3-24 16:18:17 | 显示全部楼层
1. 地址是由linker根据链接脚本(IAR中叫.ICF文件,RVMD中叫scatter文件)确定的
2. 现有程序只会在指定地址处取指令。

有一种方法是将BIN地址存储在Flash中,每次执行BIN的时候根据Flash里面的地址执行。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-6-26
在线时间
5 小时
 楼主| 发表于 2015-3-25 09:14:45 | 显示全部楼层
我好像有点明白发生什么事了。
我打开bin文件查看了一下,发现中断处理地址(Reset_Handler)都是以绝对位置方式写进去的,所以跳转进bin文件时,无论bin文件被放到哪个位置,他执行函数(Reset_Handler)的指针都是指向一个固定地址的,因此如果放到其他位置执行bin文件,首先他的入口地址就已经不对了。其次,如果所有函数地址都是以这种固定的绝对地址定位的话,那么所有函数地址也都已经不正确。
所以,如果要放到其他位置去执行bin文件,是否可以利用地址重映射的方法才能做到?
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2015-3-25 14:24:16 | 显示全部楼层
单片机架构决定它很多时候使用的物理地址,因而以固定空间作为加载区,以此基地址编译。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 10:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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