ucosii内核总结

2023-05-16

博主最近一直在看有关ucosii的代码,并将其成功移植到了正点原子STM32F103的开发板上。颇有一些收获,于是将其总结下来与大家一起分享。

本文不会向你介绍怎么移植ucos(在STM32上移植ucos的资料多的很,大家可以去自己亲自体验一下),本文只会对ucos的一些内核进行剖析。

严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,中断与时间管理,内存管理和任务间的通信和同步等基本功能,所以本文就基于这些内容向大家认真剖析ucosii的内核代码。

一、时间管理

首先就是时间管理,博主首先在这里把时钟放在了首位。因为时钟相对于处理器来说相当于心跳,我们在裸机开发的时候都需要使能系统时钟与外设时钟,μC/OS需要用户提供周期性信号源,用于
实现时间延时和确认超时。该周期性节拍可以通过os_cfg.h来进行配置,该节拍越快,实时性越好但CPU负载越重,该节拍越慢,实时性会变差但CPU负载会轻,所以我们需要根据自己的芯片以及所使用的场景来合理设置时钟节拍,一般设置为 10-100hz之间。

ucos时钟管理软件的核心代码便是OSTickISR(),该函数是一个定时中断函数,每隔一个固定的时钟节拍运行一次,该函数会调用OSTimeTick()函数,OSTimeTick()的主要功能便是检查每个任务的延时。STM32使用的是嘀嗒定时器产生的定时中断,作为ucos的时钟节拍。

二、任务调度

任务调度的含义便是指根据一定的约束规定,将CPU分配给符合条件的任务使用。约束规则又称为调度算法。而ucos的调度算法便是占先式多任务实时内核

ucos使用任务就绪表来存储任务的优先级以及就绪状态。

 ucos的任务调度函数有OSSched()与OSIntExt(),ucosii中任务调度的主要功能就是在任务就绪表中找到优先级最高的那一个,并进行上下文切换。ucos的任务调度很简单就是一个简单的查表法。
任务级调度是在OSSched()中完成的                                        

中断级调度是在OSIntExt()中完成的

任务切换

任务切换的主要功能便是保存旧任务的CPU现场至堆栈中,然后获得新任务的堆栈指针,运行新任务代码。

任务级的任务切换函数是        OS_TASK_SW()     该函数的主要功能为将被挂起任务的寄存器内容入栈;将较高优先级任务的寄存器内容出栈,恢复到硬件寄存器中。
中断级的任务切换函数        OSIntExit()        该函数调用了OSIntCtxSw()进行任务切换。退出中断后先不着急返回原来的程序,先检查是否有更高优先级的任务,如果有则进行切换。

使用OSIntCtxSw()的原因是

1、因为中断前一半的任务切换工作,即CPU寄存器入栈,已经在前面做完了;
2、需要保证所有被挂起任务的栈结构是一样的;

三、任务管理

ucos的任务管理功能有        创建任务、 删除任务、修改任务的优先级、挂起和恢复任务、获得一个任务的有关信息等

 任务控制块 OS_TCB是描述一个任务的核心数据结构,存放了它的各种管理信息,包括任务堆栈指针,任务的状态、优先级,任务链表指针等;

任务管理的功能需要使用到任务控制块。

函数名        功能
OSTaskCreate()创建任务
OSTaskDel()删除一个任务,从任务控制块中删除
OSTaskChangePrio()修改任务的优先级
OSTaskSuspend()挂起一个任务
OSTaskResume()恢复一个任务
OSTaskQuery()获取任务的有关信息

 四、中断管理

ucos开关中断一工有三种方式,一般我们默认使用方式三。

ucos的中断管理非常简单,只需要调用两个函数即可。

OSIntEnter()与OSIntExit()        这两个函数只能在中断中使用,不能在任务级场景下调用,移植时要根据处理器变化进行修改。

用户中断ISR框架

OSIntEnter()的意义        将中断嵌套层数      OSIntNesting 加1;

OSIntExit()的意义        判断中断退出后有无更高优先级的任务,并进行切换。

五、内存管理

        首先要认清ucos管理的是哪一部分内存,下图是嵌入式中堆和栈的定义。

 堆

程序员自己申请,自己释放 例如 malloc()、free()、new()、delete()

 栈

编译器自动申请释放,例如局部变量、函数的参数值

        Ucosii的内存管理全部是针对堆的。STM32中栈的增长方向是由高地址到低地址,堆的增长            方式是由低地址到高地址。

        ucosii的内存管理代码用到了内存控制块(MCB)

        

