微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 8051 与 AndesCoreTM 的软件差异与移植

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?的中断向量

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top