标题:
ARM- IAR EWARM软件包给出的一般启动程序
[打印本页]
作者:
look_w
时间:
2017-9-24 15:54
标题:
ARM- IAR EWARM软件包给出的一般启动程序
3.9.2 IAR EWARM
软件包给出的一般启动程序
下面给出了
IAR EWARM
软件包提供的一般启动程序代码,实际应用中可以根据具体芯片及应用系统要求进行适当修改,以适应不同场合的需要。
代码清单
3.8
——
IAR EWARM
启动代码
;-----------------------------------------------------------------------------
; 文件中标号的命名规则:
; ?xxx - 仅能由汇编语言访问的外部标号
; __xxx -
可由
C
语言访问或定义的外部标号
; xxx - 单个模块中的局部标号(注意,本文件包含多个模块)
; main - 用户程序的起点
;---------------------------------------------------------------
; 适用于整个文件的宏和模式定义
;---------------------------------------------------------------
;
模式,对应于
CPSR
寄存器的
0
~
5
位
MODE_BITS DEFINE 0x1F ; 用于CPSR模式的位屏蔽
USR_MODE DEFINE 0x10 ; 用户模式
FIQ_MODE DEFINE 0x11 ; FIQ
模式
IRQ_MODE DEFINE 0x12 ; IRQ
模式
SVC_MODE DEFINE 0x13 ; 管理模式
ABT_MODE DEFINE 0x17 ; 中止模式
UND_MODE DEFINE 0x1B ; 未定义指令模式
SYS_MODE DEFINE 0x1F ; 系统模式
;---------------------------------------------------------------
; ?RESET
; 复位向量。通常INTVEC
段被链接到地址
0
。为程序调试方便,也可以放在其它地址
;---------------------------------------------------------------
MODULE ?RESET
COMMON INTVEC:CODE:NOROOT(2)
PUBLIC __program_start
EXTERN ?cstartup
EXTERN undef_handler, swi_handler, prefetch_handler
EXTERN data_handler, irq_handler, fiq_handler
CODE32 ;
复位后始终为
ARM
模式
org 0x00
__program_start
ldr pc,[pc,#24] ;
绝对跳转地址范围为
4GB
; ldr b,?cstartup ;
相对跳转允许重映射,限于
32MB
; 可以去掉以下指令前的注释分号来允许异常向量
;
也可以在
C
语言中采用预编译命令“
#pragma vector”
org 0x04
; ldr pc,[pc,#24] ; 跳转到undef_handler
org 0x08
; ldr pc,[pc,#24] ; 跳转到swi_handler
org 0x0c
; ldr pc,[pc,#24] ; 跳转到prefetch_handler
org 0x10
; ldr pc,[pc,#24] ; 跳转到data_handler
org 0x18
; ldr pc,[pc,#24] ; 跳转到irq_handler
org 0x1c
; ldr pc,[pc,#24] ; 跳转到fiq_handler
;
用于
“
ldr pc
”指令的常数表入口定位于
0x20
;
异常向量可以用
C
语言的预编译命令“
#pragma vector”指定,也可以
;
在以下
dc32
指令后面填入向量地址。向量地址为
ARM
向量号+
20
org 0x20
dc32 ?cstartup
org 0x24
; dc32 undef_handler
org 0x28
; dc32 swi_handler
org 0x2c
; dc32 prefetch_handler
org 0x30
; dc32 data_handler
org 0x38
; dc32 irq_handler
org 0x3c
; dc32 fiq_handler
LTORG
; ENDMOD __program_start
ENDMOD
;---------------------------------------------------------------
; ?CSTARTUP
;---------------------------------------------------------------
MODULE ?CSTARTUP
RSEG IRQ_STACK
ATA(2)
RSEG ABT_STACK
ATA:NOROOT(2)
RSEG UND_STACK
ATA:NOROOT(2)
RSEG FIR_STACK
ATA:NOROOT(2)
RSEG SVC_STACK
ATA:NOROOT(2)
RSEG CSTACK
ATA(2)
RSEG ICODE:CODE:NOROOT(2)
PUBLIC ?cstartup
EXTERN ?main
; 从这里开始执行
;
复位后为
ARM
管理模式,禁止中断
CODE32
?cstartup
; 需要时在这里加入建立堆栈指针之前的初始化指令
; 初始化堆栈指针
; 以下方式可用于任何异常堆栈:FIQ, IRQ, SVC, ABT, UND, SYS.
; 用户模式使用与SYS模式相同的堆栈
; 堆栈段必须在链接器命令文件中定义,并且已经在上面声明
mrs r0,cpsr ; 原PSR值
bic r0,r0,#MODE_BITS ; 清除模式位
orr r0,r0,#IRQ_MODE ; 置IRQ模式位
msr cpsr_c,r0 ; 改变模式
ldr sp,=SFE(IRQ_STACK)&0xFFFFFFF8 ; IRQ_STACK结束
bic r0,r0,#MODE_BITS ; 清除模式位
orr r0,r0,#ABT_MODE ; 置Abort模式位
msr cpsr_c,r0 ; 改变模式
ldr sp,=SFE(ABT_STACK)&0xFFFFFFF8 ; ABT_STACK结束
bic r0,r0,#MODE_BITS ; 清除模式位
orr r0,r0,#SVC_MODE ; 置Supervisor模式位
msr cpsr_c,r0 ; 改变模式
ldr sp,=SFE(SVC_STACK) & 0xFFFFFFF8 ; SVC_STACK结束
bic r0,r0,#MODE_BITS ; 清除模式位
orr r0,r0,#UND_MODE ; 置Undefined模式位
msr cpsr_c,r0 ; 改变模式
ldr sp,=SFE(UND_STACK) & 0xFFFFFFF8 ; FIR_STACK结束
bic r0,r0,#MODE_BITS ; 清除模式位
orr r0,r0,#FIQ_MODE ; 置FIR模式位
msr cpsr_c,r0 ; 改变模式
ldr sp,=SFE(FIR_STACK) & 0xFFFFFFF8 ; FIR_STACK结束
bic r0,r0,#MODE_BITS ; 清除模式位
orr r0,r0,#SYS_MODE ; 置System模式位
msr cpsr_c,r0 ; 改变模式
ldr sp,=SFE(CSTACK) & 0xFFFFFFF8 ; CSTACK结束
#ifdef __ARMVFP__
;
允许
VFP
协处理器
mov r0, #0x40000000 ;
置
VFP
的
EN位
fmxr fpexc, r0 ; FPEXC, 清除其它
;
将缓冲区清
0
以禁止下溢出。为满足
IEEE 754标准,应删除该指令并安装合适的异常句柄
mov r0, #0x01000000 ;
置
VFP
的
FZ位
fmxr fpscr, r0 ; FPSCR, 清除其它
#endif
; 在这里可以添加更多的用户自定义初始化指令
; 跳转到?main标号的地方,继续IAR系统的启动程序
ldr r0,=?main
bx r0
LTORG
ENDMOD
END
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0