嵌入式系统μC/OS-II在LPC2119上的移植方法和技巧

发布者:玉米哥哥最新更新时间:2012-09-17 来源: 21ic 关键字:嵌入式系统  μCOS-II  LPC2119 手机看文章 扫描二维码
随时随地手机看文章

本文在分析实时嵌入式系统mC/OS-II和LPC2119芯片的基础上,对mC/OS-II向处理器上移植前需要了解的知识和需要做的前期准备工作进行了分析和讨论,最后给出了移植的具体工作。论文着重分析了mC/OS-II的移植。

μC/OS-II是一个完整的,可移植、可固化、可裁减的占先式实时多任务内核,它功能强大,支持56个用户任务,支持信号量、邮箱、消息队列等多种常用的进程间通信机制。公开源代码,程序可读性强、移植性好,同时可免费获得。

LPC2119是由PHILIPS生产的一款32位ARM7TDMI-S微处理器,其核心为高性能的32位RISC体系结构,并具有高密度的16位指令集和极低的功耗。具有零等待128K字节的片内FLASH,16K的SRAM,无需扩展存储器,使系统更为简单、可靠。

表1

 

 

本文主要讨论μC/OS-II在LPC2119上的移植,同时对移植前需要掌握的基本知识进行了分析,特别是对与移植密切相关的三个文件进行了详细分析,还对用到的芯片的重映射概念进行了详细说明。

LPC2119简介

LPC2119片上资源除了上面介绍的存储器外,还有2个UART、高速I2C接口、2个SPI接口、6路输出的PWM单元、4路10位AD转换器、2个32位定时器、2个CAN通道、实时时钟及看门狗等,通过片内PLL可实现最大为60MHz的CPU操作频率。

由于下文启动代码的编写要用到重映射(remap)的概念,LPC2119以及其它系列的芯片如AT91等也都有重映射的功能,所以在此加以说明对其它ARM芯片的学习具有借鉴作用。

在ARM芯片的存储器中,异常向量表如表1所示。

当系统上电后,程序将自动从0地址处开始执行,因此在系统的初始状态,要求0地址处的存储器是非易性的ROM或Flash等。但是ROM或Flash的访问速度相对较慢,每次中断发生后,都要从读取ROM或Flash上的向量表开始,影响了中断响应速度。因此,LPC2119提供一种灵活的地址重映射方法,该方法可以将内部RAM的地址重新映射到0x0的位置。在系统执行重映射命令之前,需要将Flash中的中断向量代码拷贝到内部RAM中。这样在重映射命令执行之后相当于从内部RAM中0x0的位置找到中断向量,而实际上是将RAM的起始地址0x40000000映射为0x0了。这样,中断执行时相当于在 RAM中找到对应中断向量,实现异常处理调试。

μC/OS-II的介绍

μC/OS-II实际上是一个嵌入式操作系统内核,内核提供的基本服务就是任务切换。在μC/OS-II中,为每个任务分配专门的堆栈空间。μC/OS-II进行任务切换的时候,会把当前任务的CPU寄存器放到此任务的堆栈中,然后再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是μC/OS-II多任务调度的基础。

 

 

图1 μC/OS-II硬件和软件体系结构

μC/OS-II的结构如图1所示。

如图1所示,与处理器相关的代码只有三个文件,一般移植的时候只要修改这三个文件就可以了。

编写启动代码

启动代码是芯片复位后进入C语言的main()函数前执行的一段代码,主要是为运行C语言程序提供基本运行环境,如初始化外围部件、存储器系统等。因此启动代码的功能有些类似PC机中的BIOS和VxWorks中的 Bootloader。由于飞利浦未提供该芯片的启动代码,所以需要自己编写启动代码。

启动代码可以划分为五个文件: STartup.s、IRQ.s、stack.s、heap.s和target.c。Startup.s包含了前面提到的异常向量表和系统初始化代码,一般无需改动;IRQ.s包含中断服务程序与C程序的接口代码,可根据实际使用的中断情况进行少量修改;stack.s和heap.s保存C语言使用的堆和栈的开始位置;target.c包含目标板特殊的代码,包括异常处理程序和目标板初始化程序,可根据程序的需要修改。

 

 

图2 系统基本初始化Tar get Peset1 ni t()流程图

