【嵌入式系统】第9章 嵌入式操作系统及应用,典型嵌入式操作系统μC/OSⅡ,μC/OS-II的移植,基于μC/OS-Ⅱ下的应用程序程序设计

ops/2024/12/12 11:03:50/

 关注作者了解更多

我的其他CSDN专栏

过程控制系统

工程测试技术

虚拟仪器技术

可编程控制器

工业现场总线

数字图像处理

智能控制

传感器技术

嵌入式系统

复变函数与积分变换

单片机原理

线性代数

大学物理

热工与工程流体力学

数字信号处理

光电融合集成电路技术

电路原理

模拟电子技术

高等数学

概率论与数理统计

数据结构

C语言

模式识别原理

自动控制原理

数字电子技术

关注作者了解更多

资料来源于网络,如有侵权请联系编者

目录

9.1 嵌入式操作系统概述

9.1.1 嵌入式操作系统一般结构

9.1.2嵌入式操作系统的特点与分类

9.2 典型嵌入式操作系统μC/OSⅡ

μC/OS-Ⅱ系统的组成

μC/OS-Ⅱ数据类型

μC/OS-Ⅱ的任务及其管理

μC/OS-Ⅱ任务管理服务-创建任务

μC/OS-Ⅱ时间管理服务

μC/OS-Ⅱ通信与同步服务-发送

μC/OS-Ⅱ通信与同步服务-接收

9.3 μC/OS-II的移植

嵌入式操作系统的裁剪

9.4基于μC/OS-Ⅱ下的应用程序程序设计

μC/OS-Ⅱ的初始化与main()函数结构

μC/OS-Ⅱ用户任务的3种结构 -单次任务

μC/OS-Ⅱ用户任务的3种结构 -周期性执行的任务

μC/OS-Ⅱ用户任务的3种结构 -事件触发执行的任务

μC/OS-Ⅱ应用程序设计实例

9.5 μC/OS- Ⅲ简介


9.1 嵌入式操作系统概述

9.1.1 嵌入式操作系统一般结构

9.1.2嵌入式操作系统的特点与分类

一、特点

(1)代码固化存储,执行效率高 (2)可裁剪性 (3)实时性 (4)强稳定性 (5)硬件适应性,可移值性

二、分类

(1)按实时性分类 分为硬实时操作系统和软实时操作系统。

(2)按商业模式分类 按照商业模式,可以把EOS分为商用型EOS和免费型EOS。  

   μC/OS-Ⅱ是抢占式多任务实时嵌入式操作系统。μC/OS-Ⅱ具有足够的稳定性和安全性。目前最新版本为μC/OS-Ⅲ。

9.2 典型嵌入式操作系统μC/OSⅡ

一、C/OS-Ⅱ的主要特点

(1)公开源码的高质量实时内核

(2)可移植性 μC/OS-Ⅱ可被移植到多种微处理器上。

(3)可裁剪、可固化

(4)时间确定性 绝大多数μC/OS-Ⅱ的函数调用与服务的执行时间都是确定的,其服务的执行时间与系统中运行的任务个数无关。

(5)多任务 μC/OS-Ⅱ可以管理64个任务(版本2.82以后扩充至255个任务)不支持时间片轮转(round-robin)调度机制。

(6)抢占式内核 μC/OS-Ⅱ是抢占式实时内核,在任意时刻都可能发生任务调度。因此,μC/OS-Ⅱ可以支持强实时应用。

(7)多种系统服务 μC/OS-Ⅱ提供很多实时内核所需的系统服务,例如任务管理、时间管理、信号量、事件标志组、互斥信号量、消息队列、内存分区管理等。

μC/OS-Ⅱ系统的组成

      μC/OS内核大致可以划分为任务调度、任务管理、时间管理、任务间同步与通信以及内存管理、系统管理等模块。

μC/OS-Ⅱ数据类型

μC/OS-Ⅱ的任务及其管理

   μC/OS-Ⅱ的任务由三部分构成:

(1)程序代码

(2)任务堆栈

(3)任务控制块

μC/OS-Ⅱ任务管理服务-创建任务

(1)任务创建

函数OSTaskCreate()和OSTaskCreateExt()都可以创建任务。

OSTaskCreateExt()函数提供了一些附加的功能,但会增加额外的开销。 创建任务函数OSTaskCreate()原型如下:

INT8U OSTaskCreate( void (*task)(void *pd),         /* 指向任务代码的的指针 */

void *pdata,            /* 任务开始执行时传递给任务的参数的指针 */

OS_STK *ptos,             /* 任务堆栈栈顶的指针 */

INT8U prio );             /*分配给任务的优先级*/

