μC/OS-II系统在AVM处理器上的移植

发布者:BlissfulWhisper最新更新时间:2013-04-12 来源: dzsc关键字:μCOS-II  S3C44BOX  移植 手机看文章 扫描二维码
随时随地手机看文章

μC/OS-II功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制,现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是,μC/OS-II公开所有的源代码,90%的代码使用标准的ANSI C语言书写,程序可读性强、移植性好;同时它可免费获得,即使商业应用也只收取少量的许可费用。因此,对μC/OS-II实时操作系统的学习研究、开发、应用具有重要意义。

Samsung S3C44B0X微处理器是三星公司专为手持设备和其它嵌入式应用提供的高性价比的微控制器解决方案。它使用ARM公司的16位/32位RISC结构,内核是ARM7TDMI,工作在66MHz,片上集成了以下部件:8K Cache、外部存储器控制器、LCD控制器、4个DMA通道、2个UART、1个多主I2C总线控制器、1个I2C总线控制器,以及5通道PWM定时器和1个内部定时器、8通道12位ADC等,能够与常用的外围设备实现无缝连接,功能强大。目前,国内应用较为广泛。

1 μC/OS-II实时操作系统结构

图1说明了μC/OS-II的软硬件体系结构。应用程序处于整个系统的顶层,每个任务都可以认为自已独占了CPU,因而可以设计成为一个无限循环。μC/OS-II处理器无关的代码提供了μC/OS-II的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信及创建、删除任务等。

大部分的μC/OS-II代码是使用ANSI C语言书写的,因此μC/OS-II的可移植性好,然而仍需要使用C和汇编语言写一些处理器相关代码。μC/OS-II的移植需要满足以下要求:

①处理器的C编译器可以产生可重入代码;

②可以使用C调用进入和退出临界区代码;

③处理器必须支持硬件中断,并且需要一个定时中断源;

④ 处理器需要能够容纳一定数据的硬件堆栈;

⑤处理器需要有能够在CPU寄存器与内核和堆栈交换数据的指令。

S3C44B0X处理器完全满足上述要求。

2 实时内核μC/OS-II在S3C44B0X上的移植

我们使用ARM SDT编译器,移植μC/OS-II主要包括以下几个步骤。

(1)设置OS_CPU.H中与处理器和编译器相关的代码

*************************************************

与编译器相关的数据类型

*************************************************

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U; /*8位无符号整数*/

typedef signed char INT8S; /*8位有符号整数*/

typedef unsigned short INT16U; /*16位有符号整数*/

typedef signed short INT16S; /*16位无符号整数*/

typedef unsigned long INT32U; /*32位无符号整数*/

typedef signed long INT32S; /*32位有符号整数*/

typedef float FP32; /*单精度浮点数*/

typedef double FP64; /*双精度浮点数*/

typedef unsigned int OS_STK;/*堆栈入口宽度为16位*/与ARM处理器相关的代码:

#define OS_ENTER_CRITICAL () ARMEnableInt() /*开启中断*/

#define OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/

(2)用C语言编写6个操作系统相关的函数(OS_CPU_C.C)

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

{ unsigned int *stk;

opt =opt; /*因“opt”变量没有用到,防止编译器产生警告*/

stk =(unsigned int *)ptos; /*装载堆栈指针*/

/*为新任务创建上下文*/[page]

*--stk=(unsigned int)task; /*lr*/

*--stk=(unsigned int)task /*pc*/

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

*--stk=0; /*r11*/

*--stk=0; /*r10*/

*--stk=0; /*r9*/

*--stk=0; /*r8*/

*--stk=0; /*r7*/

*--stk=0; /*r6*/

*--stk=0; /*r5*/

*--stk=0; /*r4*/

*--stk=0; /*r3*/

*--stk=0; /*r2*/

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

*--stk=(unsigned int)pdata; /*r0*/

*--stk=(SVC32MODE0x0); /*cpsr IRQ,

*--stk=(SVC32MODE0x0); /*spsr IRQ,关闭FIQ*/

return((void*)stk);

}

后5个函数是钩子函数,可以不加代码:

