嵌入式实时操作系统μC/OS-II在LPC2378上的移植及应用

发布者:keiss2018最新更新时间:2010-08-31 来源: 现代电子技术 关键字:LPC2378  实时操作系统  移植 手机看文章 扫描二维码
随时随地手机看文章

  O 引言

  目前,市场以及院校科研用嵌入式系统产品,如Vxworks,Linux和Windows CE等都已经相当成熟,提供了有力的开发和调试工具,但有些开发成本昂贵,周期较长,而μC/OS-Ⅱ是一种多任务实时源代码的公开操作系统,内核精简,移植性较强,非常适合用于一些小型控制和实验系统的开发。

  1 操作系统及CPU介绍

  μC/OS-Ⅱ是基于优先级的占先式实时多任务操作系统,包含有任务管理、时间管理、任务间同步通信(信号量,邮箱,消息队列)和内存管理等功能。绝大部分代码用C语言写成,极少部分与处理器密切相关的代码用汇编语言编写,便于移植。作为一个源代码公开的实时操作系统,最多可以管理64个任务,并支持信号量、邮箱、消息队列等多种进程间的通信机制,同时用户可以根据需求对内核中的功能模块进行裁剪。

  LPC2378是一款基于ARM7TDMI-S内核的嵌入式精简指令集微控制器,包含了1个支持仿真的ARM7TDMI-SCPU,适用于为了各种目的而需要进行串行通信的应用。该体系机构支持用户、软中断、中断、管理、中止、未定义、系统等7种处理器模式,ARM7TDMI-S处理器内部有31个通用32位寄存器,6个状态寄存器。LPC2378包含了1个10/100 EthernetMAC,USB 2.0全速接口,4个UART接口,2路CAN通道,1个SPI接口,2个同步串行端口(SSP),3个I2C接口,1个I2S接口和MiniBus(MiniBus仅用于LPC2378,它是8位数据/16位地址并行的总线)。下面以μC/OS-Ⅱ在工业级芯片LPC2378上的移植为例,通过分析操作系统内核来介绍μC/OS-Ⅱ操作系统移植的一般方法和过程及相关问题的解决。

  2 μC/OS-Ⅱ内核结构及工作原理

  2.1 内核基本结构

  图1是接近μC/OS-Ⅱ的简单内核体系结构图,内核保留给上层应用的接口有3个,分别是软保护、ITC和DSR。由于μC/OS-Ⅱ操作系统内核是可剥夺型实时多任务内核,因此最高优先级的任务一旦就绪,总能得到CPU的使用权。如果是中断服务子程序使一个高优先级的任务进入就绪态,则中断完成时,中断了的任务被挂起,优先级高的任务开始运行。

  2.2 μC/OS-Ⅱ内核基本工作原理

  多任务系统中,操作系统内核负责管理各个任务,或者说为每个任务分配CPU,并且负责各任务之间的通信和协同,任务切换是内核提供的基本服务。μC/OS-Ⅱ多任务操作系统的基本工作原理如下:

  (1)在使用μC/OS-Ⅱ的所有服务之前,必须调用初始化函数OSInit(),初始化所有的变量和数据结构,同时创建空闲任务OSTaskIdle(),并赋予最低的优先级别和永远的就绪态,同时完成任务控制块(TCB)的初始化、TCB优先级表的初始化、TCB链表的初始化和事件控制块(ECB)链表的初始化。

  (2)调用OSTaskCreate()或OSTaskCreateExt()创建至少一个新任务,并给任务赋予一定的优先级,而且它们有各自的一套CPU寄存器和自己的栈空间。

  (3)调用OSSTART()函数,通过从任务就绪表中找出用户建立的优先级别最高的任务控制块,然后开始多任务调度。

  3 μC/OS-Ⅱ在LPC2378上的移植过程及相关问题分析

  现以LPC2378微控制器上的移植为例,分析μC/OS-Ⅱ操作系统移植的一般方法,所采用的开发环境为ARM公司的集成开发环境ADS1.2。

  3.1 移植代码

  (1)μC/OS-Ⅱ与CPU类型无关的代码有μC/OS-Ⅱ.H,μC/OS-Ⅱ.C,OS_CORE.C,OS_TASK.C,OS_TIME.C,OS_SEM.C,OS_MBOX.-C,OS_MUTEX.C,OS_FLAG.C,也就是说这些文件可以不用修改就直接添加。

  (2)μC/OS-Ⅱ与CPU类型有关的代码有OSCPU.H,OS_CPU_A.ASM,OS_CPU_C.C,也就是说用户需要根据所选CPU的类型将这些函数进行修改后才能添加入内核。

  3.2 OS_CPU.H文件的定义与修改

  OS_CPU.H文件定义了与编译器及CPU相关的数据类型、堆栈的宽度和增长方式以及开关中断的宏定义。由于微处理器和微控制器所支持的堆栈增长方式不同,这里需要根据所选芯片LPC2378支持的类型对宏OS_STK_GRWOTH进行定义,由于ARM7 TD-MI-S内核堆栈支持从上往下的生长方式,所以应做如下定义:

  #define OS_STK_GROWTH 1 //堆栈是从上往下长的OS_CPU.H文件中另外3个宏OS_CRITICAL_METHOD,OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()用于定义开关中断的方式及开关中断的实现。通过调用开关中断2个宏来保护临界代码如下:

  3.3 OS_CPU_C.C文件中主要函数的定义及编写

  OS_CPU_C.C中要求用户编写10个简单的函数:

  结合要移植的CPU内核的硬件和寄存器特性,简要对任务堆栈初始化函数进行分析和创建:

  其他9个函数必须声明,但并不一定包含任务代码。

  3.4 μC/OS-Ⅱ的移植

  μC/OS-Ⅱ的移植,还要求编写4个简单的汇编语言函数;即OSStartHighRdy(),OSintCtxSw(),OSTIckISR(),OSCtxSw()。

  3.4.1 函数OSStart()调用OSStartHighRdy()

  函数OSStart()用于调用OSStartHighRdy(),以使使就绪态任务中优先级最高的任务开始运行:

  3.4.2 时钟节拍中断服务程序

  μC/OS-Ⅱ要求用户提供一个周期性的时钟源,以实现时间延迟和超时确认功能,时钟节拍每秒发生10~100次。必须在开始多任务后,启动时钟节拍中断,但由于Osatart()函数不会返回,用户无法实现这一操作,所以可以在OSStart()运行之后,μC/OS启动的第1个任务中初始化节拍中断。基于LPC2378移植下OSTicklSR()的简易代码编写如下:

  当时钟节拍中断发生时,CPU会自动把CPU寄存器推入堆栈,但并不包括存储页面寄存器PPAGE,如果单片机系统的寻址范围超过64 KB,则需要通过给PPAGE赋值来区分不同的16 KB地址,需要把PPAGE也推入堆栈。当某任务的任务控制块中时间延时项OSTCBDly减到了零,OSTi-mtick()就进入了就绪态。OSIntExit()会调用中断级的任务切换函数OSIntCtxSw执行任务切换,而不再执行后面的指令。如果没有更高优先级的任务进入就绪态,则CPU会返回中断前状态。

  3.4.3 任务级任务切换

  实际上任务级的切换就是通过执行软中断指令,或者根据处理器的不同,执行TRAP指令来实现。中断服务子程序、TRAP或者异常处理的向量地址必须指向OSCtXSW(),利用系统在跳转到中断服务程序时会自动把断点指针压入堆栈的功能,把断点指针存入堆栈,而利用中断返回指令IRET,能把断点指针推入CPU的PC寄存器功能,恢复待运行任务的断点,这样就可以实现断点的保存和恢复。

  3.4.4 中断级任务切换

  OSIntExit()通过调用OSIntSw(),在ISR中执行任务切换函数。因为OSIntCtxSw()是在ISR中被调用的,所以假定所有的处理器寄存器都被正确地保存到了被中断任务的堆栈中。OSIntSw()函数的绝大多数代码与OSCtxSw()函数是一样的,区别只是:因为ISR已经保存了CPU的寄存器,而不再需要在OSIntSw()函数中保存CPU的寄存器。在进行操作系统移植时,该段程序的代码如下:

  3.5 移植中的问题

  ARM处理器的软件调试通过JTAG口直接在系统的外部SRAM运行,因此在程序调试之前,ARM处理器的开发环境软件首先调用初始化文件(*.ini),用户可以根据自己系统的外部存储器和设备的地址来修改文件。如果该文件有误,开发环境软件将无法通过JTAG与处理器通信。系统调试过程中,经常会出现程序跑飞的现象,经过测试与分析,主要有4个方面原因:

  (1)中断处理程序的中断矢量地址没有正确赋值,从而导致发生中断后CPU无法运行到中断处理程序位置;

  (2)在OsctxSw和OSIntctxSw中的任务切换语句后加人几条NOP空语句,确保任务切换的相应指令执行结束,如果在这些位置没有加相应的空操作指令,也会导致程序跑飞;

  (3)由于堆栈的空间分配不够,以及没有给CPU的各个工作模式分配空间,导致任务切换时,堆栈溢出;

  (4)μC/OS-Ⅱ要求用户提供一个时钟资源来实现时钟节拍,时钟节拍应该每秒钟发生10~100次,用户必须在开始多任务调度后(即调用OSStart后)允许时钟节拍中断。通常的错误是在调用OSlnit()和OSStart()之间允许时钟节拍中断,同时用户不要单纯地追求实时性,而将系统的时钟节拍频率增加太高。以上几个方面的问题解决后,系统的工作非常稳定。

  4 系统测试

  移植完成后的系统包括4个部分:自启动程序、μC/OS-Ⅱ系统文件、移植代码、应用程序。开发环境是ARM公司提供的ADSl.2(ARM Dev-eloper Suite)。该系统创建了以下3个任务来验证μC/OS-Ⅱ的移植成功:

  在为自己的微处理器做完μC/OS-Ⅱ的移植后,首先建立3个任务,之后不加任何其他应用代码来测试移植好的μC/OS-Ⅱ,也就是说应该先测试内核自身的运行状况。这样做有2个原因:不希望将事情复杂化;如果有些地方没有工作可以明白是移植本身的问题,而不是应用代码产生的问题。经过测试和修改,无相关错误产生,说明移植成功。

  5 结语

  μC/OS-Ⅱ具有很强的移植性,具有多任务实时可剥夺型内核,而且代码量较小,源代码开放,可被广泛移植到8位、16位等许多微处理器上。国外诸如APC,ROTEK等企业都在产品中成功地使用了μC/OS-Ⅱ内核,不仅开发成本低,而且系统精简,因此将μC/OS-Ⅱ移植到LPC-2378这种工业级的芯片上,具有相当的商业价值。

