第6章 μCOS-II操作系统基础及其移植开发初步
《UCOSII移植》课件
分享UCOSII移植过程中的启示和思考,如项目管理、团队协作和技术挑战。
参考资料
• UCOSII官方文档 • 相关论文和书籍 • 移植过程中遇到的问题及解决方法的记录
任务切换和调度算法
介绍如何优化UCOSII的任务切 换和调度算法,以提高系统的 响应性和资源利用率。
增加新的系统服务
讲解如何增加新的系统服务, 如文件系统、网络协议和设备 驱动等,以满足特定需求。
扩展硬件驱动支持
探讨如何扩展UCOSII的硬件驱 动支持,以兼容不同的外设和 接口。
结束语
1 移植的重要性与价值
UCOSII的源代码
讲解UCOSII的源代码结构和功能模块,为后续的移植工作提供基础。
移植前的准备
1 硬件环境
介绍适用于UCOSII移植的硬件平台要求,例如处理器架构、外设支持和存储器需求。
2 开发工具
探讨用于UCOSII移植的开发工具,如编译器、调试器和仿真器等,以及如何配置和使用 它们。
3 UCOSII源代码
移植后的测试
1
资源占用率
介绍如何测试UCOSII移植后的硬件资源占用情况,以优化内存和处理器利用。
2
任务优先级和响应时间
讨论如何测试UCOSII移植后任务的优先级和响应时间,以确保实时性和性能。
3
系统稳定性和可靠性
探究如何测试UCOSII移植后系统的稳定性和可靠性,以验证移植的有效性。
优化和改进
解释如何获取UCOSII的源代码,并对代码结构和组织进行介绍,以便于后续的移植工作。
开始移植
1
方法和步骤
详细介绍UCOSII移植的具体方法和步骤,包括环境配置、源代码修改和编译等。
uCOS操作系统及其移植
μC/OS-II的应用流程
μC/OS-II的初始 化,创建空闲任务
板级初始化
设置系统节拍
创建初始任务
创建用户任务
开启多任务调度 , 操作系统启动
删除初始任务
初始化函数 函数 OSInit( OSInit( ) 将对 ) μ 对数据结构进行初 C/OS-II 的所有的 在使用μC/OS-II的所有服务之 始化时,主要要创建包括空任务控制块 全局变量和数据结构进行初始化,同时 前,必须要调用 μ C/OS-II 的初 链表等空数据缓冲区。同时,为了可以 创建空闲任务OSTaskIdle,并赋之以最 始化函数 OSInit( )对μC/OS-II 快速地查询任务控制块链表中的各个元 低的优先级别和永远的就绪状态。如果 自身的运行环境进行初始化 。 素,初始化函数 用户应用程序还要使用统计任务的话 OSInit( )还要创建一个 数组 (常数 OSTCBPrioTbl[OS_LOWEST_PRIO OS_TASK_STAT_EN=1),则 + 1]OSInit( ,在这个数组中,按任务的优先级别 )还要以优先级别为 OS_LOWEST_PRIO-1来创建统计任务 的顺序把任务控制块的指针存放在了对 应的元素中
信号量及其操作
uC/OS-II的移植
移植就是修改一个软件,使得它能在新的环 境下(不同的处理器平台,或者不同的处理 器型号,或者不同的板子,或者不同的系统 下)运行 移植工作量取决于被移植软件的复杂程度和 移植的层次
举例
将linux移植到alpha处理器上,属于第一类: 移植到新的处理器架构上。工作量巨大,非高 手不能为 将linux移植到s3c2410上,属于第二类:移植 到不同处理器型号。工作量大大降低 将linux移植到你开发的开发板上,属于第3类: 移植到不同board上,如果你的board采用了如 s3c2410这样的处理器,则工作量很小 将QQ移植到linux平台上,属于第四类,把软 件移植到不同的系统(操作系统)上 ……
实时操作系统μCOS-II在ARM上的移植研究
目录摘要 (1)关键词 (1)1 引言 (1)2 μC/OS-II简介 (2)2.1 μC/OS-II的特点 (2)2.2 μC/OS-II的体系结构 (3)3 移植规划 (3)3.1 移植条件 (3)3.1.1 可重入代码与非可重入代码 (4)3.1.2 OS_ENTER_CRITICAL( )与OS_EXIT_CRITICAL( ) (4)3.2 移植要求 (4)3.3 移植需要编写的文件 (4)3.4 移植代码包括的主要内容 (5)3.5 编译器的选择 (5)4 移植的实现 (6)4.1 OS_CPU.H的移植 (6)4.1.1数据类型的定义 (6)4.1.2堆栈的定义 (6)4.1.3中断与临界区代码 (7)4.1.4使用软中断SWI作底层接口 (8)4.2 OS_CPU_C.C的移植 (9)4.2.1 OSTaskStkInit( ) (9)4.2.2 Hook( )函数 (10)4.3 OS_CPU_A.ASM的移植 (11)4.3.1 OSStartHighRdy()函数 (11)4.3.2 OSCtxSw( )函数 (12)4.3.3 OSIntCtxSw()函数 (13)4.3.4 OSTickISR()函数 (14)5 嵌入式系统的初始化 (16)5.1初始化程序的下载执行 (16)5.2嵌入式系统的初始化过程 (17)5.2.1硬件初始化阶段 (17)5.2.2 RTOS初始化阶段 (18)5.3 ARM920T系统初始化的一般过程 (19)5.3.1设置程序入口指针 (19)5.3.2设置中断向量 (19)5.4初始化存储器系统 (20)5.4.1存储器地址分布 (20)5.4.2 ROM地址重映射的实现 (20)5.5初始化堆栈 (21)5.6初始化应用程序执行环境 (22)5.6.1初始化C环境 (22)5.6.2改变处理器模式 (23)5.6.3调用C程序 (23)5.7 uC/OS系统的初始化 (23)5.7.1 ARM的硬件抽象层——uHALuC/OS (24)5.7.2 ARMTargetInit()函数结构 (24)5.7.3 uHAL的功能 (25)6 移植测试 (25)6.1测试移植代码 (25)6.1.1确保C编译器、汇编编译器及链接器正常工作 (25)6.1.2验证OSTskStkInit() 和OSStartHighRdy()函数 (25)6.1.3验证OSCtxSw() 函数 (26)6.1.4验证OSIntCtxSw()和OSTickISR()函数 (26)6.2在S3C2440上测试移植结果 (26)6.2.1编译uCOS2 (26)6.2.2把uCOS2下载到内存中运行 (28)7 结论 (30)致谢 (31)参考文献 (31)英文翻译 (32)实时操作系统μC/OS-II在ARM上的移植研究陈利顺重庆三峡学院物理与电子工程学院电子信息工程专业06级重庆万州 404000摘要本设计采用三星公司生产的一款基于ARM920T核的高性能低功耗soc芯片S3C2440作为移植的硬件平台。
uCOS-II ppt 入门基础
硬件初始化
• 系统启动处理(在调用uC/OS-II操作系统初始化函数 OSInit()前,需要对CPU进行必要的初始化,例如设置异 常处理栈空间。要使uC/OS-II能够正常运行,时钟任务是 必不可少的。另外,启动代码需要存储在哪个内存空间, 在运行时需要在哪个内存中运行,这些都需要程序员手动 设置。)
典型的main函数
• • • • • • • • • • • • • • void main (void) { /*-----硬件初始化,等用户代码初始化-----*/ ... OSInit(); /* 初始化uC/OS-II */ …/*-------安装中断向量---------*/ /*通过调用OSTaskCreate ( ) 或OSTaskCreateExt ( )创建至少一个任务;*/ OSTaskCreate(TaskStart , (void*)0, &TaskStartStk[TASK_STK_SIZE - 1], 2 ); … /*通过调用OSSemCreate() 创建信号量等任务通信方式;*/ CalcSem = OSSemCreate(0); … OSStart(); /* 开始多任务调度!OSStart()永远不会返回 */ }
时钟
PC机上移植和运行uC/OS-II要注意其与PC机中其他操 作系统的关系(主要是与DOS操作系统之间的关系),不 能因为安装了uC/OS-II而使其他操作系统不能正常使用。 • 在PC机中,DOS系统时间的周期为 54.93ms(18.20648HZ)。 • DOS操作系统的系统时钟是由PC机上配置的硬件定时 DOS PC 器产生的。在硬件定时器的每个定时周期结束时,硬件定 时器便向CPU申请一次中断,在中断服务程序中处理DOS 所需要的系统时钟,同时处理DOS系统有关时间的一些管 理事务。在80X86系统的中断向量表中,产生DOS系统时 钟硬件定时器所占用的中断向量为0x08. • 在这我们把uC/OS-II的系统时钟频率设置为200HZ,这 显然比DOS的时钟频率高得多。因此,借用产生的DOS系 统时钟的定时器信号来产生uC/OS-II系统时钟。200除于11 等于18.18约等于18.2.后把uC/OS-II的时钟中断向量安装到 0x08上,而把0x08中原来的DOS的时钟中断向量转存到中 •
嵌入式操作系统μCoS-Ⅱ的移植
2 I S Ⅱ的 移 植 分 析  ̄ CO -
2. 移 植 概 述 1
Байду номын сангаас
1 C 一 oS Ⅱ简 介
/ O 一  ̄ S Ⅱ是 一 个 基 于 优 先 级 的抢 占式 实 时 多 C
所谓 移植 , 就是 使一 个实 时 内核能 在其 他 的微 处理 器或 微控 制器 上运 行 。为 了方便 移植 , 大部 分
任务 操作 系统 , 它包含 了实时 内核 、 任务 管理 、 间 时
C S Ⅱ是 用 C语 言编写 的 , O一 但与 硬 件 有关 的 代码
仍需要 用 汇 便 语 言 编 写 。t O — 在 设 计 之 初 已  ̄ SI C I
管理 、 信号 量 、 内存管 理等 , 用 于 8位 1 可 6位 和 3 2
维普资讯
第2 卷 第1 3 期
金 陵 科 技 学 院 学 报
Vo12 N o. . 3. 1
27 月 0 年3 0
JU N LO N IGIS I E O R A F LN T1 T 里 J I N =
Q
Ma.2 0 r ,0 7
随着 现代化 技术 的发 展 , 入式 系统 的应用 范 嵌 围越来 越广 泛 , 于嵌 入式 技术 的产 品从尖 端 复杂 基
自己 的 需 要 对 C S Ⅱ进 行 裁 剪 。t O —I 代 O  ̄ S I源 C
码 公开 , 部分 是 用 A IC编 写 的 , 有 与 处 理 大 NS 只
T ePo tn fEmb d e e ai gS se p h ri go e d d Op r tn y tm  ̄ COS Ⅱ -
GAO iyig Cu — n
( hnd n e i e nl y C egu 109 C i ) C egu i rt o T c o g, hnd 05 , h a U v sy f h o 6 n
第6章-3节嵌入式系统(uCOS-II移植)
作者:四川师范大学成都学院 屈召贵 QQ:35247485
关中断 OS_CPU_SR_Save MRS CPSID BX R0,PRIMASK I LR
开中断 OS_CPU_SR_Restore MSR PRIMASK, R0
BX
LR
(4)定义栈的增长方向 µC/OS-II使用结构常量OS_STK_GROWTH来指定堆栈的增长方式: 置OS_STK_GROWTH为0,表示堆栈从下往上增长; 置OS_STK_GROWTH为1,表示堆栈从上往下增长。 Cortex-M3支持从上往下增长的方式。因此,我们在移植时,需将 OS_STK_GROWTH=1,如果是51系列单片机,则OS_STK_GROWTH=0。 #define OS_STK_GROWTH 1
OS_CPU_A.A SM中具体实现
#define OS_CRITICAL_METHOD 3 #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
8/17/2010 9
举例说明: Swap2函数代码: void swap2(int *x,int *y) 可重入 { int temp; temp=*x; *x=*y; *y=temp; }
作者:四川师范大学成都学院 屈召贵 QQ:35247485
(2)用C语言可打开和关闭中断
PRIMAS K
ARM处理器核包含一个CPSR寄存器,该寄存器包括一个全局的中断禁止位, 控制它便可打开和关闭中断。 (3)处理器支持中断并且能产生定时中断 µC/OS-II通过处理器产生的定时器中断来实现多任务之间的调度。ARM CortexM3的处理器都支持中断并能产生定时器中断,专门有一个SysTick定时器来实现。 (4)处理器支持能够容纳一定量数据的硬件堆栈(通常需要几十KByte字节) 比如AT98C51处理器,内部只有128字节的RAM,要运行,需外扩RAM。CM3 的芯片,内部可多达128KByte的容量,因此可直接使用。
嵌入式实时操作系统μCOS-Ⅱ的移植
嵌入式实时操作系统μCOS-Ⅱ的移植1、引言嵌入式系统由于它具有软件代码小、高度自动化、响应速度快等特点已经使它在许多领域得到广泛的应用[3]。
从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等。
嵌入式系统通常由硬件环境和操作系统构成。
在嵌入式操作系统的统一调度管理下实现对所有系统资源的合理利用和分配,达到提高系统性能和有效利用有限资源的目的。
μCOS-Ⅱ作为一个源码开放的嵌入式实时操作系统,同时具有良好的可移植性、可裁剪性、可剥夺性、稳定性和可靠性等优点,使其成为许多嵌入式操作系统的首选。
本文将μCOS-Ⅱ在Freescale的8位处理器芯片HC9S08上移植实现。
2、μCOS-Ⅱ系统结构μCOS-Ⅱ是一个完整的可移植可固化可裁剪的抢占式实时多任务内核。
可以在不需要做很大修改的基础上方便的移植到多种处理器上。
条件是:该处理器要具有一定数量的堆栈,能够使用软件中断,产生定时器中断,此外,编译器要支持可重入代码,并且要能使用汇编实现对处理器内部寄存器的相关操作[2][4]。
通过μCOS-Ⅱ的管理,使多个任务之间相互协调,分时的占用CPU,实现充分利用资源和实时等相应的功能。
任务通常是一个死循环,用来完成某一特定的功能;一个任务相当于一个线程。
μCOS-Ⅱ可以管理多达64个任务,每个任务都具有一个唯一的合法优先级。
但是,优先级最低的那个任务已经被系统定义为空闲任务,用户不能使用。
用户可以通过函数OSTaskCreate()来创建任务,通过OSTaskDel()来删除任务。
任务可能有以下五种状态:睡眠态、就绪态、运行态、等待状态、中断服务态。
利用不同的系统函数可以实现任务在各状态之间的转换。
μCOS-Ⅱ通过对就绪表的操作总是选择在就绪任务中优。
基于实时操作系统μCOS-II的应用程序开发_图文_图文
多任务的启动
首先创建任务 最后调用OSStart开始多任务调度 void main( ) { OSInit( );
….. OSTaskcreat( ) ….. OSStart(); }
任务的格式
每个任务不能占用全部CPU的资源 需要有等待,或延时等系统调用 典型的一个无限循环。
void mytask(void *pdata) {
for (;;) { do something; waiting; do something;
} }
揭开神秘的面纱—任务调度全程追踪
For example1 创建2个任务,每个任务仅仅 是进行延时,延时不同的时间片,不同优先 级
接收接口函数
数据接收是一个单独的任务 DLPDURecvTask,定义在test1.c中;
接收函数DLLRecvProcess在DLL.c中定 义;
接收数据包环形缓冲区队列 RecvDLPDUTbl[10] 在DLL.h中定义;
接收数据包结构格式为DLPDU,定义在 DLL.h ;
任务task
典型的一个无限循环。void my源自ask(void *pdata) {
for (;;) { do something; waiting; do something; } }
支持64个任务,每个任务一个特定的优先级。优先级 越高,数字越小
系统占用了两个任务,空闲任务和统计任务。
基于实时操作系统μCOS-II的应用程序开发_ 图文_图文.ppt
What is µC/OS-II?
μCOS-II移植
图标按钮(或者选择 (6)单击 )单击Context Variable图标按钮 或者选择 图标按钮 【Processor Views】->【Variables】)打开变量观 】 【 】 打开变量观 察窗口, 察窗口,通过此窗口可以观察局部变量和全局变 量。 取消断点, (7)可以单步运行程序,可以设置 取消断点, )可以单步运行程序,可以设置/取消断点 或者全速运行程序,停止程序运行, 或者全速运行程序,停止程序运行,观察变量的 判断蜂鸣器及LED1~LED4的控制是否正 值,判断蜂鸣器及 ~ 的控制是否正 确。
步骤 仿真器和MagicARM2410 (1)连接 )连接EasyJTAG-H仿真器和 仿真器和 实验箱,然后安装EasyJTAG-H仿真器 若已经安 实验箱,然后安装 仿真器(若已经安 仿真器 装过,此步省略),短接蜂鸣器跳线JP9。 装过,此步省略 ,短接蜂鸣器跳线 。 (2)启动 )启动ADS 1.2,打开实验工程文件 , Demo_uCOSII。(本范例在ADS文件夹中操作 Demo_uCOSII。(本范例在ADS文件夹中操作) 。(本范例在 文件夹中操作) (3)Make ug (4)Debug (5)全速运行程序,程序将会在 )全速运行程序,程序将会在main.c的主函 的主函 数中停止(因为 因为main函数起始处默认设置有断点。 函数起始处默认设置有断点。 数中停止 因为 函数起始处默认设置有断点
/************************************ ** Function name: DelayNS *************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) for(i=0; i<50000; i++); }
uCOS-II嵌入式操作系统介绍与移植
退出/进入临界区函数 ARMDisableInt/ARMEnableInt
1、直接操作CPSR的I、F位
2、 ARMDisableInt将CPSR的I、F位设置为1, 关闭所有中断
3、 ARMEnableInt将CPSR的I、F位设置为0, 打开中断
任务级上下文切换函数 OS_TASK_SW
ARM处理器相关宏定义
1、退出临界区
#defineOS_ENTER_CRITICAL() ARMDisableInt()
2、进入临界区
#defineOS_EXIT_CRITICAL() ARMEnableInt()
堆栈增长方向
1、堆栈由高地址向低地址增长,这个也 是和编译器有关的,当进行函数调用时, 入口参数和返回地址一般都会保存在当 前任务的堆栈中,编译器的编译选项和 由此生成的堆栈指令就会决定堆栈的增 长方向。 #define OS_STK_GROWTH 1
1、该函数当任务因为被阻塞而主动请求cpu 调度时被执行,由于此时的任务切换都是在 非异常模式下进行的,因此区别于中断级别 的任务切换。 2、它先将当前任务的cpu现场保存到该任务 堆栈中,然后获得最高优先级任务的堆栈指 针,从该堆栈中恢复此任务的cpu现场,使之 继续执行。这样就完成了一次任务切换。
多任务应用程序、调用函数ARMTargetInit初始化ARM处理器; 2、调用OSInit进行操作系统初始化; 3、调用OSTaskCreate函数两个任务:TaskLED 和TaskSEG; 4、调用ARMTargetStart函数启动时钟节拍中断; 5、调用OSStart启动系统任务调度。
OS_CPU_A.S的移植
μC-OS-Ⅱ移植
移植 µC/OS-Ⅱ Ⅱ这一章介绍如何将 µC/OS-Ⅱ移植到不同的处理器上。
所谓移植,就是使一个实时内核 能在某个微处理器或微控制器上运行。
为了方便移植,大部分的 µC/OS-Ⅱ代码是用 C 语言 写的;但仍需要用 C 和汇编语言写一些与处理器相关的代码,这是因为 µC/OS-Ⅱ在读写处 理器寄存器时只能通过汇编语言来实现。
由于 µC/OS-Ⅱ在设计时就已经充分考虑了可移植 性,所以 µC/OS-Ⅱ的移植相对来说是比较容易的。
如果已经有人在您使用的处理器上成功 地移植了 µC/OS-Ⅱ,您也得到了相关代码,就不必看本章了。
当然,本章介绍的内容将有 助于用户了解 µC/OS-Ⅱ中与处理器相关的代码。
要使 µC/OS-Ⅱ正常运行,处理器必须满足以下要求: 1. 处理器的 C 编译器能产生可重入代码。
2. 用 C 语言就可以打开和关闭中断。
3. 处理器支持中断,并且能产生定时中断(通常在 10 至 100Hz 之间)。
4. 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
5. 处理器有将堆栈指针和其它 CPU 寄存器读出和存储到堆栈或内存中的指令。
像 Motorola 6805 系列的处理器不能满足上面的第 4 条和第 5 条要求,所以 µC/OS-Ⅱ 不能在这类处理器上运行。
图 8.1 说明了 µC/OS-Ⅱ的结构以及它与硬件的关系。
由于 µC/OS-Ⅱ为自由软件,当用 户用到 µC/OS-Ⅱ时,有责任公开应用软件和 µC/OS-Ⅱ的配置代码。
这本书和磁盘包含了所 有与处理器无关的代码和 Intel 80x86 实模式下的与处理器相关的代码(C 编译器大模式下 编译) 。
如果用户打算在其它处理器上使用 µC/OS-Ⅱ,最好能找到一个现成的移植实例,如 果没有只好自己编写了。
μC/OS-II操作系统在各种处理器上的移植
μC/OS-II操作系统在各种处理器上的移植信息来源: 维库开发网发布时间:2009年12月29日μC/OS-II操作系统是一种抢占式多任务、单内存空间、微小内核的嵌入式操作系统,具有高效紧凑的特点。
它执行效率高,占用空间小,可移植性强,实时性能良好且可扩展性强。
采用μC/OS-II实时操作系统,可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应;采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。
μC/OS-11非常适合应用在一些小型的嵌入式产品应用场合,在家用电器、机器人、工业控制、航空航天、军事科技等领域有着广泛的应用。
单片机、ARM、FPGA与μC/OS-II操作系统相结合,实现一些具体功能,是目前嵌入式应用中比较常见的。
在这些应用中,基础性的工作就是操作系统的移植。
本文选取使用较多的51单片机、LPC2210、NiosII三种处理器进行介绍。
1 μC/OS-II操作系统移植条件μC/OS-II操作系统的大部分源代码都是用C语言书写的,但仍需使用汇编语言来完成一些和处理器相关的操作,例如读写处理器、寄存器时只能使用汇编语言来实现。
因此,将μC/OS-II操作系统移植到目标处理器上,需要从硬件和软件两方面来考虑。
硬件方面,目标处理器需满足以下条件:①处理器的C编译器能产生可重入代码;②用C语言可以开/关中断;③处理器支持中断,并且能够产生定时中断(通常在10~1 000 Hz之间);④处理器能够支持容纳一定量数据的硬件堆栈;⑤处理器有将堆栈指针和其他寄存器读出和存储到堆栈或内存中的指令。
软件方面,主要关注的是一些与处理器相关的代码移植,其分布在OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM这3个不同的文件中。
2 目标处理器硬件支持51单片机、LPC2210、NiosII三种处理器在硬件方面均能满足μC/OS-II操作系统的移植要求。
51单片机:选择Keil公司的集成开发环境作为开发工具,因为该集成开发环境的C51编译器能产生可重入型代码,且用C语言就可以开/关中断。
uC-OS-II系统开发
ucos初级程序员指南(转)本文面向首次接触uC/OS-II的程序员,为他们介绍一下这个系统的一些基本特征和编程上的注意事项,并介绍几个值得了解的API。
本文作者已经成功的将uC/OS-II移植到几种不同CPU之上。
包括EPSON S1C33和Sunplus unSP?等,积累了丰富的经验,现在愿意和朋友们分享这些经历。
希望本文的资料对于希望使用这个系统来开发的朋友有所帮助,作者乐意与您分享任何您成功的喜悦。
This passage is written for the basic programmers who are first developed with the uC/OS-II real time OS。
I will talk about the basic structure of this system。
And I will discuss how to use some of the useful API。
I will also discuss the imp of the mutilty-tasking in uC/OS-II。
(一) uC/OS-II 简介uC/OS-II是一种基于优先级的可抢先的硬实时内核。
自从92年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的内核,目前已经被移植到40多种不同结构的CPU上,运行在从8位到64位的各种系统之上。
尤其值得一提的是,该系统自从2.51版本之后,就通过了美国FAA认证,可以运行在诸如航天器等对安全要求极为苛刻的系统之上。
鉴于uC/OS-II可以免费获得代码,对于嵌入式RTOS而言,选择uC/OS 无疑是最经济的选择。
(二) uC/OS-II 应用程序基本结构应用uC/OS-II,自然要为它开发应用程序,下面论述基于uC/OS-II的应用程序的基本结构以及注意事项。
每一个uC/OS-II应用至少要有一个任务。
嵌入式系统-RTEOSμCOS-II的移植
可重入的代码指的是一段可以被多个任务同时调用,而不必担心会破坏数据的代码(比如:一个函数)
01
即:可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,而影响函数中的数据
02
什么是可重入代码
程序1:可重入型函数
congfig.h
UC/OS内核文件
Includes.h
用户程序
OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。
01
与 ARM处理器相关的代码,使用OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 宏开启/关闭中断
CPU
定时器
硬件
软件
——μC/OS-II硬件软件体系结构
用于产生系统时钟
移植时需要编写的代码
1
处理器的C编译器能产生可重入代码
2
在程序中可以打开或者关闭中断
3
处理器支持中断,并且能产生定时中断(通常在10—100Hz之间)
4
处理器支持能够容纳一定量数据的硬件堆栈(通常是几千字节)
5
处理器有将堆栈指针和其他CPU寄存器的内容存储和读出到堆栈(或者内存)的指令
void swap(int *x, int *y)
{
int temp;
temp=*x;
x=*y;
y=temp;
}
可重入代码举例
程序2:非可重入型函数
int temp;
void swap(int *x, int *y)
{
temp=*x;
x=*y;
y=temp;
嵌入式操作系统教程-第六章
嵌 入 式 操 作 系 统 基 础 第 六 章 uC/OS-II
3
3.调度过程:
y=OSnMapTb1[OSRdyGrp]; OSPrioHighRdy=(INT8U)((y<<3)+ UnMapTb1[OSRdyTb1[y]]);
OSTCBHighRdy = OSTCBPrioTb1[OSPrioHighRdy];
4.OSSched()函数实现:
临界区
4
嵌 入 式 操 作 系 统 基 础 第 六 章 uC/OS-II
§6.2 调度器OSSched()的任务切换
1.任务断点保存
5
嵌 入 式 操 作 系 统 基 础 第 六 章 uC/OS-II
2.任务切换
a.保存被终止任务断点 a.保存被终止任务断点 b.保存CPU寄存器 b.保存CPU寄存器 保存CPU c.保存任务堆栈地址 c.保存任务堆栈地址 d.切换新任务TCB d.切换新任务TCB 切换新任务 e.CPU获取私有堆栈地址 e.CPU获取私有堆栈地址 f.切换CPU寄存器 f.切换CPU寄存器 切换CPU g.CPU获取断点指针 g.CPU获取断点指针
嵌 入 式 操 作 系 统 基 础 第 六 章 uC/OS-II
1
第六章 uC/OS-II的任务
调度器OSSched()的任务调度 ()的任务调度 调度器 () 调度器OSSched()的任务任务切换 ()的任务任务切换 调度器 () 调度时机
嵌 入 式 操 作 系 统 基 础 第 六 章 uC/OS-II
第六章 uC/OS-II的任务调度
§6.1 调度器OSSched()的任务调度 一、调度器
1.概念:系统常常是把任务调度和任务切换作为一 个系统服务来提供的,用来完成这个任务的系统程 序模块或系统函数被称为调度器 2.调度职责:寻找优先级别最高的就绪任务作为待 运行任务。即从就绪任务表中获取待运行任务的最 高优先级,进而来获取带运行任务控制块。
μCOS-Ⅱ操作系统
μC/OS-Ⅱ操作系统的简介2009-05-26 22:06μc/os-ii是由jean brosse于1992年编写的一个嵌入式多任务实时操作系统。
最早这个系统叫做μc/os,后来经过近10年的应用和修改,在1999年jean j.labrosse推出了;μc/os-ii,并在2000年得到了美国联邦航空管理局对用于商用飞机的、符合rtca do178b标准的认证,从而证明μc/os-ii具有足够的稳定性和安全性。
μc/os-ii是一个可裁减、源代码开放、结构小巧、可抢占式的实时多任务内核,是专为微控制器系统和软件开发而设计的,是控制器启动后首先执行的背景程序,并作为整个系统的框架贯穿系统运行的始终。
它具有执行效率高、占用空间小、可移植性强、实时性能良好和可扩展性强等特点。
采用μc/os-ii实时操作系统可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应,而且采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。
μc/os-ii的文件体系结构如图1所示。
图1 μc/os-ii的文件体系结构图基于μC/OS—II的嵌入式构件系统设计2009-05-26 22:08引言近些年来,随着嵌入式产品需求的不断增加,嵌入式软件正变得越来越复杂,而产品的开发周期也越来越短。
嵌入式软件开发迫切需要更高效的软件重用手段。
随着软件复用研究成为热点,其核心技术——构件化软件开发方法(CBD)引起了软件工程领域的高度关注,并且在工程应用领域获得了极大的成功。
这种开发方法已在办公应用、电子商务、因特网及分布式网络应用中广泛使用;但在嵌入式领域,构件技术仍处于起步阶段,目前没有一个统一通用的构件规范。
尽管如此,由于基于构件的软件设计方法能够极好地满足嵌入式软件几乎所有的特性(如定制、裁剪、动态演变等),有效缩短产品开发周期,这种设计方法无疑将给嵌入式系统的开发带来巨大的好处。
本文尝试将构件化软件设计思想引入嵌入式软件设计中,提出了一种适用于嵌入式软件的基于构件的软件体系结构,并且在常用输入设备键盘的应用实践中,验证了此体系结构的可行性。
第6章 μCOS-II程序设计基础
系统函数概述| μC/OS-II程序设计基础
基本原则
2.中断服务程序调用函数的限制
中断服务程序不能调用可能会导致任务调度的函数,它们 主要是一些等待事件的函数,这些函数及其替代函数见下表。
禁止使用的函数 替代函数 功能 备注 需要程 序自己 判断是 否获得 了相应 的事件
OSFlagPend()
OSMboxPend() OSMutexPend() OSQPend() OSSemPend()
系统函数概述| μC/OS-II程序设计基础
基本原则
3.任务必须调用某个系统函数
因为μC/OS-II是完全基于优先级的操作系统,所以在一定的条 件下必须出让CPU占有权以便比自己优先级更低的任务能够运行, 这是通过调用部分系统函数来实现的,这些函数见下表。一般的任 务必须调用表中至少一个函数,只有一种情况例外,就是单次执行 的任务,因为任务删除后肯定出让CPU,所以可以不调用表中的 函数。
September,2007
μC/OS-II程序设计基础
绪论
μC/OS-II程序设计基础
本章重点介绍μC/OS-II V2.52版本嵌入式实时操作系统常用 函数的基本用法,其最大的特点不仅示例程序简洁明了,而且电 路也非常简单(如下图),希望初学者一看就懂、一学就会,达 到快速入门的目的。
任务设计| μC/OS-II程序设计基础
1.任务划分的目标
任务的划分
在对一个具体的嵌入式应用系统进行任务划分时,可以有不同 的任务划分方案。为了选择最佳划分方案,就必须知道任务划分的 目标。 高效率的系统
4
3
2
1
2.任务数目合理:对于同一个应用系统,合理的合并一些任务,使任务数 3.简化软件系统:一个任务要实现其功能,除了需要操作系统的调度功能 4.降低资源需求:合理划分任务,减少或简化任务之间的同步和通信需求 1.首要目标是满足“实时性”指标:即使在最坏的情况下,系统中所有对 目适当少一些还是比较有利; 支持外,还需要操作系统的其它服务功能支持,合理划分任务,可以减少 ,就可以减少相应数据结构的内存规模,从而降低对系统资源的需求。 实时性有要求的功能都能够正常实现; 对操作系统的服务要求,简化软件系统;
μCos移植PPT课件
❖也就是说,可重入型函数在任何时候都可 以被中断执行,过一段时间以后又可以继 续运行,而不会因为在函数中断的时候被 其他的任务重新调用,影响函数中的数据。
可重入代码举例
❖ 程序1:可重入型函数 void s *x, int *y) { int temp; temp=*x; *x=*y; *y=temp; }
一般为空
O了SS一ta实个rtH际汇igh上编Rd,宏y(还,) 有它一是个μ文C函/件O数S很-II重fo要*rOAS,_RC它AMPSU就M7_通A是. 用IR进优的Q入先.中多级IN任最断C务高服,环的务它境任时务程定运,序义行 O的因SI汇为ntC编其tx与与SwC芯()函片数和接应口用代都码强函。烈数时相钟关节,*O拍S需_中C要APS断U用M_服A户.务自中函程己断数序退编也出写时没,的有不任移务过切植可换, O以ST通ic过kISIRR(Q) .INC简化用中户断服代序务码程的编*O写S_。CAPSUM_A. 时钟节拍中断服务程序
常量
OS_CPU.H 定义堆栈的增长方向
OS_TASK_SW
函数
OS_CPU.H 任务切换时执行的代码
OSTaskStkInit()
函数
OS_CPU_C.C 任务堆栈初始化函数
OSInitHookBegin()、 OSInitHookEnd()、
…
函数
μC/OS-II在执行某些操 OS_CPU_C.Cபைடு நூலகம்作时调用的用户函数,
用
户的应 移植时需要
编写的代码
用程序
基于µC/OS-Ⅱ操作系统的软件层主要硬分件为四个部分:实时操作系统内核用、于与产处生理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章μC O S-I I操作系统基础及其移植开发初步μCOS-II内核作为一种代码公开的嵌入式实时操作系统内核非常有特色,在规模不大的代码内实现了抢占式任务调度和多任务间通信等功能,任务调度算法也很有独特。
该内核裁剪到最小状态后编译出来只有8K左右,全部内核功能(添加LWIP网络协议栈等)也就100K 左右,资源消耗非常小。
市面上一些ARM微处理器片上所带内存就已经足够一个裁剪合适的内核的简单应用,非常方便产品的开发设计。
当前,μCOS-II是一个基本完整的嵌入式操作系统解决方案套件,包括μC/TCP-IP(IP 网络协议栈)、μC/FS(文件系统)、μC/GUI(图形界面)、μC/USB(USB驱动)、μC/FL(Flash加载器)等部件。
但是这些部件不是公开代码的。
还有一些比较重要的可能在嵌入式环境中发挥重要重要作用的部件,包括嵌入式数据库、POSIX兼容性接口、常用设备的驱动模块等。
将来这个行业还会产生更多的重要部件需求,在互联网上的开源社区通常能够找到相应的开源代码包,并且可以进行移植。
6.1 实时操作系统基本原理与技术本节将主要讲述实时操作系统的基本原理和技术,通过对本章的学习读者可以了解掌握RTOS(Real Time operation System,实时操作系统)的基本特征、结构体系、重要指标、性能参数等重要理论,为全面掌握RTOS打下基础。
6.1.1 实时操作系统基本特征根据IEEE实时UNIX分委会对实时操作系统的定义,实时操作系统的基本特征应表现为以下几个方面:∙实时性:对外部事件作出反应的时间必须在限定的时间内,在某些情况下还需要是确定的,可重复实现的,不管当时系统内部状态如何,都是可预测的;∙异步并发事件响应能力:异步事件是指无一定时序关键随机发生的事件。
如外部设备完成数据传输,实时控制设备出现异常情况等。
实际环境中,嵌入式实时系统处理的外部事件往往不是单一的,这些事件往往同时出现,而且发生的时刻也是随机的,即异步的。
实时软件应有能力对这类外部事件组有效地进行处理;∙抢占式调度:为确保响应时间,实时操作系统必须允许高优先级的任务一旦准备好,马上抢占低优先级任务的执行。
∙内存锁定:必须具有将程序或部分程序锁定在内存的能力,锁定在内存的程序减少了为获得该程序而访问磁盘的时间,从而保证了快速的响应时间;∙快速启动,出错处理和自动复位功能;∙优先级中断和调度机制:必须允许客户定义中断优先级和被度任务的优先级并指定如何中断服务;∙连续文件存储机制:通常要求数据存储在连续文件上,以减少存取数据时的查找时间;∙同步/互斥机制:提供同步和互斥共享数据使用和执行的手段;∙应用程序和操作系统两种软件一体化;∙需要独立的开发平台。
实时操作系统能对来自外界的作用和信号在限定的时间范围内作出响应。
它强调的实时性、可靠性和灵活性。
它与实时应用软件相结合成为有机整体,起着核心作用。
由它来管理和调度各项工作,为应用软件提供良好的运行环境及开发环境。
一般说来,实时操作系统提供系统调用来实现对上层实时应用程序的支持,而操作系统是以库的形式来实现这些支持。
应用程序通过链接实时操作系统的库来获得实时支持。
6.1.2 实时操作系统关键技术指标评价一个实时操作系统一般可以从进程管理、任务调度、内存管理、任务通信、内存开销、任务切换时间和最大中断禁止时间等技术指标来衡量其优劣。
∙任务调度算法:RTOS的实时性和多任务能力在很大程度上取决于它的任务调度算法。
从调度策略上来讲,可分为优先级调度策略和时间片轮转调度策略;从调度方式上来讲,可分为可抢占式、不可抢占式和选择可抢占式调度方式;从时间片来看,分固定与可变时间片轮转两种方式。
常用的调度算法有:Rate Monotonic(发生率单调)、优先级与发生率成正比(LiuLay 1973)、Lottery Scheduler(彩票调度,Wald&Weih194)等;∙上下文切换时间(Context Switching Time):在多任务系统中,上下文切换指当处理器的控制权由运行任务转移到另一个就绪任务时所发生的事件序列。
当运行任务转为就绪、挂起、或删除时,另外一个被选定的就绪任务就成为当前任务。
上下文切换包括保持当前任务的状态,决定哪个任务运行,恢复将要运行的那个任务状态。
保护和恢复上下文是依赖于相关处理器的。
因此,上下文切换时间是影响RTOS性能的一个重要指标。
∙确定性(Determinism):在实时操作系统中,在一定的条件下,系统调用运行的时间是可以预测的。
但这并不意味着所有的系统调用都总是执行一个固定长度的时间,而不管系统的负载如何。
系统调用的最大执行时间可以确定;∙内存管理:通常内存管理分为两种模式:实时模式和保护模式;∙最小内存开销:在RTOS设计过程中,最小内存开销是一个比较重要的指标,这是因为在工业控制的领域中的某些工控机(如上下位机控制系统中的下位机),由于基于降低成本的考虑,其内存的配置一般都不大。
因此在RTOS的设计中,其占用内存大小是一个很重要的指标,这是RTOS设计与其他操作系统设计的明显区别之一;∙最大中断禁止时间:当RTOS运行在核状态或执行某些系统调用时,是不会因为外部中断的到来而中断执行的。
只有当RTOS重新回到用户态时才响应外部中断请求,这一过程所需的最大时间就是最大中断禁止时间;∙任务切换时间:由于某种原因使一个任务退出运行时,RTOS保持它的运行现场信息、插入相应队列、并根据一定的调度算法重新选择一个任务使之投入运行,这一过程所需时间称为任务切换时间。
上述几项中,最大中断禁止时间和任务切换时间是评价一个RTOS实时性最重要的两个技术指标。
6.1.3 实时操作系统基本术语本节将主要介绍在RTOS领域常见的专业术语,以便读者更好地掌握本书余下章节内容。
∙硬实时(Hard Real-Time):通常将采用优先级驱动的,具有时间确定性的,可抢占调度的实时操作系统而设计的实时系统称为硬实时系统。
硬实实时,主要强调对实时性的要求较高。
∙优先级驱动(Priority-Driven):在一个多任务系统中,正在运行的任务总是优先级最高的任务。
在任何给定的时间内,总是把处理器分配给最高优先级的任务。
∙优先级反转(Priority Inversion):当一个任务等待比它优先级低的任务释放资源而被阻塞时,就会发生优先级反转。
优先级继承技术可以解决优先级反转问题。
∙优先级继承(Priority-Inheritance):优先级继承是用来解决优先级反转问题的技术。
当优先级反转发生时,较低优先级任务的优先级暂时提高,以匹配较高优先级任务的优先级。
这样,就可以使较低优先级任务尽快地执行并且释放较高优先级任务所需要的资源。
∙实时执行体(Realtime Executive):实时执行程序包括一套支持实时系统所必需的机制。
如多任务、CPU调度、通信和存储分配等。
在嵌入式应用中,这一套机制被称为实时操作系统或实时执行体或实时内核。
∙重调度过程(Rescheduling Procedure):重调度过程是判断任务优先级和执行状态的过程。
∙任务(Task):RTOS中的任务相当于一般操作系统的进程(Process),一个任务就是RTOS的一个可以运行的历程。
∙任务上下文(Task context):任务上下文指一个未运行的任务状态,如堆栈指针、计数器、内存字段和通用寄存器等。
∙调度延时(Scheduling Latency):调度延时是指当一个事件从引起更高优先级的任务就绪到这个任务开始运行之间的时间。
简而言之,是一个任务被触发后,由就绪到开始运行的时间。
∙可伸缩的体系结构(Scalable Architecture):可伸缩的体系结构指一个软系统能够支持多种应用而无须在接口上做很大的变动。
这种结构往往提供可选用的系统组件,供开发者“量体裁衣”。
∙中断延时(Interrupt Latency):中断延时指从中断发生到开始执行中断处理程序的这一段时间。
∙互斥(Mutual Exclusion):互斥是用于控制多任务对共享数据进行顺序访问的同步机制。
在多任务应用中,当两个或更多的任务同时访问同一数据区时,就会造成访问冲突。
互斥能使它们依次访问共享数据而不引起冲突。
∙抢占(Preemptive):抢占是指当系统处于核心态的内核运行时,允许任务重新调度。
也就是说,一个正在执行的任务可以被打断而让另一个任务运行,这提高了应用对外部中断的响应性。
许多RTOS都是以抢占方式运行。
但这并不是说调度在任何时候都是可以发生的。
例如,当RTOS的一个任务正在通过系统调用访问共享数据时,重新调度和中断都是不允许的。
6.2 μCOS-II应用程序开发μCOS-II自1992年发布以来,在世界各地获得了广泛的应用,它是一种专门为嵌入式设备设计的内核。
鉴于μCOS-II可免费获得代码,对于嵌入式RTOS而言,μCOS-II无疑是最经济的选择。
应用μCOS-II,自然要为它开发应用程序。
下面介绍基于μCOS-II的应用程序的基本结构以及与应用程序开发相关的知识。
6.2.1 μCOS-II的变量类型由于C语言变量类型的长度与编译器类型相关,为了便于在各个平台间移植,在μCOS-II 中没有使用C语言的数据类型,而是定义了自己的数据类型。
具体的变量类型如表6.1所示,这些变量的定义,可参加μCOS-II源码的OS_CPU.H文件。
表6.1 μCOS-II使用的变量类型6.2.2 应用程序基本结构每个μCOS-II应用至少要求有一个任务。
每个任务必须被写成无限循环的形式。
下面代码是μCOS-II推荐的结构,V oid task(void * pdata){INT8U err;InitTimer();While(1){…//应用程序代码OSTimeDly(1) ; //可选}}系统会为每一个任务保留一个堆栈空间。
由于系统在任务切换时要恢复上下文并执行一条reti指令返回,如果允许任务执行到最后一个花括号,那么很可能会破坏系统的堆栈空间,从而使应用程序的执行带有不确定性。
换句话说,程序“跑飞”了。
所以,每一个任务必须被写成无限循环的形式。
不管是系统强制(通过ISR),还是主动放弃(通过调用OS API),开发者都要使自己的任务能够放弃对CPU的使用权。
现在来讨论InitTimer()函数。
这个函数应由系统提供,开发者需要在优先级最高的任务内调用它且不能在for循环内调用。
需要注意的是,这个函数是和所使用的CPU相关的,每种系统都有自己的Timer初始化程序。
在μCOS-II的帮助手册内,作者强调绝不能在OSInit()或OSStart()内调用用Timer初始化程序,那么会破坏系统的可移植性,同时也会带来性能上的损失。