由于启动代码的编写很长,而本文只是想指出编写启动代码是移植前必须做的准备工作并对其进行简要说明,因此在这里就不具体列出所有代码(具体的启动代码见参考文献[1]),而给出一个很重要的目标板初始化程序中的函数TargetReseTInit()的流程图,从中可以看出在进入main ()函数前对系统进行的基本初始化工作的具体步骤。[page]

移植

有了上面的知识和编写启动代码这项准备工作完成后,就可以进入具体移植阶段了。主要完成以下工作:

① 为了增强代码的可移植性,所有C文件添加头文件includes.h。

② 用户程序添加config.h。

③ 在文件OS_CPU.H中需要添加或修改的主要代码有:

定义不依赖于编译器的数据类型:

typedef unsigned char INT8U;

typedef unsigned short INT16U;

typedef unsigned int INT32U;

typedef INT32U OS_STK;

使用软中断SWI作底层接口:

__swi(0x00) void OS_TASK_SW(void); /* 任务级任务切换函数 */

__swi(0x01) void _OSStartHighRdy(void); /* 运行优先级最高的任务 */

__swi(0x02) void OS_ENteR_CRITICAL(void); /*关中断 */

__swi(0x03) void OS_EXIT_CRITICAL(void); /* 开中断 */

__swi(0x80) void ChangeToSYSMode(void); /* 任务切换到系统模式 */

__swi(0x81) void ChangeToUSRMode(void); /* 任务切换到用户模式 */

#define OS_STK_GROWTH 1 /* 堆栈是从上往下长的*/

定义工作模式:

#define USR32Mode 0x10 /* 用户模式 */

#define SYS32Mode 0x1f /* 系统模式*/

#define NoInt 0x80

#ifndef USER_USING_MODE

#define USER_USING_MODE USR32Mode /* 任务缺省模式*/

#endif

定义开关信号量: extern OS_STK OsEnterSum

④ 在文件OS_CPU_C.C中需要添加或修改的代码:

OS_ENTER_CRITICAL()代码

__asm

{ MRS R0, SPSR

ORR R0, R0, #NoInt

MSR SPSR_c, R0

}

OsEnterSum++;

OS_EXIT_CRITICAL()代码

if (--OsEnterSum == 0)

{ __asm

{ MRS R0, SPSR

BIC R0, R0, #NoInt

MSR SPSR_c, R0

}

}

编写任务堆栈的初始化代码:

OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)

{ OS_STK *stk;

opt = opt; /* \'opt\' 没有使用。作用是避免编译器警告 */

stk = ptos; /* 获取堆栈指针*/

/* 建立任务环境,使用满递减堆栈 */

*stk = (OS_STK) task; /* pc */

*--stk = (OS_STK) task; /* lr */

*--stk = 0; /* r12 */

?? /*r11?r2*/

*--stk = 0; /* r1 */

*--stk = (unsigned int) pdata; /* r0,第一个参数使用R0传递 */

*--stk = (USER_USING_MODE|0x00); /* spsr,允许 IRQ, FIQ 中断 */

*--stk = 0; /* 关中断计数器OsEnterSum; */

return (stk);

}

编写如void OSInitHookBegin ( )、void OSInitHookEnd ( )、void OSTaskCreateHook ( )、void OSTaskDelHook ( )等钩子函数,用户可根据需要自行添加代码。[page]

⑤ 在文件OS_CPU_A.S中需要添加或修改的代码:

编写运行优先级最高的就绪任务函数OSStartHighRdy()调用的__OSStartHighRdy代码

__OSStartHighRdy

MSR CPSR_c, #(NoInt | SYS32Mode)

LDR R4, =OSRunning

MOV R5, #1

STRB R5, [R4]

BL OSTaskSwHook

LDR R6, =OSTCBHighRdy

LDR R6, [R6]

B OSIntCtxSw_1

编写OSIntCtxSw代码

由于篇幅所限,这里给出OSIntCtxSw函数原型,可由此编写代码。源代码详见参考文献[1]。

void OSIntCtxSw(void)

{

调用用户定义的OSTaskSwHook();

STCBCur=OSTCBHighRdy;

SPrioCur=OSPrioHighRdy;

得到需要恢复的任务的堆栈指针;

堆栈指针=OSTCBHighRdy->OSTCBStkPtr;

将所有处理器寄存器从新任务的堆栈中恢复出来;

执行中断返回指令;

}

由于篇幅所限,以上给出了移植时需要修改的与处理器相关的三个文件中的主要代码,当然更详细的移植说明可见参考文献[1].为了验证移植成功与否,你可以编写一个简单用户程序(例如通过串口通讯在PC界面显示字符)与mC/OS-II一起编译烧写进芯片来检验,笔者已经试验成功。