void OSTaskCreateHook(OS_TCB *ptcb)

void OSTaksDelHool (OS_TCB *ptcb)

void OSTaskSwHook(void)

void OSTaskStatHook(void)

(3)用汇编语言编写4个与处理器相关的函数(OS_CPU.ASM)

OSStartHighRdy() ;运行优先级最高的就绪任务

LDR r4,addr_OSTCBCur ;得到当前任务的TCB地址

LDR r5,addr_OSTCBHighRdy ;得到高优先级任务的TCB地址

LDR r5,addr_OSTCBHighRdy ;得到高优先级任务的TCB地址

LDR r5,[r5] ;得到堆栈指针

LDR sp,[r5] ;切换到新的堆栈

STR r5,[r4] ;设置新的当前任务的TCB地址

LDMFD sp!,{r4}

MSR CPSR_cxsf,r4

LDMFD sp!,{r0-r12,lr,pc} ;开始新的任务

END

OSCtxsw() 任务级的任务切换函数

STMFD sp!,{lr} ;保存PC指针

STMFD sp!,{lr} ;保存lr指针

STMFD sp!,{r0-r12} ;保存寄存器文件和返回地址

MRS r4,CPSR

STMFD sp!,{r4} ;保存当前PSR

MRS r4,SPSR

STMFD sp!,{r4}

;OSPrioCur=OSPrioHighRdy

LDR r4,addr_OSPrioCur

LDR r5,addr_OSPrioHighRdy

LDRB r6,[r5]

STRB r6,[r4]

;得到当前任务的TCB地址

LDR r4,addr_OSTCBCur

LDR r5,[r4]

STR sp,[r5] ;保存栈指针在占先任务的TCB上

;取得高优先级任务的TCB地址[page]

LDR r6,addr_OSTCBHighRdy

LDR r6,[r6]

LDR sp,[r6] ;得到新任务的堆栈指针

;OSTCBCur=OSTCBHighRdy

STR r6,[r4]

;得到当前新任务的TCB地址

LDMFD sp!,{r4}

MSR SPSR_cxsf,r4

LDMFD sp!,{r4}

MSR SPSR_cxsf,r4

LDMFD sp!,{r0-r12,lr pc}

OSIntCtxSw() ;中断级的任务切换函数

LDMIA sp!,{al-vl,lr}

SUBS pc,lr,#4

SUB lr,lr,#4

MOV r12,lr

MRS lr,SPSR

AND lr,lr,#0XFFFFFE0

ORR lr,lr,#0XD3

MSR CPSR_CXSF,lr

OSTickISR() ;中断服务函数

STMDB sp!,{r0-r11,lr}

MRS r0,CPSR

ORR r0,r0,#0x80; ;设置中断禁止标志

MSR CPSR_cxsf,r0 ;中断结束

LDR r0,I_ISPC

LDR r1,=BIT_TIMER0

STR r1,{r0}

BL IrqStart

BL osTimeTick

BL IrqFinish

LDR r0,=need_to_swap_context

LDR R2,[R0]

CMP r2,#1

LDREQ pc,=_CON_SW

完成上述工作后,μC/OS-II就可以运行在ARM处理器上了。

3 使用μC/OS-II系统应注意的问题

①μC/OS-II和Linux等分时操作系统不同,不支持时间片轮转法。它是一个基于优先级的实时操作系统。每一个任务的优先级必须不同(分析它的源码会发现,μC/OS-II把任务的优先级当作任务在标识来使用,如果优先级相同,任务将无法区分)。进入就绪态的优先级最高的任务首先得到CPU的使用权,只有等它交出CPU的使用权后,其它任务才可以被执行。所以,它只能就是多任务,不能就是多进程,至少不是我们所熟悉的那种多进程。

