5403|1

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

使用BL __main时需要重实现__user_initial_stackheap吗? [复制链接]

我的arm是S3C2410,SDRAM起始地址为0x30000000
利用HJtag-wigger-AXD裸机开发,一般都是在ads把RO=0x30000000,然后在axd中调试没有os的程序,
在2410init.s中,有一句是跳到自己的main函数的,
BL main;可以正常跳到我的main函数
但是当我设置为 BL __main时,程序就跑飞了,
我单步跟踪,BL __main执行后进入
_main
_rt_entry
_rt_stackheap_init
_user_initial_stackheap
问题就出现在这个_user_initial_stackheap,在里面调用了
mov r0,#0x16
swi 0x123456
因为我没有写swi中断处理函数,所以就跑飞了。
下面是没有__user_initial_stackheap时的截图:

我看了一下我原来的atmel9200的程序,用bl __main是可以跳到main的c函数的,但是在9200的rm9200.s启动文件中有
  EXPORT  __user_initial_stackheap
__user_initial_stackheap
                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
                LDR     R2, = (Heap_Mem +      Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR
这样一段代码,如果我把这一段删掉,bl  __main也出现跑飞跑到0x08(swi中断向量表的位置)的问题

我理解的是只要BL __main就需要自己重定义__user_initial_stackheap,但是网上的说法是好像只有用到分散加载时,才要求去自己实现__user_initial_stackheap,不知道是我的理解有问题,还是网上的说法有问题?

谢谢

最新回复

问题已解决,如果自己不实现__user_initial_stackheap,需要打开semihost功能 因为库函数是调用的semihost来返回一个栈顶参数的做堆栈初始化的 打开semihost需要设置H-Jtag的disable semihosting选项去掉, 然后在axd的processor properties的semihosting SWIs选项的ARM semihosting设置为0x123456   详情 回复 发表于 2009-8-9 11:15
点赞 关注

回复
举报

58

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
问题已解决,如果自己不实现__user_initial_stackheap,需要打开semihost功能
因为库函数是调用的semihost来返回一个栈顶参数的做堆栈初始化的

打开semihost需要设置H-Jtag的disable semihosting选项去掉,
然后在axd的processor properties的semihosting SWIs选项的ARM semihosting设置为0x123456
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表