您的位置 首页 模拟

关于一个arm 反常向量表的问题的扩展

很长时间没有写bolg了,看看各位同仁的博客,让我很惭愧,我决定从今天开始,努力坚持写blog,加油~今天在上chinaunix的时候,一个网友…

很长时刻没有写bolg了,看看各位同仁的博客,让我很羞愧,我决议从今日开端,尽力坚持写blog,加油~

今日在上chinaunix 的时分,一个网友有关中断向量表的问题。

详细的链接http://bbs.chinaunix.net/thread-3620484-1-1.html,关于这个问题,我讲了我的一些观念,那个同学表明completely 理解了,我也觉的很快乐~

关于问题,我觉的牵扯的东西仍是比较多,所以我今日就决议就这个问题,在简略的拓宽一下~

关于一个特定(ARM)的机器而言,一般有3个软件的生命周期。

第一个 生命的周期称之为 rom boot(一级boot),这是有详细的芯片生产商来完结的。这个rom boot 十分重要,由于它跟你详细的产品量产,以及机器的发动方法有着很重要的联系.

三星 有个芯片叫 6410 ,它的发动方法有 nand flash 发动 和sd 发动,便是说你能够经过多个外部 IO 口的凹凸电平来确认是从SD 发动,仍是从nand flash 发动.那么为什么会这样呀?

原因便是rom boot.比如说,假如6410 是从SD 发动,那么rom 会依据外部 IO 凹凸电平来得知这个信息,并从SD 卡的某个扇区读取数据(这个数据是用户自己的软件,关于6410来讲 是uboot),加载到ddr 中.

第二个 生命的周期是 boot loader (二级boot)

第三个生命的周期是 system

关于发帖的内容我是这个回应的,

便是在bootloader 和你的system 是运转在同一机器上两个不同的软件。
uboot 完结必要的操作后,就把控制权交给了system
这儿面有两个阶段
阶段1 uboot 运转阶段,这时分假如出现反常,就会转到肯定地址(假定映射的是存储介质A)上去比如说 undefine,可是在udefine 处理中,是一个死循环,这个也是有道理的,由于在bootloader 中不允许出现反常,所以这时分你要查看你自己bootloader 中的代码。
阶段2 system运转阶段, 由于这个时分,现已进行了地址的remap ,所以肯定地址 映射的是不同的存储介质B。介质B中的undefine 中的处理便是system 软件界说的undefine ,和你uboot中的不是一回事。

从上面我的回应能够看出

我首要阐明的观念是

软件的生命周期 。发帖的同学其实是把软件的第二生命周期和第三生命周期混为一谈了。

接着读者又问

现在不解的问题是,是不是编译器把反常向量编译到特定的地址上,然后CPU产生反常才跳转呢?

不论你的代码怎样写的,只需产生(undefine)反常,cpu就会到0x00000004 这个地址去指令
其他的反常也是相同(这是一个硬件的行为)。详细你0x00000004 上是什么内容,那便是你软件的工作了(你写的代码和编译的工作了)。

还有咱们是不是有必要在整个程序的第二行开端写反常向量表呢,

恩,这个是规定好的,我见过的程序都是这样写的,别的arm 相关的手册上应该有相应的阐明内容。

这是一种和编译器的约好吗?
这个是arm 硬件约好的,可是需求用编译的来完结,确认把处理反常的代码放在正确的方位(中断向量表)

经过我上面的答复,能够看出有时分详细的软件的code 是和硬件休戚相关的,哪个方位需求什么样的代码,都是规定好的,我觉得这是一个驱动软件和应用软件的差异。假如要做底层软件的话,也有必要了解硬件,由于有些代码或许看起来是没有逻辑的,可是这些代码的逻辑性确实是存在的,只不过这个观看代码的主体不是人,而是你的机器,你的硬件,你的网卡,你的SD host,太多了~

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/276368.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部