嵌入式爱好者的学习笔记连载(二)

iotekcom 2009-06-04 03:18:13
加精
嵌入式爱好者的学习笔记连载(二)



决定开始学习嵌入式后,最先做的事情就是要熟悉ARM指令及其伪指令伪操作,这个阶段最好有高手教你,或者参加专业机构培训也是种高效方式,选择自学的要有心理准备了,非常非常非常难。ARM指令的助记符其实都是其具体功能的单次缩写,所以学习的过程中最好利用网络,从一些文献或书籍中找到ARM指令助记符的全称,这样方便记忆。学完之后,我做了整理了一个有关这方面的笔记,有需要的朋友请邮件联系

接下来的学习过程中,比较难以理解的是ARM的中断过程和存储系统。ARM中断的实现有些书上看一两遍也不见得能够完全理解,当然可能只对于像我一样跨专业的朋友来说存在这个问题。这次只谈中断。由于是初学者,难免会出错,敬请各位指正。

当一个程序正常执行过程中,CPU可能检测到有某个中断源发出中断请求,这时ARM硬件实现了程序强制跳转,在这之前保存了相关信息,以便程序正常返回。如果是发生了Reset中断,程序实现系统初始化设置。

开始比较难以理解的是中断产生后,程序都进行了哪些操作。我就从跟踪PC作为分析的主线。以发生FIQ中断为例。(只以ROM起始地址为0为例,不为0的情况参照存储地址映射)

最简单的是中断发生后,PC=0x08,在此地址处存放一个跳转指令,跳转到相关处理程序。当然多数情况中断处理程序可能比较复杂,并且要处理多种中断的情况下,采用一步映射两步跳转(我自己起的名字,不一定妥当)。如下图所示:



一步映射指,在RAM地址中建立一个中断向量表,图中该表起始地址为0x400000,在该表中存放的是中断处理函数的入口地址。两步跳转是指,当中断发生时,由于系统硬件强制程序跳转到了0x08处,在该地址处是一个跳转指令,跳转到中断函数地址解析程序IRQ_Handler,完成一步跳转。解析程序(IRQ_Handler)的作用无非是把中断向量表内中断处理函数(SystemIrqHandler)的入口地址赋值给 PC,如图所示PC=0x003000280,完成第二步跳转,开始处理中断。在中断处理函数的最后,恢复中断开始时保存的相关寄存器的值,完成中断。 下面以一个实例来具体说明中断建立及实现的过程。 首先通过伪指令建立一个中断向量表,用于存放中断程序的入口地址(如上图中的中断向量表,注意,此时表中还未赋值):

;/* EXCEPTION HANDLER VECTOR TABLE */

^ DRAM_BASE

HandleReset # 4

HandleUndef # 4

HandleSwi # 4

HandlePrefetch # 4

HandleAbort # 4

HandleReserv # 4

HandleIrq # 4

HandleFiq # 4

然后定义一个连续的数据段,并把中断处理函数的入口地址值赋给各字单元

ExceptionHandlerTable

DCD UserCodeArea

DCD SystemUndefinedHandler

DCD SystemSwiHandler

DCD SystemPrefetchHandler

DCD SystemAbortHandler

DCD SystemReserv

DCD SystemIrqHandler

DCD SystemFiqHandler

下面从程序的开始处分析:

AREA Init, CODE, READONLY ENTRY /* ROM起始地址向量表 */

B Reset_Handler

B Undefined_Handler

B SWI_Handler

B Prefetch_Handler

B Abort_Handler

NOP Reserved vector

B IRQ_Handler

B FIQ_Handler

/* B跳转范围限于+ -32M内*/

/* 以下是地址解析程序 */

IRQ_Handler

SUB sp, sp, #4

STMFD sp!, {r0} FD满递减堆栈 执行寄存器压栈操作.

LDR r0, =HandleIrq //对应程序开始处以伪指令定义的向量表LDR r0, [r0] //中断处理函数的地址赋给R0.

