====================================《一步一步写嵌入式操作系统——ARM编程方法与实践》读书笔记(第三章)===============================================
1、嵌入式平台的启动过程(引导程序->操作系统)
CPU上电后,ARM会首先从地址零处开始运行,此时运行引导程序,然后引导程序将操作系统加载到RAM中,
并将操作系统的第一条指令地址赋值给PC,操作系统开始执行
操作系统启动时要完成的初始化工作:
① 程序运行栈的初始化。
②、处理器及外设的初始化。
2、分析开源嵌入式操作系统freeRTOS的初始化部分
.section .startup,"ax" /*将整段代码编译到startup段中,ax表示可重定位,可执行*/
.code 32 /*编译生成32位指令集的代码*/
.align 0 /*以2^0=1字节对齐*/
b _start
ldr pc, _undf
ldr pc, _swi
ldr pc, _pabt
ldr pc, _dabt
nop
ldr pc, [pc,#-0xFF0]
ldr pc, _fiq
_undf: .word __undf
_swi: .word vPortYieldPro
_pabt: .word __pabt
_fiq: .word __fiq
__undf: b __undf
__pabt: b __padt
__dabt: b __dabt
__fiq: b __fiq
*******************************************
_start:
/*以下代码初始化各个模式下的堆栈*/
ldr r0, .LC6
msr CPSR, #MODE_UND|I_BIT|F_BIT
mov sp, r0
……
sub r0, r0, #SVC_STACK_SIZE
msr CPSR, #MODE_SYS|I_BIT|F_BIT
mov sp, r0
msr CPSR, #MODE_SVC|I_BIT|F_BIT
mov a2, #0
mov r12, a2
mov r7, a2
ldr r1, .LC1
ldr r3, .LC2
subs r3, r3, r1
beq .end_clear_loop
mov r2, #0
/*初始化bss段*/
.clear_loop:
strb r2, [r1], #1
subs r3, r3, #1
bgt .clear_loop
.end_clear_loop:
……
mov r0, #0
mov r1, #0
/*调到main
1、嵌入式平台的启动过程(引导程序->操作系统)
CPU上电后,ARM会首先从地址零处开始运行,此时运行引导程序,然后引导程序将操作系统加载到RAM中,
并将操作系统的第一条指令地址赋值给PC,操作系统开始执行
操作系统启动时要完成的初始化工作:
① 程序运行栈的初始化。
②、处理器及外设的初始化。
2、分析开源嵌入式操作系统freeRTOS的初始化部分
.section .startup,"ax" /*将整段代码编译到startup段中,ax表示可重定位,可执行*/
.code 32 /*编译生成32位指令集的代码*/
.align 0 /*以2^0=1字节对齐*/
b _start
ldr pc, _undf
ldr pc, _swi
ldr pc, _pabt
ldr pc, _dabt
nop
ldr pc, [pc,#-0xFF0]
ldr pc, _fiq
_undf: .word __undf
_swi: .word vPortYieldPro
_pabt: .word __pabt
_fiq: .word __fiq
__undf: b __undf
__pabt: b __padt
__dabt: b __dabt
__fiq: b __fiq
*******************************************
_start:
/*以下代码初始化各个模式下的堆栈*/
ldr r0, .LC6
msr CPSR, #MODE_UND|I_BIT|F_BIT
mov sp, r0
……
sub r0, r0, #SVC_STACK_SIZE
msr CPSR, #MODE_SYS|I_BIT|F_BIT
mov sp, r0
msr CPSR, #MODE_SVC|I_BIT|F_BIT
mov a2, #0
mov r12, a2
mov r7, a2
ldr r1, .LC1
ldr r3, .LC2
subs r3, r3, r1
beq .end_clear_loop
mov r2, #0
/*初始化bss段*/
.clear_loop:
strb r2, [r1], #1
subs r3, r3, #1
bgt .clear_loop
.end_clear_loop:
……
mov r0, #0
mov r1, #0
/*调到main