LPC2119简介 μC/OS-II在LPC2119上的移植

发布者:清新生活最新更新时间:2023-03-06 来源: elecfans关键字:LPC2119  μC  OS-II  移植 手机看文章 扫描二维码
随时随地手机看文章

本文在分析实时嵌入式系统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

LPC2119简介 μC/OS-II在LPC2119上的移植

本文主要讨论μ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多任务调度的基础。

LPC2119简介 μC/OS-II在LPC2119上的移植

图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包含目标板特殊的代码,包括异常处理程序和目标板初始化程序,可根据程序的需要修改。

LPC2119简介 μC/OS-II在LPC2119上的移植

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

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


移植

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

① 为了增强代码的可移植性,所有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 ( )等钩子函数,用户可根据需要自行添加代码。

⑤ 在文件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处理器上大有帮助。


关键字:LPC2119  μC  OS-II  移植 引用地址:LPC2119简介 μC/OS-II在LPC2119上的移植

上一篇:用LPC2119芯片CAN总线和DSl8B20设计的智能超声液位变送器
下一篇:简述ARM微处理器的隧道照明智能控制器

推荐阅读最新更新时间:2024-11-03 19:52

基因新技术让骨髓与器官移植进入新时代
      骨髓和其他器官移植时,供者和受者之间人类白细胞抗原(HLA)相容程度越高,排斥反应的发生率就越低,移植成功率和移植器官长期存活率就越高。反之,就越容易发生排斥反应。7月开始,深圳华大基因应用新一代测序技术,只需通过一次实验就能够读取数千份样本的HLA序列数据,并一次性达到HLA分型的最高分辨率,同时还可发现新的等位基因。在检测通量、数据质量、成本控制等方面都有质的飞跃。应用这种新技术进行高分辨配型,成本不到传统技术的一半,能避免多次配型给患者造成的额外经济负担,也为治疗争取宝贵的时间。   目前我国骨髓库中的HLA分型数据多数是低分辨的,不能确保供者和患者的HLA真正匹配,患者往往需要和多个低分辨匹配的志愿者进行高
[医疗电子]
小白自学c51笔记之独立按键
先上个单片机开发板上独立按键的图(我的有四个): 上述按键中23之间,14之间(即引脚之间距离长的)本来就是连通的,按下按键后1和2,3和4连通,如果想让按键连接两支路则可把两支路分别连到1,2或分别连到3,4(我觉得连到任两引脚都可)。 开发板原理图上独立按键模块: GND为接地即低电压,如果按键k1按下则接通相当于一条导线,那么对应的P3^1也为低电压。 抖动现象:一般持续时间为5ms~10ms 按下按键后 在程序中判断P3^1或其他三个口电压是否为低电压,即0时由于存在抖动,可能造成错误,所以要消除抖动。 为了消除抖动现象,有两种方法,一是硬件消抖,二是软件消抖。本质都是延时(这个本质是我自己方便理
[单片机]
小白自学<font color='red'>c</font>51笔记之独立按键
C51编程12-中断篇(中断原理2)
中断可以用下面的例子理解 工程师A在自己的位置做着自己的工作(写代码),工程师B有个问题需要请教工程师A,于是工程师B就会跑过来跟工程A请教。这时工程师A的写代码的工作会被打断,开始回答工程B的问题,解答完问题后,工程师A又开始愉快的写代码。从工程师B打断工程师A,到工程师A继续写代码这者整个过程叫中断。 1)工程师B的问题,称为中断源 2)工程师A停止当前的工作,准备解答称为:中断响应; 3)工程师A解答问题的过程称为:中断服务程序; 4)工程师A解答完继续回到写代码的状态称为:中断返回。 中断系统 引起MCS-51中断的中断源有几种呢?从以下的中断系统中可以看到有5种中断请求源,它们分别是EX0、E
[单片机]
<font color='red'>C</font>51编程12-中断篇(中断原理2)
STM8 AT24CXX使用I2C接口读写
软件设计 /********************************************************************* 目 的: 建立AT24CXX操作库 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 *********************************************************************/ #define WD_DADR 0xa0 #define RD_DADR 0xa1 #include ws_i2c.h void AT24CXX_Init(void) { I2C_Init(); } void
[单片机]
stm32F103模拟I2C读写24c02
/*********文件名:i2c_ee.h**********/ /* Define to prevent recursive inclusion ------------------------------------ */ #ifndef __I2C_EE_H #define __I2C_EE_H /* Includes ------------------------------------------------------------------*/ #include stm32f10x.h /* Exported macro ----------------------------------------
[单片机]
十、S3C2440 开发资源
10.1 S3C2440 内部资源 1.2V 内核供电, 1.8V/2.5V/3.3V 储存器供电, 3.3V 外部 I/O 供电,具备 16KB 的指令缓存和 16KB 的数据缓存和 MMU 的微处理器 外部存储控制器(SDRAM 控制和片选逻辑) LCD 控制器(最大支持 4K 色 STN 和 256K 色 TFT)提供 1 通道 LCD 专用 DMA 4 通道 DMA 并有外部请求引脚 3 通道 UART(IrDA1.0, 64 字节发送 FIFO 和 64 字节接收 FIFO) 2 通道 SPI 1 通道 IIC 总线接口(支持多主机) 1 通道 IIS 总线音频编码器接口 AC’97 编解码器接口
[单片机]
十、S3<font color='red'>C</font>2440 开发资源
C51中头文件的写法
一、头文件位置 #include xxx.h 优先在系统默认路径查找头文件 #include“xxx.h”有现在项目路径查找头文件 二、#ifndef和#endif 通常形式为 #ifndef _xxxx_h_ #define _xxxx_h_ .........(头文件具体内容) #endif 这样的写法表示,如果_xxxx_h_还没有被定义,那么头文件内容将被执行,如果已经定义过了,那么头文件内容就不执行了。作用在于,如果某头文件被不同c文件同时调用,那么里面的内容不至于因为重复定义而出错,因为不管调用几次头文件,其内容只有在第一次出现时被执行,同时定义一个_xxxx_h_,以后再次调用时,头文件内容被忽
[单片机]
嵌入式操作系统Windows CE.NET在S3C2410平台上的移植
目前,嵌入式微处理器种类很多,嵌入式操作系统要支持尽可能多的处理器,这就要完成操作系统针对不同处理器的定制。   本文分析了嵌入式操作系统Windows CE。NET的特点,并利用工具Platform Builder 4。2完成了其在以ARM920T为核心的S3C2410处理器上的定制。   1 Windows CE系统和Platform Builder 4.2   Windows CE是微软推出的一个32位、多线程、多任务的嵌入式操作系统,是微软专门为信息设备、移动应用、嵌入式应用等设计的嵌入式模块型操作系统。用户可选择、组合和配置Windows CE。NET的模块和组件来创建用户版的操作系统。   W
[单片机]
嵌入式操作系统Windows CE.NET在S3<font color='red'>C</font>2410平台上的<font color='red'>移植</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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