如: static OS_STK AppTask1Stk[64];//任务1堆栈

OSTaskCreate(   // 任务创建任务1     

AppTask1, //任务代码指针     

(void *)0,  //传递给任务的参数指针     (OS_STK *)&AppTask1Stk[64-1],//任务的堆栈指针            4);    //任务1任务优先级为4

μC/OS-Ⅱ时间管理服务

1、延时指定节拍数OSTimeDly()

原型为:

void OSTimeDly (INT16U ticks);参数ticks为要延时的时钟节拍数

2、延时指定具体时间OSTimeDlyHMSM()

原型为:

INT8U OSTimeDlyHMSM (INT8U hours,//时           

 INT8U minutes,     //分           

 INT8U seconds,       //秒             

INT16U milli);          //毫秒

实际的延时时间是时钟节拍的整数倍。

如延时1小时18分26秒,则调用 如下:

   OSTimeDlyHMSM(1,18,26,0);

μC/OS-Ⅱ通信与同步服务-发送

1、释放信号量OSSemPost

INT8U OSSemPost(OS_EVENT *pevent);

2、释放互斥信号量OSMutexPost

INT8U OSMutexPost(OS_EVENT *pevent);

3、释放消息邮箱OSMboxPost

INT8U OSMboxPost(OS_EVENT *pevent, void *pmsg);

4、 释放消息队列OSSenPost

INT8U OSSemPost(OS_EVENT *pevent);

μC/OS-Ⅱ通信与同步服务-接收

1、等待信号量OSSemPend

Void OSSemPend(OS_EVNNT *pevent, INT16U timeout, int8u *err);

2、等待互斥信号量OSMutexPend

void OSMutexPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);

3、等待消息邮箱OSMboxPend

void *OSMboxPend(OS_EVENT *pevent, INT32U timeout, INT8U *perr);

4、 等待释放消息队列OSQPend

void *OSQPend(OS_EVENT *pevent, INT32U timeout, INT8U *perr);

9.3 μC/OS-II的移植

   要使μC/OS-II正常运行,微控制器必须满足以下要求:

微控制器的C编译器能产生可重入代码;

微控制器支持中断,并且能产生定时中断;

C语言可以开/关中断;

微控制器支持一定数量的数据存储硬件堆栈;

微控制器有将堆栈和其他CPU寄存器读出和存储到堆栈或内存的指令。

移植μC/OS-II只需修改OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C这三 个文件的相关函数。

μC/OS-II的体系结构

嵌入式操作系统的裁剪

    嵌入式操作系统内核是针对多种处理器而设计的,对于一种处理器,某个应用场合,有些代码是多余的,则需要对代码进行适当的裁剪以满足够用就好的设计原则。

   裁剪的目标就是去掉多余的代码,以减少不必要的内存空间。更适应嵌入式系统量体裁衣的要求。

9.4基于μC/OS-Ⅱ下的应用程序程序设计

μC/OS-Ⅱ的初始化与main()函数结构

void  main()

{ HW_config();    /* 硬件配置与初始化,包括时钟和使用的外设 */

OSInit();         /* 初始化μC/OS-Ⅱ内核 */

OSTaskCreate(Task1, ……);         /* 创建用户任务1 */

OSTaskCreate(Task2, ……);         /* 创建用户任务2 */

...... OSTaskCreate(Taski, ……);         /* 创建用户任务i */

OSStart();                 /* 启动多任务调度 */ }

μC/OS-Ⅱ用户任务的3种结构 -单次任务

单次执行的任务通常执行三步操作:

任务准备工作;任务实体;自我删除函数调用。

void  Task (void *pdata)

{  

任务初始化的准备工作;       /* 初始化硬件设备 */  

任务实体;                     /* 完成该任务的具体功能 */  

OSTaskDel(OS_PRIO_SELF);   /* 任务完成后删除*/

}

μC/OS-Ⅱ用户任务的3种结构 -周期性执行的任务

周期执行的任务一般采用循环结构,并在每次完成具体功能后调用系统延时函数OSTimeDly()或OSTimeDlyHMSM()等待下一个执行周期,并将处理器时间让给其他任务。

 void  Task (void *pdata)

{任务初始化准备工作;         /*初始化硬件设备 */ for ( ; ; )                 

/* 无限的循环 或while(1)*/

{ 任务实体;               /* 完成该任务的具体功能 */

 OSTimeDly(n);       /*调用系统延时函数等待下一个周期 */    

}

}