ucos的存储管理使用的是固定分区的存储管理方法,这样可以解决因为malloc和free而导致的内存碎片问题。

      内存管理的库函数

  1. 创建内存分区   OSMemCreate()        //初始化内存分区
  2. 分配内存块       OSMemGet()            //从内存分区中分配内存   按块获取内存
  3. 释放内存块       OSMemPut()            //从内存分区在释放内存   按块释放内存

六、任务间通讯与同步

        (一)、同步和互斥(低级通讯)

        临界区      信号量

        临界区:采用关中断,开中断

        代码: OS_ENTER_CRITICAL()           OS_EXIT_CRITICAL()          //必须成对出现

        信号量:

        1、实现对共享资源的互斥访问。       

        2、实现任务间的行为同步

        库函数有:

        信号量创建OSSemCreate()               
        等待信号量(带阻塞)OSSemPend()(类似P原语)
        发送信号量 OSSemPost()(类似V原语)                
        等待信号量(无阻塞)OSSemAccept()
        查询信号量 OSSemQuery()

                                信号量只能传递状态,整数值等控制信息,不够高级

         (二)、任务间通讯(高级通讯)

               共享内存、 邮箱、消息队列 

              uc/osIi中所有的通讯信号都被看成是事件,uc/osii 通过事件控制块管理每一个具体                          事 件。使用两个链表,空闲链表和使用链表。

                 邮箱:可以看成是带消息的信号量,包含msg的地址。

                 邮箱的状态,

                 满的状态:邮箱包含非空指针型变量

                 空的状态:邮箱的内容为空指针NULL

                  库函数:

                 邮箱创建、等待邮箱中的消息、发送消息至邮箱、无等待的请求邮箱中消息

                 查询邮箱的状态

                消息队列:一个消息队列可以容纳多个不同的消息,可以将其看成是由多个邮箱组成的                  数组,只不过公用一个等待任务列表

               消息队列使用专门的队列控制块,库函数功能与信号量邮箱等基本一致。

七、总结

        以上便是博主自己总结的ucosii操作系统的内核实现原理,本文写的比较简陋仓促,疏                    误之处殷切希望得到大家的批评指正,谢谢。

  参考资料:正点原子STM32F1光盘/ A盘/软件资料/ucosii 资料。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ucosii内核总结 的相关文章

