8051 与 AndesCoreTM 的软件差异与移植
时间:07-29
来源:
点击:
断 1,也是一个跳转指 令:LJMP INT 到后面的用汇编实现的中断处理函数 INT 中。
ORG 0000H /*起始地址*/ LJMP MAIN /*跳转到主程序*/ ORG 0013H /*外部中断 1 的地址 LJMP INT /*跳转到 INT 执行*/ ORG 0100H /*主程序的起始地址 MAIN: MOV A,#0FEH /*将 FEH 送给 A*/ SETB IT1 /*外部中断 1 跳变沿触发方式*/ SETB EX1 /*外部中断 1 开中断*/ SETB EA /*CPU 开中断*/ MOV P0,A /*将 A 送给 P0*/ LOP: LJMP LOP /*循环等待*/ INT: RL A /*A 循环左移*/ MOV P0,A /*将 A 的数值送给 P0*/ RETI /*中断返回*/ END /*程序结束*/ |
[AndesCore?]
该例子显示怎样用汇编设置 AndesCore?的中断向量表和中断处理函数,该 例子中 exception_vector 是中断向量表的 label, 后面分别表示第 0,1,2,3…个中 断向量,它们只是简单的跳转指令,跳到具体的执行实体中去,如 vector 0 跳到_start,做系统相关的初始化操作,_start 是系统启动代码,用汇编语言来实现。vector 9 后面对应的是外部中断,中断处理函数如 OS_Trap_Interrupt_HW0, OS_Trap_Interrupt_HW1… 它通常用 C 来实现,可以参考后面 5.2 章节的 AndesCore?中断处理函数范例。
! 中断向量表所在的 section,该 section 在链接后会被存放在第一条指令 执行处,通常是 0 位置 .section .vector, "ax" !==================================================== ! Vector table !==================================================== .align 3 exception_vector: ! 以下是中断向量表 j _start ! (0) Trap Reset j OS_Trap_TLB_Fill ! (1) Trap TLB fill j OS_Trap_PTE_Not_Present ! (2) Trap PTE not present j OS_Trap_TLB_Misc ! (3) Trap TLB misc j OS_Trap_TLB_VLPT_Miss ! (4) Trap TLB VLPT miss j OS_Trap_Machine_Error ! (5) Trap Machine error j OS_Trap_Debug_Related ! (6) Trap Debug related j OS_Trap_General_Exception ! (7) Trap General exception j OS_Trap_Syscall ! (8) Syscall j OS_Trap_Interrupt_HW0 ! (9) Interrupt HW0 j OS_Trap_Interrupt_HW1 ! (10) Interrupt HW1 ....... ....... ....... ! _start 函数,是中断向量 0 对应的中断处理函数 .align 2 _start: ! ******** Begin of do-not-modify ************ ! Please don’t modify this code ! Initialize the registers used by the compiler #ifndef CONFIG_NO_NDS32_EXT_EX9 ! make sure the instruction before setting ITB ! will not be optimized with ex9 .no_ex9_begin ! disable ex9 generation #endif ! Support Relax, Set $gp to _SDA_BASE_ la $gp, _SDA_BASE_ ! init GP for small data access #ifndef CONFIG_NO_NDS32_EXT_EX9 ! Initialize the table base of EX9 instruction la $r0, _ITB_BASE_ ! init ITB mtusr $r0, $ITB .no_ex9_end #endif !*********** End of do-not-modify************ la $fp, _FP_BASE_ ! init $fp la $sp, _stack ! init $sp 初始化堆栈寄存器 #ifdef CFG_LLINIT bal _nds32_init_mem ! 初始化 DRAM #endif bal __init ! 初始化 CPU,SoC,C 运行环境等 bal main ! 最后跳转到 main 函数 1: b 1b |
在上面用汇编设置 AndesCore?的中断向量
andes andescore 8051 MCU 相关文章:
- EDM安全访问机制应用方案(02-12)
- 在晶心平台运行具 OSC 的 FreeRTOS(01-08)
- Andes SAG应用实例(12-04)
- Andes 的分散聚合(SAG)机制(09-22)