打印
[ZLG-ARM]

请教周工一个TargetResetInit的问题,急!!!

[复制链接]
2256|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smallbear|  楼主 | 2007-9-7 08:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
周工及各位高人:我最近在做bootloader的开发,发现一个问题,在周工提供的easyarm2200的模板中,TargetResetInit(void)程序是用C语言写的,而且是在分配完各个运行模式的堆栈后便马上调用了该程序。于是问题有了:
1:这是C语言的程序,而这个时候,C的运行环境还没有初始化,也就是说C的那些库文件还没有被调用执行(因为是由__main()函数引导库函数的执行环境和初始化。而在模板中是在执行为 void TargetResetInit(void)函数后才调用的__main())
2:调用__rt_stackheap_init()建立的堆栈是什么概念?是专门为所有C程序在内存独立分配的一段堆栈,还是和原来在InitStack中建立用户模式堆栈是重合的?

相关帖子

沙发
Ice_River| | 2007-9-7 14:52 | 只看该作者

小建议

__main是做什么用的!  C语言环境初始化? 不知道什么意思
好好看看程序结构你就明白了。

使用特权

评论回复
板凳
smallbear|  楼主 | 2007-9-7 20:37 | 只看该作者

__main()的功能

__main()是ads中内带的一个函数,调用它会有一系列的动作,其中的一个便是调用__rt_entry函数,完成一些库函数的调用,初始化执行环境,我不知道Ice_River兄有什么高见,期盼着赐教

使用特权

评论回复
地板
smallbear|  楼主 | 2007-9-16 16:55 | 只看该作者

怎么没有结果呢

各位高人,我想在坛子里面一定有人知道答案,为什么没人牺牲一下时间,指点一下呢,哪怕是告诉我在什么资料里面能找到答案也可以啊

使用特权

评论回复
5
五月天| | 2007-9-17 08:48 | 只看该作者

建议

请在本论坛搜索__main();或者到百度googel等搜索也可;建议看看ARM经典300问.pdf

使用特权

评论回复
6
smallbear|  楼主 | 2007-9-17 14:08 | 只看该作者

更明确的说一下我的问题

各位高人,我现在的主要的问题是如果c程序的起点是在main(),也就是该在运行晚bl __main之后(在__mian()函数之后,才能跳转到main()),可是void TargetResetInit(void)是用C语言写的,他被安排在bl __main之前,这是不是有些矛盾呢?

使用特权

评论回复
7
bqt| | 2007-9-17 17:34 | 只看该作者

不矛盾

TargetResetInit()只是做一些简单的初始化语句,没有用到C语言的库函数啊什么的,可以在初始化C语言环境之前由汇编来调用。

使用特权

评论回复
8
smallbear|  楼主 | 2007-9-17 20:09 | 只看该作者

可是c程序的堆栈呢?

我也考虑过这个问题,但是我查过很多的C语言资料,知道编译器在调用c程序的时候,都会使用到堆栈,而在没有调用TargetResetInit的时候,还没有为c程序准备好堆栈,所以很迷惑。难道在调用TargetResetInit的时候没有使用堆栈?提前谢谢各位。

使用特权

评论回复
9
bqt| | 2007-9-17 21:40 | 只看该作者

堆栈是要先初始化

所以ZLG的代码是这样的:
BL      InitStack               ; Initialize the stack 初始化堆栈
BL      TargetResetInit         ; Initialize the target board 目标板基本初始化
B       __main                  ; Jump to the entry point of C program 跳转到c语言入口
        
是先初始化好了堆栈再调用TargetResetInit()的,建议直接看一下该段程序的反汇编就清楚了。

使用特权

评论回复
10
smallbear|  楼主 | 2007-9-18 08:38 | 只看该作者

谢谢bqt兄

我仔细读过这段程序,才碰见了这样的问题,对于您的解释,我很感激,其实我在发帖的最初就意识到了这个问题,于是有了原帖的第二个关于堆栈的问题,我不是学软件的,所以遇到了问题,我所查找的一些资料上也没有仔细介绍C语言分配堆栈过程,有些只是模糊的说了几句,给我的印象是InitStack初始化的堆栈和在C语言程序用的堆栈不相同,C语言程序的堆栈是编译器单独在内存中分配的。看来我的理解是错误的。谢谢您的帮助,如果有时间,再麻烦您给我解释一下在arm编程中堆栈分配方法。

使用特权

评论回复
11
hxdlj| | 2007-9-21 07:49 | 只看该作者

to:lz

系统再进入main()函数之前会进行一系列的的初始运行环境(根据分散加载文件),如全局变量初始化、静态变量初始化等,之所以TargetResetInit()可以main()之前运行,是因为TargetResetInit()没有用到全局变量和静态变量。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

0

粉丝