大家对于ARM工控板相信一定不陌生,在嵌入式系统中它经常出现,对于ARM工控板的配置很多朋友表示不是很清楚,那我现在就为大家简单的介绍一下,希望可以帮到大家。
通常32位ARM工控板在嵌入式系统的中止向量表是在程序编译前设置好的,每次编写中止程序都要改C程序的汇编发动代码,适当繁琐。这篇文章给出一种装备ARM中止向量表新办法。该办法比通常办法仅添加一条指令执行时间,简洁高效,功用齐备,向量表在运转时动态生成,C程序能够运用固定向量表的发动代码,并可隐藏起 来。
通常32位ARM工控板的中止向量表是程序编译前设置好的。在编写32位ARM工控板的中止效劳程序、设置和修正ARM系统结构的中止向量表时,常感到适当费事,不得不修正汇编代码,对不喜欢运用汇编代码编程的程序员特别如此。
当需要在程序运转过程中动态修正中止向量的程序时会感到更为不便利,不得不添加许多分支处置指令才干完结。为此这篇文章提出一种简洁高效的装备办法,完结了ROM固化程序在运转时动态装备ARM工控板中止向量表的功用。 1 ARM中止向量两种设置办法 在32位ARM工控板中,通常都是在中止向量表中放置一条分支指令或PC寄存器加载指令,完结程序跳转到中止效劳例程的功用。例如:IRQEntry B HandleIRQ ;跳转规模较小 B HandleFIQ 或IRQEntry LDR PC,=HandleIRQ ;跳转的规模是恣意32位地址空间 LDR PC,=HandleFIQ LDR伪指令等效生成1条存储读取指令和1条32位常数界说指令。
32位常数存储在LDR指令邻近的存储单元中,相对偏移小于4KB。该32位数据即是要跳转到的中止效劳程序进口地址。之所以运用LDR伪指令,是因为ARM工控板的RISC指令为单字指令,不能装载32位的当即数(常数),无法直接把一个32位常数数据或地址数据装载到寄存器中。
下面通常程序与上述伪指令功用等效,但中止向量表描绘得更为明晰 X86与ARM处置器中止向量表对比 实形式X86程序员都了解,在X86系统结构的PC系统中,不论是用汇编仍是用C言语,都能够动态随机地设置、修正中止向量表—只需要简略地把中止程序例程的进口地址写入到中止向量表数据区,即可完结向量表的设置。
X86向量表设置便利的缘由有两个。其一是中止向量表与程序代码彻底别离,中止向量表设置在RAM数据空间,向量表寄存的数据是朴实地址数据;而在ARM工控板中寄存的是与中止效劳例程进口有关的一条分支指令。另一个缘由是,除BIOS外,大多数PC程序都是在运转时加载到RAM中的,程序数据是不加差异的,所以能够很简单在程序运转的过程中从数据生成程序,并能够很简单把CPU控制权转到新生成的程序中。
表面上看,在ARM工控板第二种中止向量设置办法的向量表VectorTable中也是纯地址数据,不含指令代码,好像能够把VectorTable设置在 RAM数据段中。但是通常ARM工控板系统的ROM代码段和RAM数据段间的偏移远大于2 12,故超出了LDR运用PC为基址的相对寻址规模。 代码中的VectorTable是一个与当时PC间的一个偏移,LDR指令的相对地址是在编译时核算的,需求VectorTable<2 12,所以VectorTable不能随意安排在RAM空间中。VectorTable通常只能安排在中止跳转指令邻近的代码区内里。