STR r0, [sp, #4] //中断处理函数的地址入栈

LDMFD sp!, {r0, pc} //实现程序跳转,目前没明白为什么又给r0赋值?

上面提到了还没有给中断向量表赋值,下面代码把中断处理函数的地址放到DRAM中断向量表里EXCEPTION_VECTOR_TABLE_SETUP

LDR r0, =HandleReset

LDR r1, =ExceptionHandlerTable

MOV r2, #8

ExceptLoop

LDR r3, [r1], #4

STR r3, [r0], #4

SUBS r2, r2, #1 Down Count

BNE ExceptLoop ;

下面是中断处理函数

SystemIrqHandler

IMPORT ISR_IrqHandler

STMFD sp!, {r0-r7, lr}

BL ISR_IrqHandler

LDMFD sp!, {r0-r7, lr}

SUBS pc, lr, #4

它实际上只调用了下面的C语言的中断处理函数,其他什么也没做。

void ISR_IrqHandler(void)

{ IntOffSet = (U32)INTOFFSET;

(IntOffSet>>2)

(*InterruptHandlers[IntOffSet>>2])();

}// Call interrupt service routine }

以上编程思路是,先在系统初始化时重新建立一个中断向量表,并把相关的中断处理函数的地址放到中断向量表中。当系统监测到有中断源请求服务后,硬件实现pc跳转到地址0x08处,执行一个跳转指令B IRQ_Handler , 然后执行地址解析程序,把中断向量表中的中断处理函数的入口地址赋给pc,开始响应中断。在中断处理函数的最后,执行LDMFD sp!, {r0-r7, lr}

SUBS pc, lr, #4

实现中断的返回。

下接连接第三期




(更多内容可点击海同论坛 http://www.iotek.com.cn/bbs)
...全文
1138 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
m910529 2012-10-22
  • 打赏
  • 举报
回复
楼主,你整理的ARM指令笔记方面能否发一份给我
1204548317@qq.com
一天十小时 2012-05-17
  • 打赏
  • 举报
回复
ARM指令助记符给我发一份,谢谢
chen.dongfa@qq.com
一天十小时 2012-05-17
  • 打赏
  • 举报
回复
楼主总结的很好,看了还是很有帮助的
一天十小时 2012-05-17
  • 打赏
  • 举报
回复
最先做的事情就是要熟悉ARM指令及其伪指令伪操作,这个阶段最好有高手教你,或者参加专业机构培训也是种高效方式,选择自学的要有心理准备了,非常非常非常难
不能一概而论吧,别吓自学者,刚学的时候只需要了解一下简单的指令,然后有个板来实验,一些复杂的指令需要以后慢慢体会
lq1341 2012-03-13
  • 打赏
  • 举报
回复
看一下,谢谢楼主分享
tianlu123 2011-09-08
  • 打赏
  • 举报
回复
WEIGUAN
jeffsc 2011-08-17
  • 打赏
  • 举报
回复
zxzxzx2005@yahoo.cn
请发一份.谢谢.
Cline 2011-08-16
  • 打赏
  • 举报
回复

Mark.
xiaobeiweng 2011-08-14
  • 打赏
  • 举报
回复
UPING
CCSOY 2011-08-14
  • 打赏
  • 举报
回复
学习了
我为自己袋盐 2011-08-11
  • 打赏
  • 举报
回复
不熟悉汇编...
CCSOY 2011-08-09
  • 打赏
  • 举报
回复
谢谢分享 学习了 同求笔记 chengshuaile@126.com
liaaaaa 2011-08-01
  • 打赏
  • 举报
回复
unping
fortunecjs 2011-05-27
  • 打赏
  • 举报
回复
我也正准备学,能否也发那个笔记给我,谢谢!
fortunecjs@126.com
ccnaweizhang 2010-12-10
  • 打赏
  • 举报
回复
ding,我来接分
panyunpeng 2010-12-09
  • 打赏
  • 举报
回复
你整理的ARM指令笔记能否发一份给我,谢谢楼主1142581520@QQ.com
韩明君 2010-09-06
  • 打赏
  • 举报
回复
楼主,你整理的ARM指令笔记方面能否发一份给我,虽然大部份一看就知道会是哪个单词的缩写,有的还是要查查。 谢谢
hanmingjunqq@qq.com
sinzou1 2010-09-02
  • 打赏
  • 举报
回复
我也正准备学,LZ能否也发那个笔记给我,谢谢!
410169815@qq.com
finalinflyin 2010-04-15
  • 打赏
  • 举报
回复
楼主能不能把整理好的发个下载的联接
lchhzjx32226 2010-04-13
  • 打赏
  • 举报
回复
upIng,wating you forever
加载更多回复(15)

1,068

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