μC/OS-II在S3C44BOX处理器上的移植

发布者:电子创意达人最新更新时间:2021-06-29 来源: eefocus关键字:μC  OS-II  S3C44BOX  处理器  移植 手机看文章 扫描二维码
随时随地手机看文章

摘要:介绍实时操作系统μC/OS-II的特点和内核结构,给出μC/OS-II在Samsung嵌入式S3C44BOX ARM7微处理器上的移植的步骤及详细相关代码,同时阐述μC/OS-II在应用中应注意的问题。


μ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; /*装载堆栈指针*/

/*为新任务创建上下文*/

*--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=(SVC32MODE|0x0|); /*cpsr IRQ,

*--stk=(SVC32MODE|0x0); /*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地址

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将会有更大的发展。

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

上一篇:基于ARM的实时测控系统的开发平台
下一篇:ARM指令有特殊意义的符号讲解

推荐阅读最新更新时间:2024-11-13 19:53

升级骁龙821处理器:一加手机3T售价曝
    此前有消息称一加将推出一加手机3的升级版,名为一加手机3T,将在配置方面有所升级,现在爆料大神@evleaks 曝光了该机的售价。     @evleaks 称一加手机3T要比一加手机3贵80美元,目前一加手机3在美国的售价为400美元,也就是说一加手机3T的售价应该是480美元。需要指出的是,这是在美国的售价,该机在中国的售价应该会更低一些,目前一加3在国内售2499元,估计一加手机3T可能会售2999元。   据悉,一加手机3T将在3的基础上升级最新的骁龙821处理器,当然并不排除采用更高分辨率(2K)的屏幕。   值得一提的是,此前一加官方否认一加3停产,但也承认了AMOLED显示屏供应不足,因此估计
[手机便携]
89C51单片机定时/计数器0
89C51单片机的定时计数功能由特殊功能寄存器TMOD和TCON共同控制。 TMOD没有位地址,不能进行位操作,其每位的名称和功能如下: TMOD:GATE C/T1 M1 M0 GATE C/T1 M1 M0 D7 D6 D5 D4 D3 D2 D1 D0 GATE C/T1 M1 M0 控制定时计时器1; GATE C/T0 M1 M0 控制定时计时器0; GATE=0时,定时计数信号是T0脚状态(P3.4)或机器周期(C/T=0计机器周期,即定时,C/T=1,计T0脚的状态,即计数),计数开始开关是TR0(0关闭计数
[单片机]
89<font color='red'>C</font>51单片机定时/计数器0
Redmi Note 9国行标准版详细参数:搭天玑800U处理器
IT之家 11 月 6 日消息 继 Redmi Note 9 国行高配版之后,数码博主 @数码闲聊站 又曝光了该机标准版的配置,一起来了解一下。   据该博主的信息,Redmi Note 9 标准版采用 6.53 英寸 2400*1080 分辨率左上角单孔屏,前置 1300 万像素自拍摄像头,后置 4800 万像素 “奥利奥”矩阵三摄,搭载天玑 800U 处理器,内置 5000mAh 电池,支持 22.5W 快充,机身尺寸为 161.96×77.25×9.20mm,重 200g。   作为对比,Redmi Note 9 高配版采用 6.67 英寸居中单孔屏,2400×1080 分辨率、120Hz 刷新率与 240Hz 触控
[手机便携]
Redmi Note 9国行标准版详细参数:搭天玑800U<font color='red'>处理器</font>
ARM920T协处理器CP15
ARM920T处理器包含了ARM9TDMI内核,ARM9TDMI实现了ARM architecture v4T。 ARM920T处理器包含两个协处理器: CP14。用于调试 CP15。系统控制协处理器,提供附加的寄存器用来配置和控制cache,MMU,保护系统,时钟模式,和ARM920T其他的系统选项,如大小端操作。你可以使用MCR,MRC访问定义在CP15中的寄存器。 CP15定义了16个寄存器,寄存器的映射图如下: 注:寄存器位置0可以访问两个寄存器,通过opcode_2的值来确定。 ARM920T存在3个地址。 只能在特权模式下使用MCR和MRC指令访问CP15
[单片机]
ARM920T协<font color='red'>处理器</font>CP15
骁龙家族全力支持,中兴通讯、三星新机接连登场
骁龙家族好消息不断,带给消费者的 芯机 选择也越来越多。5月26日,中兴通讯和三星相继发布了基于骁龙处理器的全新产品。 骁龙820继续发力,AXON天机7 如7归来 进入2016年,众多采用 超旗舰 骁龙820处理器的智能手机陆续面世,中兴通讯的AXON天机7也已加入成为其中一员。 AXON天机7拥有5.5英寸SUPER AMOLED 2K显示屏,6GB LPDDR4、128GB UFS2.0高速大容量存储;后置f/1.8光圈2000万像素摄像头,支持PDAF极速对焦;同时它还支持北斗、支持Quick Charge 3.0快速充电技术。 得益于骁龙820集成的X12 LTE调制解调器,AXON天机7充分展现了 骁龙全
[手机便携]
骁龙家族全力支持,中兴通讯、三星新机接连登场
C语言实现51单片机中的PID算法
//pid.h #ifndef __PID__ #define __PID__ /*PID = Uk + KP* +KI*E(k)+KD* ;(增量型PID算式) 函数入口: RK(设定值),CK(实际值),KP,KI,KD 函数出口: U(K)*/ typedef struct PIDValue { int8 KP; int8 KI; int8 KD; int8 F; int8 BITMOV; int EK ; int UK; int RK; int CK; int UK_REAL; }pid_str; //PIDValueStr PID; void pid_exe(pid_str *PID) ; #
[单片机]
S3C6410开发板LED驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制。在本文的资源中包含了设备驱动的源码和测试的源码。 一、设备驱动源码分析 设备驱动主要实现了模块的初始化、模块的卸载、io模块操作的功能。 1、模块初始化 模块的初始化的源码如下所示。 static int __init dev_init(void) { int ret; { unsigned tmp; tmp = readl(S3C64XX_GPKCON); tmp = (tmp & ~(0xffffU 16))|(0x1111U 16); writel(tmp, S3C64XX_GPKCON);
[单片机]
四通道I2C多路复用器提供了地址扩展、总线缓冲和故障管理
   引言   随着数据处理、海量存储和通信系统的发展,用于传送诸如温度、扇速、系统电压和关键产品数据(VPD,例如:电路板标识)等信息的子系统尺寸和复杂程度成比例地增长。在这些信息的传送中,最常用的就是两线式串行总线,比如:I2C或SMBus。   在这些系统的设计中会出现若干实际问题,特别在系统规模日益扩大的情况下更是如此。首先,诸如小型可插拔式光学模块(SFP)等众多设备都具有硬连线I2C地址,故由于地址冲突的原因而无法使用多个这样的设备。其次,由于设备种类的增加以及有越来越多的I/O板卡需要在系统上进行热插拔,因此,I2C设备产生混乱并把总线保持于低电平的可能性有所增加。第三,随着等效总线电容的增加,总线定时规格的满足变
[电源管理]
四通道I2<font color='red'>C</font>多路复用器提供了地址扩展、总线缓冲和故障管理
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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