打印

arm初始化时,为什么用汇编而不用c呢?

[复制链接]
5673|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luocolor|  楼主 | 2007-10-8 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天在qq群中,有人提到这个问题。希望各位dx回答下。
下面是我的看法:
    从arm的init代码来看,重要的工作就是初始化堆栈,而一般教科书上都说的c的运行需要堆栈。这似乎看起来是很合理的。
    但是,我有点想不明白,通过汇编编译后的c程序和本身就是汇编代码的程序在功能上应该可以完全相同的吧!而在嵌入式开发中,一般用host-target的方式开发。在host端生成了bin的二进制代码,down到target,此时target是不管你以前的c还是汇编的。mcu只知道从0x0运行(一般的话),只要有办法将host这边生成的bin写到target端的0x0,而且保证在0x0这个地址所存放的是进行系统初始化的代码(此代码功能与用汇编写的init想同),此时不是也能达到想同的效果么?
    所以,我觉得如果不能用c来写初始化代码的话,原因应该在host端的c编译器,在其对c代码进行link的阶段。
    
    希望各位多指正,多讨论。不吝感谢!

相关帖子

沙发
chunk| | 2007-10-8 15:40 | 只看该作者

用C来完成启动代码,

其必要性是什么呢?实质性的好处是什么呢?

完全用C实现中断服务程序又有什么好处?

使用特权

评论回复
板凳
mxh0506| | 2007-10-8 16:56 | 只看该作者

应该是C编译器决定必须如此吧

C语言程序的入口都是main(),在调用它之前总要有一段初始化程序,用于准备堆栈、中断向量和程序变量等,完成所谓的low level initialization,然后才能调用main()函数。
另外,一些C语言里不方便实现的的功能也可以写在这里。

使用特权

评论回复
地板
computer00| | 2007-10-8 18:12 | 只看该作者

有些东西C无法完成,必须要汇编。

使用特权

评论回复
5
edanzg| | 2007-10-8 19:06 | 只看该作者

是不是想电脑要先用bios引导,再加载OS

使用特权

评论回复
6
zusen| | 2007-10-8 19:38 | 只看该作者

因为用C写的一条句语

编译出来后可能是 汇编的几条语句,而ARM某些“空间”只能“藏”下一条汇编语句(比如中断入口)

当然,有超高效率的编译器的话,用C也是可以的

使用特权

评论回复
7
soso| | 2007-10-8 19:47 | 只看该作者

启动过程有些事情C干不了,因此只能用汇编.

使用特权

评论回复
8
浪淘沙| | 2007-10-8 19:54 | 只看该作者

关键是ARM7、ARM9的向量表中要求放几条跳转指令

楼主的问题答案如下:关键是ARM7、ARM9的向量表中要求放几条跳转指令,执行这些指令再跳转到相应的处理程序,如复位、中断、异常处理等,而C编译器无法产生这样连续的几条跳转指令。

STM32使用的新ARM核心Cortex-M3很好地解决了这个问题,它的向量表中的每一项都是处理程序的入口地址(而不是跳转指令),CPU取出这个32位的地址后自动地转到处理程序继续执行。这样即节省了对中断、异常处理等的响应时间,又可以保证完全的C编程而不需书写使用任何汇编指令。

使用特权

评论回复
9
john_light| | 2007-10-9 08:04 | 只看该作者

阅读也有收获

使用特权

评论回复
10
luocolor|  楼主 | 2007-10-9 12:56 | 只看该作者

都说到了低地址的中断,我也认同这种观点。但是,像zusen说的,只要有很好的c编译器,应该也是用c的。

另外,computer00说的“有些东西”指什么呢?

大家继续。

使用特权

评论回复
11
HWM| | 2007-10-9 13:03 | 只看该作者

有很多初始设置,由于和物理地址和硬件接口还有CPU寄存器

相当密切的联系,所以只有用汇编才会显得更为直接。

使用特权

评论回复
12
computer00| | 2007-10-9 13:14 | 只看该作者

一些寄存器是无法用C访问的.例如ARM里面的CPSR等

使用特权

评论回复
13
xieqin| | 2007-10-9 13:23 | 只看该作者

...

C函数汇编后用到的寄存器往往不止R0~R3,其它寄存器都需要保护,要用到堆栈.如果堆栈没有初始化,显然会有问题. 

另外,跳转表用C不容易实现.

只要堆栈被初始化了,基本都可以用C函数了. (操作系统上下文切换等等除外)

所以,跳转表和堆栈初始化用汇编,其它的都用C. 堆栈初始化之前的SDRAM初始化也应该用汇编.

使用特权

评论回复
14
ayb_ice| | 2007-10-9 13:39 | 只看该作者

有些东西C无法完成,必须要汇编

使用特权

评论回复
15
wangharry| | 2007-10-9 14:18 | 只看该作者

汇编 C

本人认为汇编有实时效率高 稳定 如果C写很可能实时效率低 速度慢

使用特权

评论回复
16
chunk| | 2007-10-12 10:31 | 只看该作者

历史总是模糊的

从UNIX,到B语言,到C语言,当初那几口子人是怎么想的现在恐怕是搞不明白了。

不过有些事情还是可以想象的:我们做事遇到麻烦,当然求助于工具,用个简单的工具克服了麻烦,事情进展就会顺利很多。这时我们想用工具解决我面对的一切事情,心情可以理解,可制做这样一个高级的工具不更麻烦吗?

到底什么是分工?软件和硬件怎么分工?工具和用工具的人怎么分工?不同工具之间怎么分工?

启动代码一经形成这辈子要重写多少次?它是你面对的麻烦吗?用C语言写一个long int数乘法,只要一个表达式,你看看8位的C编译器是怎么对待它的,你看看编译器是怎么和连接器及C运行库的编制者分工的。

动脑子动的都不是地方!急死我了!

使用特权

评论回复
17
wangharry| | 2007-10-16 09:55 | 只看该作者

更正错误c不能硬件堆栈初始化 只能汇编可以

使用特权

评论回复
18
yxwsz| | 2007-10-16 12:13 | 只看该作者

看来知其所以然的还是不多啊

有几条:
1 C语言无法访问到CPU的寄存器(CPU寄存器没有编入内存地址), 要初始化堆栈指针、设置MMU就必须用汇编;

2 c程序运行时必须有初始化数据段(bss)、堆栈(stack)、heap等环境, cpu复位后,这些环境还没有建立,因而必须用汇编把这些环境设置好之后才能跳到main()里面执行。

使用特权

评论回复
19
huangqi412| | 2007-10-16 16:13 | 只看该作者

学习拉

使用特权

评论回复
20
zusen| | 2007-10-16 16:39 | 只看该作者

楼上几位所讲的问题

其实编译器能解决

使用特权

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

本版积分规则

40

主题

105

帖子

0

粉丝