②μC/OS-II对共享资源提供了保护的机制。μC/OS-II是一个支持多任务的操作系统。我们可以把一个完整的程序划分成几个任务,不同的任务执行不同的功能。对于共享资源(比如串口),μC/OS-II也提供了很好的解决办法,一般情况下使用的是信号量方法。我们创建一个信号量并对它进行初始化,当一个任务需要使用一个共享资源时,它必须先申请得到这个信号量。在这个过程中即使有优先权更高的任务进入了就绪态,因为无法得到信号量,也不能使用该资源。在μC/OS-II中称为优先级反转。简单地说,就是高优先级任务必须等待低优先级任务的完成。在上述情况下,在两个任务之间发生优先级后转是无法避免的。所以不在使用μC/OS-II时,必须对所开发的系统了解清楚才能选择对于某种共享资源是否使用信号量。

③μC/OS-II内存管理不够完善。在分析许多μC/OS-II的应用实例中发现,任务栈空间和内存分区的创建采用了定义全局数组的方法,这样实现起来固然简单,但不够灵活有效。

编译器会将全局数组作为未初始化的全局变量,放到应用程序映像的数据段。数组的大小是固定的,生成映像后不可能在使用中动态地改变。对于任务栈空间来说,数组定义大了会造成内存浪费;定义小了任务栈溢出,会造成系统崩溃。对于内存分区,在不知道系统初始化后给用户留下了多少自由内存空间的情况下,很难定义内存分区所使用数组的大小。此外,现在μC/OS-II只支持固定大小的内存分区,容易造成内存浪费。μC/OS-II将来应该被改进以支持可变大小的内存分区。因此,系统初始化后能清楚地掌握自由内存空间的情况是很重要的。所以,应避免使用全局数组分配内存空间,关键是要知道整个应用程序在编译、链接后代码段和数据段的大小,在目标板内存中是如何定位,以及目标板内存的大小。

总之,随着各种智能嵌入式系统的复杂化和系统实时性需求的提高,伴随应用软件朝着系统化发展的加速,功能强大的实时操作系统μC/OS-II将会有更大的发展。

关键字:μCOS-II  S3C44BOX  移植 引用地址:μC/OS-II系统在AVM处理器上的移植

上一篇:一种基于嵌入式系统和Internet的FPGA动态配置方案
下一篇:嵌入式网络设备的MAC及IP地址设置

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

