uc-osⅡ入门——创建工程模板

news2024/10/6 12:28:46

目录

任务:

概念

简介

性质

组成

1) 核心部分(OSCore.c)

2) 任务处理部分(OSTask.c)

3) 时钟部分(OSTime.c)

4) 任务同步和通信部分

5) 与CPU的接口部分

总结分析和思考

任务管理

时间管理

内存管理

通信同步

任务调度

理解

实践


任务:

了解什么是ucos

创建一个通用的uCOS-II操作系统工程模版

概念

简介

 

         μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。 μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。现在最新版的是μC/OS-III。

        说到这个就不得不提到一个嵌入式工程师的考试,我记得有一个国内的证是要考ucosⅡ的,国内还有个工信部的linux考试,国外有微软的wince,红帽的linux应用,ARM的嵌入式ARM,还有一个不太了解的Atmel,也是个半导体公司,可能是更上游的产业,目前用过SOC的就只是开始的STC,STM后来的三星、NXP,还有比赛接触的鸿蒙以及挺感兴趣的龙芯。哦还用过全志的。

性质

        μC/OS-II被广泛应用于微处理器、微控制器和数字信号处理器。

        μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。

        μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。

        严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。

        uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。

        uC/OS-II以源代码的形式发布,是开源软件, 但并不意味着它是免费软件。你可以将其用于教学和私下研究(peaceful research);但是如果你将其用于商业用途,那么你必须通过Micrium获得商用许可。

        所以我们拿来学习是免费的,到公司以后这部分钱也是公司出。在rtos领域,ucosⅡ依然是现在最稳定的rtos。不过未来可能会被完全开源的freertos和RT-thread代替。现在到处都在推进国产化,我挺看好RT-thread的。后面了解的时候会发布相关的学习笔记。

组成

        μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。

1) 核心部分(OSCore.c)

        是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。

2) 任务处理部分(OSTask.c)

        任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。

3) 时钟部分(OSTime.c)

        μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。

4) 任务同步和通信部分

        为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。

5) 与CPU的接口部分

        是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。

总结分析和思考

任务管理

        uC/OS-II 中最多可以支持256个任务,分别对应优先级0~255,其中0 为最高优先级。255为最低级。

注意:uC/OS中最多可以支持64个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级。

        uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。

系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。

时间管理

        uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。

        uC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。

内存管理

        在ANSI C中是使用malloc和free两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的操作会导致内存碎片,且由于内存管理算法的原因,malloc和free的执行时间也是不确定。

        uC/OS-II中把连续的大块内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内存块大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。

通信同步

        对一个多任务的操作系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4种同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。

任务调度

        uC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。

        uC/OS-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。

1) 高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。

2) 高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。

        这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程序中。

调度工作的内容可以分为两部分:

最高优先级任务的寻找和任务切换。其最高优先级任务的寻找是通过建立就绪任务表来实现的。u C / O S 中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB(Task Control Block)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量OSTCBHighRdy 记录当前最高级就绪任务的TCB 地址,然后调用OS_TASK_SW()函数来进行任务切换。

理解

        在学完linux后再来看,感觉就是一个阉割版的linux,仅仅实现了多线程,我们在使用时操作的那些任务其实和用linux时使用线程是差不多的。使用少量资源的相对独立个体。ucos的内核帮我们实现了对内存的简单管理。源码去掉板级适配后并不多,我们自己其实也可以实现。当然这是因为我们站在巨人的肩膀上。我大二课设的时候写过一个更简单的操作系统。也因此拿了课设专业第一。嘿嘿。同学们感兴趣可以也写一个试试。也可以多人组建个小团队或者干脆开源出去大家一起来。这种RTOS核心技术不是很难,主要是为了实时性和稳定性。这就需要很多人一起来优化完善。说到这越来越期待RT-thread了。

uC/OS-II_百度百科

更具体的可以看看百度,这里还讲了他的问题和解决办法。

实践

 先创建几个文件夹,这个根据个人爱好,我这个结合了硬石和正点原子的风格加上我比较懒形成的。

从名字上看从上到下分别是库,工程,readme,内核,写代码的地方

然后打开官方源码

 

把这三件套粘过来

 

这个文件里有例程

然后把STM32库文件的那两件套复制过来

 

 User里在以前的基础上加个OS目录放一些和RTOS相关的。

OS内就是三组东西

应用层驱动层这两套是自己写的,hooks是rtos自带的钩子函数。 

 

从上到下分别是启动文件,CMSIS层文件,ST公司的片内外设文件用户应用层文件,

驱动文件,rtos的相关源码,最后readme 

源码中提供三种编译工具,我们使用RealView,这个是ARM的。

 

这里头文件用os.h会报错,没有这个文件,我看了官方例程ii用的是ucos_ii.h而3用的是os.h

 

 头文件中这个他不认识,追一下

这个东西他没定义

这个东西在os_cfg.h中定义的,我一看是iii的这个文件。

换一下文件少了40多个报错

user目录下的文件我用的都是iii的和ii不通用要换一下。

接下来就是哪里爆红删哪里,因为官方例程用了串口和灯,咱们都没设置,都删掉了就完成了模板的创建。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt6构建于打包发布

打包发布 release 单文件打包 参考文献:https://blog.csdn.net/sasafa/article/details/126538432 首先准备我们欲打包发布的项目 默认情况下运行时发布的是 debug 类型的(包含冗余调试信息,文件大),我们需要切换到 …

【利用AI让知识体系化】前端安全攻防知识点

文章目录 1. 前言1.1 前端安全攻防的意义1.2 概述前端安全攻防的范畴和流程 2. 攻击技术2.1 XSS攻击2.1.1 原理和类型2.1.2 预防和防御 2.2 CSRF攻击2.2.1 原理和类型2.2.2 预防和防御 3. 代码层次3.1 JavaScript代码安全3.1.1 客户端JavaScript安全3.1.2 服务器端JavaScript安…