需要避免的错误

用户程序中的includes.h要修改为config.h,这是因为后者包含了前者和特定的头文件以及配置项。

数据类型的定义不能直接使用C中的short、int、long等,因为它们与处理器类型有关,隐含着不可移植性,所以在OS_CPU.H中定义移植性强的不依赖于编译器的数据类型。

必须定义堆栈的生长方向,1表示堆栈从上往下长,0表示堆栈从下往上长,ARM处理器两种方式都支持,但使用的ADS编译器仅支持从上往下长的方式,因此必须定义为1,否则将发生寄存器值入栈错误。

注意任务堆栈初始化函数中的stk指针定义成INT32U,这是因为我们的处理器是32位的,对堆栈操作也是4字节对齐的。如果处理器是16位的,且对堆栈访问也是2字节对齐的,就要将stk定义成INT16U,否则将会发生严重错误。

结语

μC/OS-II具有很好的可靠性、实时性和可裁减性,很适合于工业控制、通信等对实时性、可靠性要求高的领域。笔者采用广州周立功公司的EASYARN2100试验开发板,已经成功把μC/OS-II移植到该开发板上。如果用户对ARM处理器及相关底层硬件和μC/OS-II有一定了解,参照本文,对将μC/OS-II移植到LPC21xx系列ARM处理器上大有帮助。

关键字:嵌入式系统  μCOS-II  LPC2119 引用地址:嵌入式系统μC/OS-II在LPC2119上的移植方法和技巧

上一篇:LPC2378中使用USB和以太网的RAM
下一篇:基于S3C2440的嵌入式IPv6防火墙设计

推荐阅读最新更新时间:2024-03-16 13:08

基于嵌入式系统的多媒体控制前台设计
系统的应用场合及意义 在一个大型会议系统或多媒体电教室系统中往往通过中央控制系统,实现整个系统的集中控制。点击LCD触摸屏,就能实现各种视像信号的快速切换(视频信号、电脑信号)、灯光系统的调光或自动快速模式设定,以及各种音响系统调节,摄像、监控、大屏幕投放、窗帘收放等一系列功能的程序化控制。 这里的中央控制系统实际上是由一个带处理器的智能控制平台和带多媒体设备接口的多路继电器组成,前台控制器可以设计成固定的台式模式,也可以设计成便于携带的手持设备,它往往是通过无线方式控制多路继电器主机,进而控制各种多媒体设备的开关及运行。嵌入式系统的发展为这一媒体控制器提供了一个可靠的平台,而嵌入式处理器的更新换代则意味着这个平台将更加
[应用]
嵌入式系统的学科建设”研讨会即将召开
成立一年的嵌入式系统联谊会即将迎来本年度的最后一次主题讨论会,本次主题是“嵌入式系统学科建设”。联谊会自成立以来得到嵌入式系统业内各界朋友的支持和关心,已经成功地举办了“嵌入式系统的集成电路产业”,“嵌入式软件产业与软件集成”,和9月份召集的“嵌入式系统的产业模式思考”三次主题讨论会,反响热烈。 在嵌入式系统快速发展十年后,研究和探讨嵌入式系统的学科基础,即弄清嵌入式系统的知识结构、学科交互状况、个人与团队如何在嵌入式系统中准确定位;嵌入式系统学科的产业关系,即高校嵌入式系统科研团队的产业服务方向与内容,怎样从产业发展中找出路;高校中的嵌入式的学科建设,即以高校嵌入式相关专业为主,总结、交流与探讨高校中嵌入式系统的专
[嵌入式]
嵌入式系统启动流程(学习笔记)
Bootloader启动阶段 3个2 两个阶段:汇编语言阶段,C语言阶段 两次硬件初始化:基本硬件初始化,初始化时钟串口flash等 大部分硬件初始化 两次搬移:自搬移到内存,搬移内核到内存 linux内核启动阶段 自解压内核 运行内核汇编部分,检测合法性(CPU类型等) 运行内核C部分 挂载rootfs 运行第一个应用程序init(一般是linuxrc) 根文件系统阶段(可运行应用程序)
[单片机]
<font color='red'>嵌入式系统</font>启动流程(学习笔记)
以DSP为核心的嵌入式系统人机接口设计
1 引言 人机接口是嵌入式控制系统的重要组成部分,用于人机之间实时交换控制系统并返回系统状态。嵌入式系统大都采用液晶屏和键盘作为人机接口的输入、输出设备。这里设计的人机接口作为数据采集系统的组成部分,为系统控制和运行监测提供方便,而其本身在各种嵌入式控制系统中又具有广泛的实用性。 2 液晶屏显示功能的实现 这里采用的液晶显示器为RT320240B。该显示器的控制器使用SEIKO EPSON公司生产的SED1335型控制器。DSP访问SED1335时,无需判断其是否空闲,SED1335能够随时准备接受DSP的访问并按照内部时序及时正确传输DSP发送的指令、数据。考虑到RT320240B是大屏幕液晶显示器,显示数据
[嵌入式]
基于嵌入式系统的语音口令识别系统的实现
  0 引言   随着计算机技术和信息技术的迅速发展,语音口令识别已经成为了人机交互的一个重要方式之一。语音口令识别系统将根据人发出的声音、音节或短语给出响应,如通过语音口令控制一些执行机构、控制家用电器的运行或做出回答等。在数字信号处理芯片上已经实现了语音口令识别系统或语音口令识别系统的部分功能,然而随着嵌入式微处理器处理能力的大幅度提高,计算量大的语音口令识别算法已经能够通过嵌入式微处理器来完成,将语音口令识别系统与嵌入式系统相结合,发挥语音识别系统的潜力,使语音识别系统能够广泛应用于便携式设备中。   采用隐马尔克夫模型(Hidden Markov MODEL,HMM) 描述语音信号的非平稳性和局部平稳性,HMM中的
