3974|9

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于程序入口问题 [复制链接]

我买的tq2440的板子。现有如下疑问。如果有编写一个小于4KB的.bin程序可以直接被“进阶石”载入。那么这bin文件的-ro-base 和 entry 怎么设置?是填“进阶石”的映射地址0x0 还是填内存地址0x30000000 ?
随机送的启动代码中,有个函数copy-from-flash这是把自己从flash中移动到sdram里。这样当.bin文件大于4KB时就可以把大于4KB的拷贝到SDRAM里。请高人,能否讲解一下,这个copy-from-flash函数是怎么与|Imaga$$RO$$Base|,|Imaga$$RO$$;Limit|配合完成这个工作的?是只拷贝大于4KB之后的代码,还是全都拷贝到SDRAM里?
表述的很混乱,还请高人指教。

最新回复

呵呵,这兄弟 真不容易。 我就不接分了,楼主直接给他吧。呵呵  详情 回复 发表于 2010-2-28 19:46
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你这问题问得非常好,因为我前两天一直搞这个问题,但是我觉得非常复杂。先说一下entry 的设置:entry 是初始进口,每个程序只能够有一个,他设置有两个要求:1、它必须要在运行域内。2它所处的域必须是加载域与运行域是同一个地方。一般来说,你的ROBase在哪,entry 就设置在哪。
   然后是ROBase,如果你的启动代码没有从Flsah复制到Ram的功能(或你的程序小于4K),你就把ROBase设置为0,如果你的启动代码有从Flsah复制到Ram的功能,那就可以设置为0x30000000.这是与运行域的概念有关的,你可以参考《ARM体系结构与编程》331页开始,426页开始的内容。这里你就饶了我把,我打不进几页纸的知识。
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢楼上的回答,我的确就是没怎么仔细看那本书。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 kkjiongquan 的回复:
你这问题问得非常好,因为我前两天一直搞这个问题,但是我觉得非常复杂。先说一下entry 的设置:entry 是初始进口,每个程序只能够有一个,他设置有两个要求:1、它必须要在运行域内。2它所处的域必须是加载域与运行域是同一个地方。一般来说,你的ROBase在哪,entry 就设置在哪。
? 然后是ROBase,如果你的启动代码没有从Flsah复制到Ram的功能(或你的程序小于4K),你就把ROBase设置为0,如果你的启动代码有从Flsah复制到Ram的功能,那就可以设置为0x30000000.这是与运行域的概念有关的,你可以参考《ARM体系结构与编程》331页开始,426页开始的内容。这里你就饶了我把,我打不进几页纸的知识。


我阅读了些资料,有了新的心得。请搞热指教。
对于一个大于4KB的程序,把他的ro-base 设置成SDRAM的起始地址。然后编译连接。于是程序中所有的标号变量等等都是基于这个由ro-base指定的地址的。但是由于steppingstone的存在,所以存储在FLASH中的前4kb代码,无论如何都会执行,之执行完必要的初始化后,代码应该只有1KB左右,这时根据|Image$$RO$$Load|与|Image$$ROLimit|等把整个程序拷贝到SDRAM的起始地址,然后再执行跳转比如:LDR PC , =Main
由于连接时标号Main使用的是绝对地址,并且这个地址是基于ro-base。碰巧我们又把整个程序拷贝到了以SDRAM起始地址为开端的地方。所以执行LDR PC , =Main,后PC指向的地方,就是在连接时就确定了的地方,这个地方又被我们刚刚拷贝过来的程序所占用,结果就是,程序跳到了Main标号处继续执行,并且是在SDRAM中执行。这时完成了程序的拷贝,以及从sram到SDRAM的转移。
需要注意的是,如果我们把程序拷贝到不是以SDRAM起始的地方,这时程序就跑飞了。所以ro-base的值也就是我们拷贝程序的目标起始地址。在这种体系下连接参数entry似乎有点多余。因为flash中的前4KB是自动执行的。

这是我自己理解的,请高人,指教。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
顶一下,让所有的人都看到然后回答我的问题,谢谢
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
  你知道我为了你这个问题,和我老师争论了3个小时,他终于明白我的问题是什么。回到宿舍洗了个澡,就马上回你贴。。。。
   废话少说,首先说一下你上面理解的问题,第一:我所看到的程序都没有用到LDR PC , =Main跳进main程序,都是直接用Bl Main,(虽然旁边的注释有LDR PC , =Main,但是我也不知道什么时候用它)。PC怎么跳,是与ROBase有关的,当你ROBase设置为0的时候,就代表代码运行预从0开始,你设置0x30000000开始,那它就根据ROBase为基地址(也就是中断向量表开始地址)。至于绝对地址,在LDR PC , =Main这句出现之前,代码已经复制到SDRAM时,而在复制完以后,程序已经完成跳进SDRAM的操作(ldr pc,=copy_proc_beg),所以你的LDR PC , =Main这句话根本用不上,直接用Bl Main就好了。最后是entry的设置,它绝对有用,因为ROBase在什么地方是与程序入口没有必然关系,比如说你RO域是在0x3000~开始,但是你的程序不一定要在0x3000~开始执行啊~~
   你自己再分析一下启动代码的复制部分吧,不自己分析是达不到完全理解的境界的。你看我凌晨1点半都会你贴,100分应该给我吧~~~呵呵
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
行,100分给你了。明天我就自己去分析启动代码。今天看了一部分,没看完。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
4K的代码,RO BASE要设置成0,需要搬移的要设置成0X30000000,细节内容我觉得在调试过程中查看反汇编文件更明了一些。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
启动代码的思路我基本弄懂了。
一般启动代码加上C程序部分,肯定大于4KB。所以在启动的时候,先初始化硬件,然后用 Copt_from_Nandflash函数把程序全都拷贝到SDRAM里,程序存储在SDRAM里的位置由|Image$$RO$$Load|与|Image$$ROLimit|等变量指明。然后运行就OK了。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 5 楼 kkjiongquan 的回复:
? 你知道我为了你这个问题,和我老师争论了3个小时,他终于明白我的问题是什么。回到宿舍洗了个澡,就马上回你贴。。。。
? 废话少说,首先说一下你上面理解的问题,第一:我所看到的程序都没有用到LDR PC , =Main跳进main程序,都是直接用Bl Main,(虽然旁边的注释有LDR PC , =Main,但是我也不知道什么时候用它)。PC怎么跳,是与ROBase有关的,当你ROBase设置为0的时候,就代表代码运行预从0开始,你设置0x30000000开始,那它就根据ROBase为基地址(也就是中断向量表开始地址)。至于绝对地址,在LDR PC , =Main这句出现之前,代码已经复制到SDRAM时,而在复制完以后,程序已经完成跳进SDRAM的操作(ldr pc,=copy_proc_beg),所以你的LDR PC , =Main这句话根本用不上,直接用Bl Main就好了。最后是entry的设置,它绝对有用,因为ROBase在什么地方是与程序入口没有必然关系,比如说你RO域是在0x3000~开始,但是你的程序不一定要在0x3000~开始执行啊~~
? 你自己再分析一下启动代码的复制部分吧,不自己分析是达不到完全理解的境界的。你看我凌晨1点半都会你贴,100分应该给我吧~~~呵呵


呵呵,这兄弟 真不容易。 我就不接分了,楼主直接给他吧。呵呵
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表