μC/OS-Ⅱ用户任务的3种结构 -事件触发执行的任务

   这类任务的实体代码只有在某种事件发生后才执行。在相关事件发生之前,任务被挂起。事件触发执行的任务一般也采用循环结构,相关事件发生一次,任务实体代码执行一次。

void  Task (void *pdata)

{   任务初始化的准备工作;      /* 初始化 */    

for ( ; ; )                       /* 无限的循环或while(1) */    

{    

调用获取事件的函数;        /* 等待信号量或消息等 */ 任务实体;                     

 /* 完成该任务的具体功能 */    

}

}

μC/OS-Ⅱ应用程序设计实例

按照执行周期性任务的程序结构创建四个任务:   

 任务1每隔100ms 采集电位器电压     

任务2 每隔200ms判断电压值并控制蜂鸣器报警     

任务3 每隔300ms输出与电压相应的PWM波形控制电机     

任务4 每隔500ms在TFT LCD屏显示电压值

  打开实验例程中的任务调度应用实验,对照MDK-ARM工程讲解示例。

(1)硬件初始化              

(2)操作系统初始化

(3)创建任务并编写任务程序

(4)启动任务调度

9.5 μC/OS- Ⅲ简介

   2010年,拉伯罗斯于推出了μC/OS-Ⅲ,他认为μC/OS-Ⅲ并不是μC/OS-Ⅱ的升级版本,而是一个全新的RTOS内核。

   μC/OS-Ⅱ是定位于8位和16位以及低端32位处理器的RTOS内核μC/OS-Ⅲ尽管在16位甚至8位处理器上可以运行良好,但其初衷则是主要针对高端32位处理器,这类处理器带有支持优先级调度的指令,且内存资源更丰富。

μC/OS-Ⅲ增加的主要特性包括:

(1)时间片轮转调度

(2)内核对象的数量无限制

(3)任务消息和任务信号

(4)任务级的时钟节拍处理

(5)可针对处理器体系结构进行优化

(6)时间戳

(7)增强的内置性能测试功能


http://www.ppmy.cn/ops/141232.html

相关文章

【Linux网络编程】第七弹---构建类似XShell功能的TCP服务器:从TcpServer类到主程序的完整实现

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、TcpServer.hpp 1.1、TcpServer类基本结构 1.2、 Execute() 2、Command.hpp 2.1、Command类基本结构 …

HDFS(Hadoop Distributed File System)

HDFS(Hadoop Distributed File System)工作原理简介 HDFS 是 Hadoop 的核心组件,设计用于在大规模分布式环境中存储和处理海量数据。以下是其主要工作原理: 1. 架构组成 HDFS 采用主从架构,由以下两类关键节点组成&a…

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘,后期部署好RagFlow后C盘爆红,在连接ollama的时候一直在转圈圈,问其他人没有遇到这种情况,猜测是因为内存不足无法加载模型导致,今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

windows 脚本批量管理上千台服务器实战案例

如果你们有接触服务器,都是知道服务器有BMC管理界面的,这几天我在做项目中,需要不断的开关机服务器,如果一两台服务器登录BMC界面重启服务器还好,如果服务器数量非常的庞大,成百上千台,我们不可…

JWT报CORSFilter错误原因(以Java SpringBoot为例)

JWT 报 CorsFilter 原因,通常是因为跨域请求未通过浏览器的同源策略检查,而 CorsFilter 是用来处理跨域问题的过滤器。如果后端未正确配置 CORS 或 JWT 的传递方式不符合跨域要求,可能导致此类问题。 以下是具体原因及解决方法: …

Spring Boot读取配置文件的六种方案

从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑,以下是我整理的几种获取配置属性的方式。 一、Environment 使用 Environment 方式来获取配置属性值非常简单&#xf…

location规则和rewrite重定向

location匹配规则 在nginx当中,匹配的对象一般是uri来匹配 location匹配的分类: 多个location一旦匹配其中之一,就不在匹配其他的location 1、精确匹配 location / {…} :完全相同,一个字符错都匹配不到 2、正则匹配 location ~…

迭代器模式的理解和实践

引言 在软件开发中,我们经常需要遍历容器对象(如数组、列表、集合等)中的元素。如果每个容器对象都实现自己的遍历算法,那么代码将会变得冗余且难以维护。为了解决这个问题,迭代器模式应运而生。迭代器模式是一种行为型…