[嵌入式]
STM32嵌入式系统设计的智能控制网络终端技术
  本文重点介绍基于STM32的智能嵌入式终端的网络控制功能的设计和实现。 智能网络终端是实现智能化管理的嵌入式终端设备。通常具有安全门禁系统和自动化控制的基本功能。   1智能网络通信实现方案   将嵌入式系统与Internet连接起来实现远距离信息获取和控制功能的本质是嵌入式系统本身能够实现TCP/IP网络通信协议。该协议的解决方案总体上可分为两大类。第一类是直接在嵌入式设备上实现TCP/IP,使之直接连上Internet。这实质上是由MCU及内部固化TCP/IP协议的芯片组成应用系统的核心,MCU可以直接拨号上网,这种方法的硬件电路相对简单,也不需要中间环节的支持。但是由于使用了TCP/IP协议芯片,因此需要大容量的程序
[单片机]
STM32<font color='red'>嵌入式系统</font>设计的智能控制网络终端技术
基于PLD的嵌入式系统外存模块设计
摘要:以MCS-96系列单片机为例,介绍了一种采用可编程逻辑器件(PLD)的存储器模块的设计方案,该模块包含了Flash闪存和RAM。提出了一种方便的存储器扩展方法,该方法有效地解决了嵌入式系统尤其是数据采集、存储等系统中存在的存储空间不足问题。该方案具有通用性强、读写控制简单等特点,具有很强的实用性。 关键词:PLD 存储器 RAM 单片机 闪存 在嵌入式系统中,由于设计成本和体积等因素的限制,往往会使CPU(包括DSP、单片机等)存在地址空间不足的问题。很多文献(如参考文献[1]都有相关的存储器扩展方法的介绍, 目前已有的方法通常是借助于CPU的I/0接口产生片选或者高位地址信号, 利用这些信号将内存分页,但当页间跳
[嵌入式]
μCOS-II在ARM Cortex-M3处理器上的移植
0 引言 嵌入式系统已经广泛渗透到了人们工作、生活中的各个领域,嵌入式处理器已占分散处理器市场份额的94%,其中ARM的应用最为广泛。基于ARM内核的处理器以其诸多优异性能而成为各类产品中选用较多的处理器之一。 当系统越来越大,应用越来越多时,就出现了如何管理众多的硬件资源,以及如何满足系统的实时控制要求和如何提高系统软件开发效率等不可回避的问题。这时,使用嵌入式操作系统很有必要。操作系统的主要作用有:统一管理系统资源;为用户提供访问硬件的接口;调度多个应用程序和管理文件系统等。 1 概述 μC/OS-II是著名的、源码公开的实时内核,是专为嵌入式应用设计的,可用于各类8位、16位和32位处理器。μC/OS-II已经
[单片机]
μ<font color='red'>COS-II</font>在ARM Cortex-M3处理器上的移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved