77

帖子

0

TA的资源

一粒金砂(初级)

21
 
我猜测lz的问题应该是从flash复制代码到sdram的时候,没有正确复制rw段和z0段吧
默认的rw段和z0段是紧接在代码段的后面,一般boot启动时候都会把自己从flash中复制到sdram里面运行.
也许你的程序中复制的大小是个固定值,而不是根据boot代码编译的大小来调整的,所以代码小的时候就不会出错,代码多的时候就出错了.没有正确复制rw段,那么全局变量的值就是sdram初始化后的默认值,一般这个值是0xCDCDCDCD,我不知道为什么,根据经验是这样,也许是调试软件的原因.
C/C++编译器生成汇编函数代码都是遵循 ARM 过程调用标准(APCS)的,哪些寄存器放参数,哪些存放返回值都是规定好的,所以自己编写汇编代码函数给C调用时,也应该遵循这一标准.

回复

81

帖子

0

TA的资源

一粒金砂(初级)

22
 
Reallyu大侠,多谢指点了。我再把我这的情况详细说明一下。

我用Nmake.exe和marvell的编译器联合编译的,生成的.map内存映射文件是这样的
Base Addr   Total       End Addr    Location     Type  Attr  Segment

0x00000000  0x00005560  0x00005560  0x00000000   Code  RO    CODE
0x5c009000  0x00000418  0x5c009418  0x5c009000   Data  RW    DATA
0x5c009418  0x00001038  0x5c00a450  0x5c009418   Zero  RW    BSS

还有
#map out the segments
LAYOUT
##        SEGMENT CODE BASE 0x5c013000        ## Debug
        SEGMENT CODE BASE 0x00000000        ## Debug
                LOAD  SECTION Init OF OBM_StartUp
         SECTION Reset_Area
                        SECTION _RO_
                        SECTION .ctors
                        SECTION init_data

        SEGMENT DATA BASE 0x5c009000
                LOAD SECTION _RW_

        SEGMENT BSS BASE ALIGN 4
                LOAD SECTION _BSS_

从这上面看代码段从0x00000000重定位到了0x5c013000,我的代码也是从nandflash中加载到SRAM的0x5c013000地址。你说的拷贝的文件大小是固定的,这个应该是有可能的,因为大小是在片内的bootrom中确定的。

另外堆栈的的情况如下:
IRQ模式下SP初始值是0x5c012FFC
SVC模式下SP初始值是0x5c0107FC
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

23
 
对堆栈进行了调整,并输出打印信息查看。
全局变量的位置和map文件中说明的位置是一致的。

程序在SVC模式下运行
它的stack起始地址是SP:  0x5c0117FC
数据出错时答应sp,结果是 0x5c010e84。
而全局数据区在            0x5c00a450
所以出现堆栈溢出可能性似乎不大。

根据paul_chao大侠的提示,我打印sp的方法实现如下。

  GetSP
       MOV       a1,  SP
       STMFD                SP!, {R0-R4, LR}       
       LDMFD           SP!,    {R0-R4, PC}

供参考。

基本定位文件拷贝大小有限定,接下来找marvell核实。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

24
 
这么多牛人回帖,申请加精!!!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

25
 
我上回碰到的是全局变量定义、声明混用了BOOL、BOOLEAN,这两个类型一个4字节一个1字节。编译没问题,操作时就错了。见[url=http://blog.eeworld.net/seemknow/archive/2009/08/26/4486812.aspx][/url]
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

26
 
恭喜楼主取得初步成果。楼主是想在marvell的boot基础之上做一个二次boot吗?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

27
 
差不多那个意思,用obm来引导eboot。

还有个奇怪的问题,同样减小代码量以后就不会出现。

为什么会导致提示flash通信校验错误。*DFC_STATUS & DFC_SR_DBERR这是判断条件。
DFC_STATUS是状态寄存器,DFC_SR_DBERR是标志位。他们都是常量。
开始我以为DFC_STATUS数据被修改了,所以才造成判断错误。现在看来不是。确实出现了状态寄存器的校验位被置位。

很诡异呀。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

28
 
拷贝eboot是可以用固定大小的。

 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

29
 
bang ding
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

30
 
引用 20 楼 reallyu 的回复:
我猜测lz的问题应该是从flash复制代码到sdram的时候,没有正确复制rw段和z0段吧
默认的rw段和z0段是紧接在代码段的后面,一般boot启动时候都会把自己从flash中复制到sdram里面运行.
也许你的程序中复制的大小是个固定值,而不是根据boot代码编译的大小来调整的,所以代码小的时候就不会出错,代码多的时候就出错了.没有正确复制rw段,那么全局变量的值就是sdram初始化后的默认值,一般这个值是0xCDCDCDCD,我不知道为什么,根据经验是这样,也许是调试软件的原因.
C/C++编译器生成汇编函数代码都是遵循 ARM 过程调用标准(APCS)的,哪些寄存器放参数,哪些存放返回值都是规定好的,所以自己编写汇编代码函数给C调用时,也应该遵循这一标准.

学习经验了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

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

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