DSP

基于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         ;计算返回地址 ;/*****************************************************************************************