基于ARM7(LPC2131)平台的μC/OS-Ⅱ的移植
2019-07-13 20:41发布
生成海报
一.准备工作
1.μC/OS-Ⅱ简介
uC/OS-II读做“micro COS2”, 意为“微控制器操作系统版本2”。uC/OS-II是著名的,源代码公开的实时内核,可用于各类8位,16位和32位单片机或DSP。从uC/OS算起,该内核已有十多年应用历史,在诸多领域得到广泛应用。
2.μC/OS-Ⅱ的特点
(1)提供源代码
(2)可固化
(3)可裁剪
(4)可剥夺
(5)多任务
(6)可确定性
(7)任务栈
(8)系统服务
(9)中断管理
(10)稳定性与可靠性
3.编译器的选择
ARM处理器核的C编译器有很多,大概有SDT,ADS1.2,IAR,TASKING和GCC等。我最终选择的是ADS1.2编译程序和调试。
4.ARM7简介
ARM7处理器核具有用户,系统,管理,中止,未定义,中断和快中断7中工作模式。其中除了用户模式外其他均为特权模式。同时支持两个指令集:16位Thumb指令集和32位ARM指令集。
5.开发环境的搭建
操作系统:Windows XP
集成开发环境:ADS1.2
调试环境:AXD(ADS1.2配套的软件)
串口调试工具
6.项目中所运用到的技术创新
(1)实现了加密程序,保护了用户应用程序代码,利用在特定的地址0x1fc处写入特定的值0x87654321实现加密
(2)通过工程配置文件加载程序代码,实现了写应用程序的模板工程,不用每次配置工程设置
(3)初始化程序和操作系统代码都留有很多扩充的接口,方便不同的用户需要实现不同的启动代码功能和扩充操作系统的功能
7.项目的特 {MOD}
(1)在本文档中有完整的源代码,并且有很详细的注释
(2)只要具备同样的软硬件环境,根据我的《过程与结果总结报告》完全可以实现这个项目
(3)同时完成了引导程序和操作系统的移植
(4)涉及到软硬件的知识,不仅仅只是软件
二.移植过程
1.编写bootloader(ARM启动代码)
1.启动代码综述
在一般32位ARM应用系统中,软件大多数采用C语言进行编程,并且以嵌入式操作系统为开发平台,这样大大的提高了开发效率及软件性能。为了能够进行系统初始化,通常会用一个汇编文件作为启动代码。它可以实现向量表定义、堆栈初始化、系统变量初始化、中断系统初始化、I/O初始化、外围初始化和地址重映射等操作。
ARM公司之设计内核,不生产芯片,只是把内核授权给其他厂商。其他厂商购买了授权后加入自己的外设,生产出各具特 {MOD}的芯片。这样就促进了基于ARM处理器核的芯片的多元化,但也使得各种芯片的启动代码差别很大,不易编写出统一的启动代码。
2.文件的组成
汇编文件1.Startup.S:异常向量表、各模式堆栈初始化和跳到main()函数入口等
2.IRQ.S :负责管理中断嵌套
C文件 Target.C :初始化目标板
头文件 Config.H :系统配置和类型定义
Target.H :一些和目标板相关的声明
LPC2294.H :LPC2000系列芯片特殊寄存器定义
分散加载文件mem_a.Scf:在片内Flash发布,RelInFLASH
Mem_b.Scf:在片内RAM调试,DebugInRAM,在uCOSII中不使用这种布局模式
Mem_c.Scf:在片内Flash调试,DebugInFLASH
3.各源代码文件内容及其注释
1.Startup.S:
;**--------------File Info---------------------------------------------
;** File name: Startup.s
;** Last modified Date: 2009-08-17
;** Last Version: 1.0
;** Descriptions: 为 LPC2100系列芯片的启动代码,从这里开始执行,包括初始化代码,为每一种模
;** 式 的进入口和任务的堆栈
;定义堆栈的大小
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
NoInt EQU 0x80 ;Bit7,I位
NoFIQ EQU 0x40 ;Bit6,F位
USR32Mode EQU 0x10 ;M[4:0]=10000,用户模式
SVC32Mode EQU 0x13 ;M[4:0]=10011,管理模式
SYS32Mode EQU 0x1f ;M[4:0]=11111,系统模式
IRQ32Mode EQU 0x12 ;M[4:0]=10010,IRQ中断
FIQ32Mode EQU 0x11 ;M[4:0]=10001,快速中断
IMPORT __use_no_semihosting_swi
;引入的外部标号在这声明
IMPORT FIQ_Exception ; 快速中断异常处理程序
IMPORT __main ; C语言主程序入口
IMPORT TargetResetInit ;目标板基本初始化
;给外部使用的标号在这声明
EXPORT bottom_of_heap
EXPORT StackUsr
EXPORT Reset
EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY
ENTRY
;中断向量表
Reset
LDR PC, ResetAddr ;0x00,复位
LDR PC, UndefinedAddr ;0x04,未定义地址
LDR PC, SWI_Addr ;0x08,软件中断
LDR PC, PrefetchAddr ;0x0c,预取指中止
LDR PC, DataAbortAddr ;0x10,数据中止
DCD 0xb9205f80 ;0x14,保留
LDR PC, [PC, #-0xff0] ;0x18,IRQ中断
LDR PC, FIQ_Addr ;0x1C,快速中断
ResetAddr DCD ResetInit ;复位初始化处理程序地址
UndefinedAddr DCD Undefined ;未定义指令处理程序地址
SWI_Addr DCD SoftwareInterrupt ;软件中断处理程序地址
PrefetchAddr DCD PrefetchAbort ;预取指中止处理程序地址
DataAbortAddr DCD DataAbort ;数据中止处理程序地址
Nouse DCD 0 ;未使用
IRQ_Addr DCD 0 ;IRQ中断,已在"LDR [PC,#-0xff0]"中处理
FIQ_Addr DCD FIQ_Handler
;未定义指令
Undefined
B Undefined ;死循环
;软中断
SoftwareInterrupt
; B SoftwareInterrupt
;//增加开/关中断处理
CMP R0, #4 ;判断传过来的参数是否大于4
LDRLO PC, [PC, R0, LSL #2] ;小于4(参数正确),进行查表
MOVS PC, LR ;大于或者等于4(参数出错),则返回
SwiFunction
DCD IRQDisable ;0号调用,禁止IRQ中断
DCD IRQEnable ;1号调用,使能IRQ中断
DCD FIQDisable ;2号调用,禁止FIQ中断
DCD FIQEnable ;3号调用,使能FIQ中断
IRQDisable
;关IRQ中断
MRS R0, SPSR ;读取SPSR的值
ORR R0, R0, #NoInt ;置位I位,设置关IRQ中断
MSR SPSR_c, R0 ;回写SPSR
MOVS PC, LR ;返回
IRQEnable
;开IRQ中断
MRS R0, SPSR
BIC R0, R0, #NoInt ;清零I位,设置开IRQ中断
MSR SPSR_c, R0
MOVS PC, LR
FIQDisable
;关FIQ中断
MRS R0, SPSR
ORR R0, R0, #NoFIQ ;置位F位,设置关FIQ中断
MSR SPSR_c, R0
MOVS PC, LR
FIQEnable
;开FIQ中断
MRS R0, SPSR
BIC R0, R0, #NoFIQ ;清零F位,设置开FIQ中断
MSR SPSR_c, R0
MOVS PC, LR
;取指令中止
PrefetchAbort
B PrefetchAbort ;死循环
;取数据中止
DataAbort
B DataAbort ;死循环
;快速中断
FIQ_Handler
STMFD SP!, {R0-R3, LR} ;寄存器R0~R3,LR入栈
BL FIQ_Exception ;调用FIQ处理程序
LDMFD SP!, {R0-R3, LR} ;寄存器R0~R3,LR出栈
SUBS PC, LR, #4 ;计算返回地址
;/*****************************************************************************************
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