随机推荐

  • php usort函数,关于PHP中usort()函数的解读,以及一些经验分享

    太原学府中心 psd 温磊 最近学习遇到自定义数组排序函数usort 有些不了解 xff0c 搜了很多地方都没有很好的解释 xff0c 自己研究好久 xff0c 发来与和我一样的初学者共享 xff5e bool usort array am
  • html app启动页制作,【示例】App引导页的制作

    注意 xff1a 本文为5 43 App的引导页制作方法 xff0c uni app另行制作 xff0c 推荐使用nvue制作 xff0c 也可以参考插件市场已经封装的插件https ext dcloud net cn plugin id
  • c语言树莓派串口通信_树莓派c语言串口通讯程序

    在网上搜了很多关于树莓派串口通讯的例子 xff0c 但是都是用python写的 xff0c 虽然python很有名 xff0c 而且最近也在学习这门语言 xff0c 但是还是想用c语言实现一下 xff0c 因为需要用到整套系统里 xff0c
  • matlab调用cuda,Matlab 调用CUDA的总结(Windows、Ubuntu)

    出于加速计算的目的项目里需要用CUDA实现matlab部分计算然后使用matlab调用 由于计算部分需要的参数太多 xff0c 往CUDA里一一传送太麻烦 xff0c 所以先利用Matlab将这些参数存入到mat文件中 xff0c 在CUD
  • 计算机软件版本号是什么意思,带你深入了解解密Windows系统版本和版本号

    版本号是分配给软件程序 文件 固件 设备驱动程序甚至硬件的特定版本的唯一编号或一组编号 随着程序或驱动程序的更新和全新版本的发布 xff0c 版本号将会增加 Win10 1903是现在最新的正式版本 xff0c 最新版本号为18362 32
  • 集成学习综述

    集成学习综述 集成学习 ensemble learning 本身不是一个单独的机器学习算法 xff0c 而是通过构建并结合多个机器学习器来完成学习任务 也就是我们常说的 博采众长 集成学习可以用于分类问题集成 xff0c 回归问题集成 xf
  • Ngrok +阿里云服务器+Ubuntu18.04 内网穿透

    为什么要实现内网穿透 相信大家在项目开发中总会碰到很尴尬的问题 xff0c 就是外网环境无法访问内网中的web服务 xff0c 这样很难将自己的项目成果展示给别人看 或者是在进行微信端开发时 xff0c 需要在外网上进行项目开发 xff0c
  • 关于MySQL的优化思路

    SQL 优化步骤 当面对一个需要优化的 SQL 时 xff0c 我们有哪几种排查思路呢 xff1f 通过 show status 命令了解 SQL 执行次数 首先 xff0c 我们可以使用 show status 命令查看服务器状态信息 s
  • cas 配置mysql_CAS mysql linux安装与配置

    一 CAS在linux中的安装与配置 一 首先将 root cas 下的 page文件夹删除 只留以下两个 二 创建cas 文件夹 并将root 下的tomcat压缩包 和 cas war 复制进去 root 64 hostname cd
  • 技术系统进化法则包括_TRIZ理论八大技术系统进化法则.doc

    机械创新设计课程论文 TIZE理论的八大技术系统进化法则 专 业 班 级 学 号 姓 名 成 绩 教 师 2013年 5月 23日 TRIZ理论的八大技术系统进化法则 姚巧珍 10机自职1班 xff0c 学号 xff1a 101011312
  • oracle数据库安装配置错误,Oracle数据库配置错误信息解决方法(转)

    Oracle客户端网络配置 xff1a l 在Oralce产品安装完成后 xff0c 为了与数据库服务器进行连接或者是两台数据库之间进行数据复制 xff0c 则必须进行网络连接配置 l Oracle9i Net Service配置方法 xf
  • Smart3D三维建模操作笔记

    基本步骤都有 xff0c 写的很乱 xff0c 待整理 软件教程视频 xff1a https www iqiyi com v 19rxtdw1lo html 许可只能用一次 Master 三维建模软件 xff0c 主从工作模式 xff1a
  • 超详细的CentOS下载与图文安装

    一 CentOS7 4下载 官网下载页面地址 xff1a Index of 如果觉得下载比较繁琐 xff0c 我已经提供了CentOS7 4的安装包 链接 xff1a https pan baidu com s 1cRgNfZ5REf4LQ
  • Linux控制台命令结果返回,bash的命令执行状态返回值及命令行展开详解

    命令执行状态返回值及命令行展开是bash的2个基本特性 xff0c 其详细特点及应用如下 xff1a 一 命令执行的状态结果 xff1a bash通过状态返回值来输出此结果 成功 xff1a 0 失败 xff1a 1 255 命令执行完成之
  • rtos和linux在内存管理上,freertos与linux区别

    freeRTOS是一个实时操作系统 xff0c 主要实现了任务调度 内存管理 IPC 中断管理这几个模块 xff0c 它要求快速的处理任务 xff0c gui 驱动框架 shell 这些都不是它的核心功能 xff0c 而且大部分情况下都不会
  • 如何远程连接MySQL数据库

    新安装的 MySQL 只有一个 root 用户 xff0c 默认不开启远程连接 下面以 Ubuntu 系统下的 MySQL 为例 xff0c 说明如何远程连接 MySQL 数据库 登录 root 用户 mysql uroot pyongdu
  • linux重启时无法关机,linux系统无法关机/重启

    机器型号 xff1a 戴尔380 系统 xff1a Linux操作系统 使用图形界面启动后 xff0c 在开始菜单里 xff0d 关机 xff0c 显示器 鼠标 键盘瞬间断电 xff0c 但是主机保持原状 xff0c 当ssh远程可以登录该
  • 卫星导航算法 --geo 库函数的学习

    博主自己在看px4源码时 xff0c 发现geo的好多库函数挺有意思的 xff0c 于是将其进行总结学习 库函数 xff1a 1 int map projection global reproject float x float y dou
  • pixhawk 源码分析-SPI驱动-MS5611

    最近学习了一下SPI的驱动软件 xff0c 在此将其进行总结 本文使用的代码为pixhawk 1 5 5版本的源码 源码下载地址 第一步函数入口 xff1a 老规矩 xff0c 所有px4的代码的函数入口都是在启动脚本中 xff0c 启动脚
  • ucosii内核总结

    博主最近一直在看有关ucosii的代码 xff0c 并将其成功移植到了正点原子STM32F103的开发板上 颇有一些收获 xff0c 于是将其总结下来与大家一起分享 本文不会向你介绍怎么移植ucos xff08 在STM32上移植ucos的