《一步一步写嵌入式操作系统——ARM编程方法与实践》读书笔记(第三章)

本文是《一步一步写嵌入式操作系统——ARM编程方法与实践》第三章的读书笔记,主要探讨了嵌入式平台的启动过程,包括引导程序加载操作系统、初始化工作,如栈的设置和处理器及外设初始化。此外,还详细分析了freeRTOS的初始化代码,以及如何编写自己的操作系统启动代码。内容涵盖堆栈初始化、内存管理、异常向量表和MMU的使用等,适合嵌入式开发人员学习。
====================================《一步一步写嵌入式操作系统——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函数中,在main函数中执行prvSetupHardware函数,完成特定硬件平台的初始化工作
  ①时钟初始化
  ②内存初始化
一步嵌入式操作系统 linux平台实现代码 step 0 准备开发环境 1 安装交叉编译工具 sudo apt-get install gcc-arm-none-eabi sudo apt-get install gcc-arm-linux-gnueabihf sudo apt-get install g++-arm-linux-gnueabihf 2 手边编译skyeye 用apt命令安装的skyeye模拟器版本(1.2.5)有bug,需要手动编译更高版本的skyeye 下载并解压skyeye 1.2.6_rc1的代码, ~/Downloads/skyeye-1.2.6_rc1 根据执行skyeye-1.2.6_rc1/INSTALL的说明 1 执行 ./configure 2 执行 make 后 编译错误1: In file included from /usr/include/fcntl.h:289:0, from nandflash/nandflash_smallblock.c:19: In function ‘open’, inlined from ‘nandflash_sb_setup’ at nandflash/nandflash_smallblock.c:519:24: /usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:4: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments __open_missing_mode (); 解决方法: 修改skyeye-1.2.6_rc1/device/nandflash/nandflash_smallblock.c 519行 if ((nf->fdump= open(dev->dump, FILE_FLAG)) < 0) 改为: if ((nf->fdump= open(dev->dump, FILE_FLAG, 0777)) < 0) 编译错误2: gcc -g -O2 -o skyeye skyeye.o ./utils/libutils.a ./arch/arm/libarm.a ./device/libdev.a ./arch/mips/libmips.a ./arch/ppc/libppc.a ./arch/bfin/libbfin.a ./arch/mips/libmips.a ./arch/coldfire/libcoldfire.a -lc ./utils/libutils.a -lbfd -lm -lc ./arch/mips/libmips.a(decoder.o):在函数‘decode’中: /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1079:对‘sign_extend_UInt32’未定义的引用 /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1105:对‘sign_extend_UInt32’未定义的引用 /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1049:对‘sign_extend_UInt32’未定义的引用 /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1027:对‘sign_extend_UInt32’未定义的引用 /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1013:对‘sign_extend_UInt32’未定义的引用 ./arch/mips/libmips.a(decoder.o):/home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1001: 跟着更多未定义的参考到 sign_extend_UInt32 ./arch/mips/libmips.a(decoder.o):在函数‘decode’中: /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:240:对‘divide_UI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值