关键字:LPC2378  实时操作系统  移植 引用地址:嵌入式实时操作系统μC/OS-II在LPC2378上的移植及应用

上一篇:微软招募测试工程师开发Windows 8嵌入式系统
下一篇:嵌入式Linux技术在工业控制网络中的应用

推荐阅读最新更新时间:2024-05-02 21:08

S5PV210(TQ210)学习笔记——内核移植与文件系统构建
由于之前做过2440和6410,鉴于时间原因,这里暂时跨过其他模块的裸机驱动和uboot移植,直接进入内核移植及驱动开发方面的学习。 内核移植其实很简单,因为内核是linus率领的linux内核开发团队开发并维护的,我们只需要跟我们的平台交叉编译一下即可使用,但是,内核移植也不简单,因为内核移植起见出现任何问题都可能会被卡住,因为内核代码非常庞大,我们无法通读内核代码,下面是我移植期间遇到的各种悲催的问题和解决方案,首先是必备的开发环境: a) Linux内核代码,版本3.8.3 b) S5PV210开发板(我的是TQ210) c) HOST环境是WIN7(64位)下安装的Ubuntu虚拟机(12.10) 一 内核编译 从
[单片机]
S5PV210(TQ210)学习笔记——内核<font color='red'>移植</font>与文件系统构建
Exynos4412 内核移植(二)—— 内核编译过程分析
内核的编译同样是从Makefile 来分析: 一、内核源码结构 Linux内核文件数目近2万,出去其他架构CPU的相关文件,他们分别位于顶层目录下的17个子目录,各个目录功能独立,下面是常用目录: arch:体系结构相关代码 ipc:进程调度相关代码 mm:内存管理 Documentation:帮助文档 net:网络协议 lib:库 scripts:编译相关脚本工具 tools:编译相关工具 drivers:设备驱动 fs:文件系统实现 对于ARM 架构的Exynos4412,其体系相关的代码在arch/arm/目录下,在后面进行的Linux移植时,开始的工作正式修改这个目录下的文件。 二、Linux Make
[单片机]
Exynos4412 内核<font color='red'>移植</font>(二)—— 内核编译过程分析
u-boot-2009.08在mini2440上的移植(六)---增加引导内核功能
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,参考文章: http://blogold.chinaunix.net/u3/101649/showart.php?id=2105215 http://blogimg.chinaunix.net/blog/upfile2/100811115954.pdf http
[单片机]
简述STM32单片机开发中的RTOS
很多STM32单片机初学者都是从裸机开始的,裸机确实也能开发出好的产品。但是,作为一个嵌入式软件工程师,况且用的并不是51那种低端单片机,如果只会用裸机开发产品,那肯定是不够的。 要从裸机的思维转变到RTOS(Real Time Operating System)的思维,其实需要一个过程,而且开始的一段时间会很痛苦。但过一段时间理解了一些内容,能写一些Demo之后,你会发现其实RTOS也不难。 现在FreeRTOS在CubeMX工具中可以直接配置并使用,相当方便。 为什么需要RTOS 为什么我们需要RTOS?就像最开始学C编程时,老师告诉我们,指针很重要,那时你肯定有一个大的疑问,指针到底有什么好? 心里一直犯嘀咕着:不用
[单片机]
Imagination加强ThreadX RTOS对MIPS的支持
Imagination 与 Express Logic 合作扩大 ThreadX RTOS 对 MIPS CPU 的进一步支持 适用于多线程 MIPS interAptiv 内核的 ThreadX/SMP 现已就绪 2013 年 12 月 12 日 —— Imagination Technologies (IMG.L) 和 Express Logic 近日宣布,已扩展 Express Logic 广受欢迎的 ThreadX RTOS (实时操作系统) 对 Imagination MIPS CPU 的支持。采用 MIPS interAptiv CPU 后,进一步延伸了 ThreadX 对各代 MIPS CPU 的支持,从深度嵌入式
[嵌入式]
Armboot在EV40评估板上的移植
摘要:介绍Armboot以及EV40评估板的特点;详细讨论Armboot在EV40上的移植并给出主要代码;以Flash编程为例,介绍与评估板相关Armboot命令的实现。 关键词:Armboot AT91M40800 ARM 移植 1 Armboot简介 Armboot是一个bootloader,是为基于ARM或者StrongARM CPU的嵌入式系统所设计的。它支持多种类型的Flash;允许映像文件经由bootp、dhcp、tftp从网络传输;支持从串口线下载S-record或者binary文件;允许内存的显示及修改;支持jffs2文件系统等。Armboot源码公开,可以在http://www.sourceforg.ne
[应用]
嵌入式浏览器Konqueror/E的实现
1 Konqueror/E概述     随着网络科技的进步,因特网与无线网络的融合将成为必然趋势。要在嵌入式设备上访问因特网,浏览器是必不可少的。目前,嵌入式浏览器已经逐渐成为高端手机和PDA的标准配置。嵌入式浏览器的另一大作用就是在网页中利用CGI(CommonGateway Interface:公用网关接口)来调用其他可执行程序。这样控制页面可以做的很美观,而且可扩展性好。     现在已经面市的嵌入式浏览器大多市商业版本的,如Opera、MS Explorer等。而Konqueror/embedded是符合GNU条款的自由软件。Konqueror/embedded是针对嵌入式Linux,由著名的桌面操作环境KDE下的浏览器
[嵌入式]
TinyOS在MSP430F2618上移植(四)之FLASH
本节叙述串口FLASH在TinyOS上的移植。 FLASH采用华邦的W25X80,存储容量8M bit,通过SPI接口进行数据读写,具有写保护功能。 采用3层模型,最底层实现在特定平台中的引脚连接,以及SPI接口的连接。中间层提供Flash接口,该接口为带参数接口(主要是为了学习带参数接口的应用,FLASH的擦除可以体现此方法的优点),参数即为写FLASH的命令。最高层提供应用层模块的接口。 在本架构中,中间层和最高层提供相同的接口Flash,该接口提供的实现方法有erase,perase(提供块擦除和区域擦除),read,write。最高层接口的实现中并没有给出真正的FLASH操作代码,而仅仅是保存了应用层传递的参数,并
[单片机]
小广播
热门活动
换一批
更多
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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