TQ2440移植u-boot-2010.06-rc1---6usb下载
以前做过usb下载的东东,现在把它搞到u-boot-2010.06-rc1上去. 网上有usb下载的代码,可以在这儿下载: http://blogimg.chinaunix.net/blog/upfile2/100109001526.bz2 一. 先编译过再说 1.下载后,解压到u-boot-2010.06-rc1/drivers/usb/slave目录 并在顶层Makefile中添加: LIBS += drivers/usb/slave/libusb_slave.a 2. 将driver/usb/slave/目录下所有C文件所个替换 a. #if defined(CONFIG_S3C2400) #include s
[单片机]
TQ2440<font color='red'>移植</font>u-boot-2010.06-rc1---6usb下载
基于S3C44BOX处理器和Linux操作系统实现物流PDA无线终端的设计
科学技术的进步带来了物流业的巨大变化,从机械化向自动化、智能化发展。我国物流业起步较晚,目前还处于人工管理或半自动管理状态,效率不高。随着物流业的发展,仓储规模不断扩大,货物种 类不断增多,带来一系列连锁反应,导致传统的物流业日渐吃力。 嵌入式扩展技术的发展可为物流MA控制领域提供强大灵活的解决方案。本文研究方案将嵌入式扩展技术系统应用于物流控制领域,采用嵌入式处理器以及丰富的外围扩展接口,配以液晶触摸屏,实现了人机交互。结合条码采集器,实现实时采集数据信息,通过无线传输实时连接服务器数据库;实时盘点货物、出入库;实时查询信息及时调度;还具有存储语音数据、简便快捷、避免人为错误、精简人力、管理库存、缩短繁杂程序、节省时间、提高
[单片机]
基于<font color='red'>S3C44BOX</font>处理器和Linux操作系统实现物流PDA无线终端的设计
SD卡驱动程序移植
1.内核MMC/SD驱动程序框架 内核drivers/mmc目录下有3个子目录:card/、core/和host/,这刚好表示了MMC/SD驱动程序的3个层次,如下: 1)区块层 向文件系统层、用户空间提供文件操作的接口,主要文件是card/目录下的block.c,queue.c向它提供了几个函数来操作队列。 区块层调用core/目录下的core.c、sysfs.c提供的接口来识别存储卡的分区、读写存储卡等功能。 2)核心层 核心层代码在core/目录下,它封装了MMC/SD命令,实现MMC/SD协议,它调用主机控制器层的接口完成存储卡的识别、设置、读写等。 可知,
[单片机]
SD卡驱动程序<font color='red'>移植</font>
mini2440上一步步实现将ADS工程移植到keilMDK
从买板子到现在,想想也有2个月啦,开始就想跑裸奔的,可是工程都是在ADS下,win7系统根本不能用,于是就想着怎么在MDK跑,可是MDK上s3c2440的启动文件是不完整的,因此不推荐使用,为此蛋疼聊好长一段时间,查了很多资料都不成功,可能是我太笨啦,为此,今天把我自己的方法写给和我一样的想用MDK的童靴们吧。 首先新建一个文件夹,然后在里面新建startcode和source两个文件夹,如下 接着打开MDK新建工程,启动文件不选,如下 接着复制光盘中的启动文件2440init.s option.inc memcfg.inc 2440addr.inc到startcode,如下 然后在MDK左侧栏新建两个文件夹,分
[单片机]
mini2440上一步步实现将ADS工程<font color='red'>移植</font>到keilMDK
STM32CUBEMX(6)--移植雅特力AT32F403AVGT7,双串口通过DMA方式接收不定长数据
概述 本篇文章主要介绍如何使用STM32CubeMX移植到雅特力AT32F403AVGT7,并通过双串口输出打印。 直接存储器访问(DMA)用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何CPU操作的情况下通过DMA快速传输传输。这样节省的CPU资源可供其它操作使用。 DMA允许在后台执行数据传输,无需Cortex-M3处理器干预。在此操作过程中,主处理器可以执行其它任务,仅当整个数据块需要处理时,才会中断主处理器。这样即使传输大量数据也不会对系统性能造成太大影响。 DMA主要用于为不同的外设模块实现集中数据缓冲存储(通常在系统SRAM中)。与分布式解决方案(其中每个外设都需要实现自己的本地数据存储
[单片机]
STM32CUBEMX(6)--<font color='red'>移植</font>雅特力AT32F403AVGT7,双串口通过DMA方式接收不定长数据
06-S3C2440学习之移植2012u-boot到S3C2440(分析过程)
一、简单分析Uboot的过程 1.到官网下载u-boot-2012.04.01.tar.bz2 2.建立sourceinsight工程 a、解压并在E:colin weidongshantransplant_u-boot-2012.04.01u-boot-2012.04.01建立SI b、添加文件到SI工程 2.1、点击 Add All ,选中“Include top level sub-directories”和“Recursively add lower sub-directories”点击“OK” 2.2、选中“Board”目录,点击“Remove Tree”,去掉总个目
[单片机]
06-S3C2440学习之<font color='red'>移植</font>2012u-boot到S3C2440(分析过程)
Uboot在S3C2440上的移植详解(一)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载(还未实现) 1.了解u-boot主要的目录结构和启动流程,如下图。 u-boot的stage1代码通常放在cpu/xxxx
[单片机]
Uboot在S3C2440上的<font color='red'>移植</font>详解(一)
ucos-ii应用在嵌入式智能视觉监控系统中
1 系统硬件平台设计   系统使用的主芯片是ADI公司Blackfin系列DSP中的BF533,这是一款专门面向视频应用的DSP,拥有丰富的外设接口和较好的系统扩展性。本系统利用BF533的PPI接口采集数字图像,利用芯片的EBIU总线,扩展SDRAM和网络芯片。BF533工作在600MHz频率,单个芯片即可完成对运动目标跟踪和网络传输等功能。基于BF533的嵌入式系统的外围电路主要可分为三个部分:图像采集部分,网络传输部分,存储器部分。系统硬件框图如图1: 图1 系统硬件框图   图像采集电路部分采用了TI公司的TVP5150A型视频解码芯片,它将NTSC/PAL/SECAM制式的视频信号转换成8bits的ITU-
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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