从零玩转系列之微信支付安全

一、前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端) 在此之前已经更新了 微信支付开篇 二、微信支…

java SSM 宿舍管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 宿舍管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/…

docker部署gin项目

以如下这个简单的项目为例 创建Dockerfile文件 #指定构建镜像的基础镜像 FROM golang:1.18-alpine #开发者 MAINTAINER who # 为我们的镜像设置必要的环境变量 ENV GO111MODULEon \GOPROXYhttps://goproxy.cn,direct \CGO_ENABLED0 \GOOSlinux \GOARCHamd64#设置工作目录&…

集成运算放大器的线性应用(模电速成)

目录 1、运算电路基本认识 2、反向比例、同相比例运算电路 3、电压跟随器(同相比例的特例) 4、差分比例运算电路(减法运算电路) 5、积分、微分运算电路 1、运算电路基本认识 (集成运放工作在线性区) 两…

4.LVS负载均衡集群

文章目录 LVS负载均衡集群集群介绍集群类型LVS工作模式LVS虚拟服务器介绍LVS的NAT模式部署设置NFS服务器设置节点服务器配置负载调度器 LVS负载均衡集群 集群介绍 群集的含义 Cluster,集群、群集由多台主机构成,但对外只表现为一个整体,只提…

卷积神经网络之父的强人工智能路线图:自监督,推理,规划

导读 2023 年 6 月 9 日,智源大会第一天。在这场众星云集的盛会中。目前「深度学习三驾马车」中最活跃的 Yann LeCun 教授带来了重磅演讲「朝向能学习, 思考和计划的机器进发( Towards Machines that can Learn, Reason, and Plan&#xff09…

QtXlsxWriter make报错:[Makefile:45:sub-xlsx-make_first] 错误

新安装的银河麒麟系统(x64版),编译QtXlsxWriter库的时候报错: rootzhouyingge1104-GB01:/home/zhouyingge1104/Downloads/QtXlsxWriter-master# make cd src/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Make…

AD09 PCB拼板制作完整流程

1、新建PCB文件 画好PCB之后,先在原有工程文件下新建一个PCB文件(可以保存为XXX拼板),PCB大小根据拼板前大小以及拼板阵列确定(也可以在做好工艺边后再修改大小)。 2、放置PCB阵列 如上图,来…

《微服务实战》 第二十九章 分布式事务框架seata AT模式

前言 本章节介绍微服务分布式项目中,使用的事务框架seata。 官网:http://seata.io/zh-cn/ springcloud-nacos-seata:https://github.com/seata/seata-samples/tree/master/springcloud-nacos-seata 1、概念 Seata 是一款开源的分布式事务解…

线程堵塞(挂起)导致消息队列消息挤压

一、背景 A服务作为生产者,每天发送上百万的mq消息,每一个消息包含500个用户id数据。 B服务作为消费者,接受MQ消息并通过http调用第三方请求进行业务处理,消费组使用了rabbitmq 的多线程消费组,一个实例并发40个mq消…

四种Bootloader程序安全机制设计

正文 大家周末好,我是bug菌~ 不管是玩单片机还是嵌入式linux,基本上都会接触到bootloader,所以bootloader程序也是一个关键的组件,进行硬件初始化,应用程序的合法性、完成性检测、升级功能等等都与其息息相关。 像一些…

【ABAP】数据类型(二)「预定义数据类型」

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

【哈希的模拟实现】

文章目录 1 哈希概念2 哈希冲突2.1 直接定址法 (常用)2.2 除留余数法 (常用)2.3 平方取中法2.4 折叠法2.5 随机数法2.6 数学分析法 3 闭散列3.1 线性探测3.2 二次探测 4 开散列4.1 开散列概念4.2哈希桶的模拟实现4.3 开散列与闭散列的比较 1 哈希概念 顺序结构以及平衡树中&…

Science|改变微生物群落可以增强树木对气候变化的耐受性

改变微生物群落可以增强树木对气候变化的耐受性 Shifting microbial communities can enhance tree tolerance to changing climates Research Article,2023-5-25,Science, [IF 63.714] DOI:10.1126/science.adf202 第一作者&…

Java常用快捷键

在编写java代码时,要提升自己的编写代码的速度,光是靠鼠标来完成各种的操作是不行的,还会显得十分不成熟,所以这是就需要我们使用一定的快捷键,在键盘点击之间,完成代码的操作。接下来我就为大家介绍常用的…

7.2DIY可视化后台表格自定义列显示类型

后台表格自定义列显示类型 本教程均在第一节中项目启动下操作 后台表格自定义列显示类型前言一、图片格式内容显示:二. 效果展示: http://localhost:9999/#/hdp三:自定义列使用:1.添加字段:自定义列,取值自幻灯片title2. 设置自定义信息: 三.效果展示本文章原自bilibli作者视频…

6月6日复盘总结 11H10min-|23:15~23:25*

​​​​​​​ 7:20-8:20 背书翻译单词 【1h】 8:30-9:00 乐词 【30min】 9:00-10:00 TPO66 L1 精听 【1h】 10:00-10:30 TPO66 L1 错题分析 【30min】 10:30-11:30 L2 Fish Movement 精听 【1h】 11:40-12:40 午饭+水果🍑+玩手机…

【华为OD统一考试B卷 | 100分】经典屏保(C++ Java JavaScript Python)

题目描述 DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹。 请根据如下要求,实现屏保Logo坐标的计算算法。 屏幕是一个800*600像素的矩形,规定屏幕的左上角点坐标原点,沿横边向右方向为X轴…