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

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

用C来完成启动代码,

其必要性是什么呢?实质性的好处是什么呢?<br /><br />完全用C实现中断服务程序又有什么好处?
mxh0506 发表于 2007-10-8 16:56 | 显示全部楼层

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

C语言程序的入口都是main(),在调用它之前总要有一段初始化程序,用于准备堆栈、中断向量和程序变量等,完成所谓的low&nbsp;level&nbsp;initialization,然后才能调用main()函数。<br />另外,一些C语言里不方便实现的的功能也可以写在这里。
computer00 发表于 2007-10-8 18:12 | 显示全部楼层

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

  
edanzg 发表于 2007-10-8 19:06 | 显示全部楼层

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

  
zusen 发表于 2007-10-8 19:38 | 显示全部楼层

因为用C写的一条句语

编译出来后可能是&nbsp;汇编的几条语句,而ARM某些“空间”只能“藏”下一条汇编语句(比如中断入口)<br /><br />当然,有超高效率的编译器的话,用C也是可以的
soso 发表于 2007-10-8 19:47 | 显示全部楼层

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

  
浪淘沙 发表于 2007-10-8 19:54 | 显示全部楼层

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

楼主的问题答案如下:关键是ARM7、ARM9的向量表中要求放几条跳转指令,执行这些指令再跳转到相应的处理程序,如复位、中断、异常处理等,而C编译器无法产生这样连续的几条跳转指令。<br /><br />STM32使用的新ARM核心Cortex-M3很好地解决了这个问题,它的向量表中的每一项都是处理程序的入口地址(而不是跳转指令),CPU取出这个32位的地址后自动地转到处理程序继续执行。这样即节省了对中断、异常处理等的响应时间,又可以保证完全的C编程而不需书写使用任何汇编指令。
john_light 发表于 2007-10-9 08:04 | 显示全部楼层

阅读也有收获

  
 楼主| luocolor 发表于 2007-10-9 12:56 | 显示全部楼层

都说到了低地址的中断,我也认同这种观点。但是,像zusen说的,只要有很好的c编译器,应该也是用c的。<br /><br />另外,computer00说的“有些东西”指什么呢?<br /><br />大家继续。
HWM 发表于 2007-10-9 13:03 | 显示全部楼层

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

相当密切的联系,所以只有用汇编才会显得更为直接。
computer00 发表于 2007-10-9 13:14 | 显示全部楼层

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

  
xieqin 发表于 2007-10-9 13:23 | 显示全部楼层

...

C函数汇编后用到的寄存器往往不止R0~R3,其它寄存器都需要保护,要用到堆栈.如果堆栈没有初始化,显然会有问题.&nbsp;<br /><br />另外,跳转表用C不容易实现.<br /><br />只要堆栈被初始化了,基本都可以用C函数了.&nbsp;(操作系统上下文切换等等除外)<br /><br />所以,跳转表和堆栈初始化用汇编,其它的都用C.&nbsp;堆栈初始化之前的SDRAM初始化也应该用汇编.<br />
ayb_ice 发表于 2007-10-9 13:39 | 显示全部楼层

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

  
wangharry 发表于 2007-10-9 14:18 | 显示全部楼层

汇编 C

本人认为汇编有实时效率高 稳定 如果C写很可能实时效率低&nbsp;速度慢
chunk 发表于 2007-10-12 10:31 | 显示全部楼层

历史总是模糊的

从UNIX,到B语言,到C语言,当初那几口子人是怎么想的现在恐怕是搞不明白了。<br /><br />不过有些事情还是可以想象的:我们做事遇到麻烦,当然求助于工具,用个简单的工具克服了麻烦,事情进展就会顺利很多。这时我们想用工具解决我面对的一切事情,心情可以理解,可制做这样一个高级的工具不更麻烦吗?<br /><br />到底什么是分工?软件和硬件怎么分工?工具和用工具的人怎么分工?不同工具之间怎么分工?<br /><br />启动代码一经形成这辈子要重写多少次?它是你面对的麻烦吗?用C语言写一个long&nbsp;int数乘法,只要一个表达式,你看看8位的C编译器是怎么对待它的,你看看编译器是怎么和连接器及C运行库的编制者分工的。<br /><br />动脑子动的都不是地方!急死我了!
wangharry 发表于 2007-10-16 09:55 | 显示全部楼层

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

  
yxwsz 发表于 2007-10-16 12:13 | 显示全部楼层

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

有几条:<br />1&nbsp;C语言无法访问到CPU的寄存器(CPU寄存器没有编入内存地址),&nbsp;要初始化堆栈指针、设置MMU就必须用汇编;<br /><br />2&nbsp;c程序运行时必须有初始化数据段(bss)、堆栈(stack)、heap等环境,&nbsp;cpu复位后,这些环境还没有建立,因而必须用汇编把这些环境设置好之后才能跳到main()里面执行。
huangqi412 发表于 2007-10-16 16:13 | 显示全部楼层

学习拉

  
zusen 发表于 2007-10-16 16:39 | 显示全部楼层

楼上几位所讲的问题

其实编译器能解决
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

105

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部