UCOS-III

2023-05-16

一、UCOSIII 简介

UCOSIII 是一个可裁剪、可固化、可剥夺的多任务系统,没有任务数目的限制,是 UCOS
的第三代内核,UCOSIII 有以下几个重要的特性:

可剥夺多任务管理UCOSIII 和 UCOSII 一样都属于可剥夺的多任务内核,总是执行当前
就绪的最高优先级任务
同优先级任务的时间片轮转调度:这个是 UCOSIII 和 UCOSII 一个比较大的区别,UCOSIII
允许一个任务优先级被多个任务使用,当这个优先级处于最高就绪态的时候,UCOSIII 就会轮
流调度处于这个优先级的所有任务,让每个任务运行一段由用户指定的时间长度,叫做时间片。
极短的关中断时间UCOSIII 可以采用锁定内核调度的方式而不是关中断的方式来保护临
界段代码,这样就可以将关中断的时间降到最低,使得 UCOSIII 能够非常快速的响应中断请求。
任务数目不受限制:UCOSIII 本身是没有任务数目限制的,但是从实际应用角度考虑,任
务数目会受到 CPU 所使用的存储空间的限制,包括代码空间和数据空间。
优先级数量不受限制:UCOSIII 支持无限多的任务优先级。
内核对象数目不受限制:UCOSIII 允许定义任意数目的内核对象。内核对象指任务、信号
量、互斥信号量、事件标志组、消息队列、定时器和存储快等。
软件定时器:用户可以任意定义“单次”和“周期”型定时器,定时器是一个递减计数器,
递减到零就会执行预先定义好的操作。每个定时器都可以指定所需操作,周期型定时器在递减
到零时会执行指定操作,并自动重置计数器值。
同时等待多个内核对象:UCOSIII 允许一个任务同时等待多个事件。也就是说,一个任务
能够挂起在多个信号量或消息队列上,当其中任何一个等待的事件发生时,等待任务就会被唤
醒。
直接向任务发送信号:UCOSIII 允许中断或任务直接给另一个任务发送信号,避免创建和
使用诸如信号量或事件标志等内核对象作为向其他任务发送信号的中介,该特性有效地提高了
系统性能。
直接向任务发送消息:UCOSIII 允许中断或任务直接给另一个任务发送消息,避免创建和
使用消息队列作为中介。
任务寄存器:每个任务都可以设定若干个“任务寄存器”,任务寄存器和 CPU 硬件寄存器
是不同的,主要用来保存各个任务的错误信息,ID 识别信息,中断关闭时间的测量结果等。
任务级时钟节拍处理:UCOSIII 的时钟节拍是通过一个专门任务完成的,定时中断仅触发
该任务。将延迟处理和超时判断放在任务级代码完成,能极大地减少中断延迟时间。
防止死锁:所有 UCOSIII 的“等待”功能都提供了超时检测机制,有效地避免了死锁。
时间戳:UCOSIII 需要一个 16 位或 32 位的自由运行计数器(时基计数器)来实现时间测
量,在系统运行时,可以通过读取该计数器来测量某一个事件的时间信息。例如,当 ISR 给任
务发送消息时,会自动读取该计数器的数值并将其附加在消息中。当任务读取消息时,可得到
该消息携带的时标,这样,再通过读取当前的时标,并计算两个时标的差值,就可以确定传递
这条消息所花费的确切时间。

二、移植文件

2.1.滴答定时器 Systick

滴答定时器是一个 24 位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装
载定时器初值,只要不把它在 SysTick 控制以及状态寄存器中的使能位清零,就将永久不息。SysTick 的最大使命,就是定期地产生异常请求作为系统的时基。OS 都需要这种“滴答”来推动任务和时间的管理。

//初始化延迟函数
//当使用 ucos 的时候,此函数会初始化 ucos 的时钟节拍
//SYSTICK 的时钟固定为 HCLK 时钟的 1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_UCOS//如果需要支持 OS.
    u32 reload;
#endif
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部时钟 HCLK/8
    fac_us=SYSCLK/8;//为系统时钟的 1/8
#if SYSTEM_SUPPORT_UCOS//如果需要支持 OS.
    reload=SYSCLK/8;
    //每秒钟的计数次数 单位为 K
    reload*=1000000/delay_tickspersec;
    //根据 OS_TICKS_PER_SEC 设定溢出时间
    //reload 为 24 位寄存器,最大值:16777216,在
    //72M 下,约合 1.86s 左右
    fac_ms=1000/delay_tickspersec;
    //代表 ucos 可以延时的最少单位
    SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启 SYSTICK 中断
    SysTick->LOAD=reload;
    //每 1/OS_TICKS_PER_SEC 秒中断一次
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启 SYSTICK
#else
    fac_ms=(u16)fac_us*1000;
    //非 ucos 下,代表每个 ms 需要的 systick 时钟数
#endif

SysTick 的中断服务函数 SysTick_Handler()

//systick 中断服务函数,使用 ucos 时用到
void SysTick_Handler(void)
{
    if(delay_osrunning==1)//OS 开始跑了,才执行正常的调度处理
    {
        OSIntEnter();//进入中断
        OSTimeTick();//调用 ucos 的时钟服务程序
        OSIntExit();//触发任务切换软中断
    }
}

2.2os_cpu_a.asm 文件详解(暂且跳过,粗略看了一下)

IMPORT OSRunning
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSIntNesting
IMPORT OSIntExit
IMPORT OSTaskSwHook

EXPORT OSStartHighRdy
EXPORT OSCtxSw
EXPORT OSIntCtxSw
EXPORT OS_CPU_SR_Save
EXPORT OS_CPU_SR_Restore
EXPORT PendSV_Handler

2.3os_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 int INT32U;        //无符号 32 位数
typedef signed int INT32S;          //有符号 32 位数
typedef float FP32;                 //单精度浮点数
typedef double FP64;                //双精度浮点数

//STM32 是 32 位位宽的,这里 OS_STK 和 OS_CPU_SR 都应该为 32 位数据类型
typedef unsigned int OS_STK;        //OS_STK 为 32 位数据,也就是 4 字节
typedef unsigned int OS_CPU_SR;     //默认的 CPU 状态寄存器大小 32 位

//定义栈的增长方向.
//CM3 中,栈是由高地址向低地址增长的,所以 OS_STK_GROWTH 设置为 1
#define OS_STK_GROWTH 1 //堆栈增长方向
//任务切换宏,由汇编实现.
#define OS_TASK_SW() OSCtxSw()
//OS_CRITICAL_METHOD = 1 :直接使用处理器的开关中断指令来实现宏
//OS_CRITICAL_METHOD = 2 :利用堆栈保存和恢复 CPU 的状态
//OS_CRITICAL_METHOD = 3 :利用编译器扩展功能获得程序状态字,保存在局部变量 cpu_sr
#define OS_CRITICAL_METHOD 3
//进入临界段的方法

#if OS_CRITICAL_METHOD == 3
    #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
    #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
#endif

2.4os_cpu_c.c 文件详解 

OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
    OS_STK *stk;
    (void)opt; //opt 未使用
    stk = ptos;
    // Load stack pointer
    *(stk) = (INT32U)0x01000000L;
    //xPSP
    *(--stk) = (INT32U)task;
    //PC
    *(--stk) = (INT32U)OS_TaskReturn; //R14
    *(--stk) =(INT32U)0x12121212L; //R12
    *(--stk) = (INT32U)0x03030303L;
    //R3
    *(--stk) = (INT32U)0x02020202L;
    //R2
    *(--stk) = (INT32U)0x01010101L;
    //R1
    *(--stk) = (INT32U)p_arg;
    //R0
    *(--stk) = (INT32U)0x11111111L; //R11
    *(--stk) = (INT32U)0x10101010L;
    //R10
    *(--stk) = (INT32U)0x09090909L; //R9
    *(--stk) = (INT32U)0x08080808L; //R8
    *(--stk) = (INT32U)0x07070707L; //R7
    *(--stk) = (INT32U)0x06060606L; //R6
    *(--stk) = (INT32U)0x05050505L; //R5
    *(--stk) = (INT32U)0x04040404L; //R4
    return (stk);
}


总结

简单的系统移植下载验证

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

UCOS-III 的相关文章

  • 代码随想录算法训练营第四十八天| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

    文章目录 198 打家劫舍213 打家劫舍II337 打家劫舍III 198 打家劫舍 题目链接 xff1a 代码随想录 解题思路 xff1a 1 dp i xff1a 考虑下标i xff08 包括i xff09 以内的房屋 xff0c 最
  • freertos和ucos的区别

    一 freeRTOS比uCOS II优胜的地方 xff1a 1 内核ROM和耗费RAM都比uCOS 小 xff0c 特别是RAM 这在单片机里面是稀缺资源 xff0c uCOS至少要5K以上 xff0c 而freeOS用2 3K也可以跑的很
  • linux与freertos区别,谈谈uCOS和freeRTOS这两种实时系统的结构以及编程思想

    距离上次总结 xff0c 已经过去有差不多半年了 xff0c 最近又到了自己半年一次的总结了 首先说说自己的编程风格的变化 xff0c 在上一篇 第三篇文 中提到的数据结构 配置文件结构 预编译结构 xff0c 目前已经逐渐适应 xff0c
  • LeetCode437:路径总和III

    要求 给定一个二叉树的根节点 root xff0c 和一个整数 targetSum xff0c 求该二叉树里节点值之和等于 targetSum 的 路径 的数目 路径 不需要从根节点开始 xff0c 也不需要在叶子节点结束 xff0c 但是
  • uCOS上下文切换,PendSV中断函数

    摘自 xff1a http www stmcu org module forum thread 384142 1 1 html 介绍一 xff1a 移植详解1和2中主要讲了移植需要用到的基础知识 xff0c 本文则对具体的移植过程进行介绍
  • 一步一步教你使用uCOS-II

    第一篇 UCOS介绍 第一篇 UCOS介绍 这个大家都知道 呵呵 考虑到咱们学习的完整性还是在这里唠叨一下 让大家再熟悉一下 高手们忍耐一下吧 xff01 uC OS II Micro Control Operation System Tw
  • STM32之RTOS:uCOS和FreeRTOS

    RTOS全称是 Real Time Operating System xff0c 中文就是实时操作系统 RTOS是指一类系统 xff0c 如 uC OS xff0c FreeRTOS xff0c RTX xff0c RT Thread 等
  • freeRTOS与ucos II区别

    freeRTOS比uCOS II优胜的地方 1 内核ROM和耗费RAM都比uCOS 小 xff0c 特别是RAM 这在单片机里面是稀缺资源 xff0c UCOS至少要5K以上 xff0c 而freeOS用2 3K也可以跑的很好 xff1b
  • uCOS任务信号量相关函数代码理解

    强调任务信号量思想 xff1a 任务信号量只是一个标志 xff0c 获取成功就是指把信号量计数值减1 xff1b 释放就是指把信号量计数值加1 xff08 溢出则计数值不变 xff09 获取信号量需要判断信号量是否可用 xff08 大于0
  • Huawei LiteOS与freeRTOS、Ucos主流嵌入式操作内核的区别

    LiteOS与freeRTOS Ucos主流嵌入式操作内核的区别 云社区 华为云
  • ucos iii 任务栈使用率统计方法

    第一步 使能任务统计功能 修改文件 os cfg h中的 OS CFG STAT TASK STK CHK EN宏 span class token comment TASK MANAGEMENT span span class token
  • UCOS-II时间管理

    uC OS II时间管理 xff1a 任务延时函数 xff0c OSTimeDly INT16U ticks 申请该服务的任务可以延时一段时间 xff0c 这段时间的长短是用时钟节拍的数目来确定的 实现这个系统服务的函数叫做 OSTimeD
  • UCOS消息队列的使用【转】

    UCOS消息队列的使用 转 收藏 消息队列的使用 1 需在以下文件中配置如下内容 OS CFG H OS MAX QS N 你需要的值 根据需要自己配置 define OS Q EN 1 Enable 1 or Disable 0 code
  • 【STM32】入门(十一):初识uCOS-III

    STM32 STM32单片机总目录 1 轮询 中断 多任务对比 2 什么是任务 如果您学过linux xff0c 那么任务可以理解为线程 在代码中的体现就是线程函数 xff0c 一个函数中有个无限循环函数 xff0c 并且永不返回 例如 x
  • μC/OS III - 任务调度 Ⅰ:调度过程和调度点

    这是 C OS III任务调度的第一篇文章 xff1a 调度过程和调度点 基于Cortex M系列的处理器 xff0c 从最简单的创建任务开始 xff0c 分析 C OS III的任务调度过程 包括上下文切换的详细过程 任务的栈分配详情 引
  • (转)ucos的事件 任务的通讯和同步 信号量 互斥量 消息邮箱 消息队列

    这会想了想 xff0c 在复习资料后 xff0c 最后再做个核心代码分析 ucos中使用信号量 消息邮箱 消息队列 xff0c 这些数据结构来作为通信中间媒介 这些数据结构会影响任务的程序流程 xff0c 因此也叫做事件 一 信号量 是进行
  • ucos信号量集

    事件标志组 信号量集 的使用 xff1a span class token keyword static span OS STK task testled span class token punctuation span STARTUP
  • UC/OS-III 消息队列

    消息队列 一 消息队列基本概念讲解1 消息队列基本概念2 消息池2 1 消息池概念2 2 消息池初始化2 3 消息队列的运作机制2 4 消息队列的阻塞机制2 5 消息队列的应用场景 二 消息队列创建步骤1 定义消息队列2 创建消息队列 三
  • STM32滴答定时器与UCOS时钟系统,以及心跳和延时函数的实现.

    Systick就是一个定时器而已 只是它放在了NVIC中 主要的目的是为了给操作系统提供一个硬件上的中断 号称滴答中断 滴答中断 这里来简单地解释一下 操作系统进行运转的时候 也会有 心跳 它会根据 心跳 的节拍来工作 把整个时间段分成很多
  • Micriμm μC/OS-III RTOS 中的分配和释放

    我们使用 Micrium 的 C OS III RTOS 和 Renesas 的 RX62N 我们构建了一个必须动态分配和释放数据的系统 我们发现了功能malloc and free 与 RTOS 配合得不好 然而 RTOS 为此提供了一个

随机推荐

  • 平衡小车的资料

    根据网上平衡小车之家的资料引脚需要用 xff1a LED PA12 Key PA15 OLED RST Clr PC13 RS Clr PB4 SCLK Clr PC15 SDIN Clr PC14 ADC PA4 TIM3 PB0 PB1
  • 注解

    好处 把问题暴露在编译时期 xff1b 增强程序健壮性 xff1b 可以让JVM检查除了语法错误以外的其他的自定义检查 xff1b 位置 可以加到包 xff0c 类 xff0c 方法 xff0c 字段 xff0c 局部变量等位置 xff1b
  • 【知识图谱】课程笔记1---知识图谱简介

    1 知识图谱 知识图谱是一种基于图的数据结构 由节点 point 和边 Edge 组成 每个节点表示一个 实体 每条边为实体与实体之间的 关系 知识图谱本质上是语义网络 通过这种先验的知识网络 xff0c 让机器像人类一样可以联想 推理 它
  • 特征检测+SIFT点匹配+PNP位姿确定

    SIFT特征检测 43 FLANN点匹配 43 PNP位姿确定 软件环境 windows 10 vs2013 opencv3 1 0 43 opencv3 1 0 contrib 基本原理 1 SIFT 特征点检测 43 匹配 2 PNP位
  • STM32CUBEIDE(MX续)学习笔记(七)——FREERTOS+DMA+队列+循环数组方式进行串口收发

    一 收发主要逻辑 1 接收 xff1a 利用DMA和空闲中断一次接收一帧的不定长数据 xff0c 接收到数据后 暂停 xff08 之后分析为何要暂停而不是停止 xff09 DMA xff0c 快速利用结构体存储接收到数据的地址和长度 xff
  • C语言 malloc() + 结构体指针定义结构体变量

    之前在学习链表的过程中 xff0c 笔者认为新节点必须如下定义 xff1a struct Node p struct Node int val p pNext int main Node Node1 Node Node2 Node Node
  • Windows JDK8 安装

    Windows JDK8 安装 准备步骤安装完成 准备 准备jdk8 官网下载 xff1a https www oracle com java technologies javase javase jdk8 downloads html 根
  • openmv与其他单片双向串口通信

    Openmv与其他单片双向串口通信 目的 为了让openmv进行阈值切换或者只运行某一部分代码 xff0c 因此需要openmv与其他单片建立双向通信进行更改内部参数 起因 openmv自带接收函数uart read 进行接收 xff0c
  • 树莓派学习笔记4-opencv网络图传-1

    前记 为了实现QT编写的上位机显示下位机树莓派的opencv实时画面 xff0c 因此需要进行opencv的网络图传 xff0c 包括以下内容 1 QT编写TCP服务端并配置opencv显示摄像头画面 2 python网络编程客户端发送op
  • Ubuntu学习笔记5-安装Arduino及ros配置

    Ubuntu学习笔记5 安装Arduino及ros配置 前言 由于需要编写ESP32代码作为ros下位机使用 xff0c 顺带想体验一下ubuntu下开发 xff0c 因此在ubutnu20 04上安装Arduino并测试 xff0c 不过
  • OpenStack部署(五)

    部署版本 xff1a pike 部署环境 xff1a CentOS7 6 配置文件中所有controller可修改为控制节点ip地址 配置过程中使用 echo 验证命令执行情况 Networking service 安装与配置neutron
  • 爬虫要违法了吗?小编告诉大家:守住规则,大胆去爬

    最近我学习和实践网络爬虫 xff0c 总想着在这儿抓点数据在那儿抓点数据 但不知为什么 xff0c 抓取别人网站数据时 xff0c 总会产生莫名恐慌生怕自己一不小心就侵权了 xff0c 然后被关在监狱摩擦 所以我想现在这个时候 xff0c
  • CXF开发总结

    CXF开发总结 xff08 3种模式 xff09 基于SOAP Server端开发 导包 xff0c 下载cxf包 xff0c 地址http cxf apache org xff0c 导入eclipse为web service服务提供类定义
  • 年度最受欢迎的Python的书籍,还不来看看!

    Python是一种通用的解释型编程 xff0c 主要用于Web开发 机器学习和复杂数据分析 Python对初学者来说是一种完美的语言 xff0c 因为它易于学习和理解 xff0c 随着这种语言的普及 xff0c Python程序员的机会也越
  • Html5下载功能实现

    downloader模块管理网络文件下载任务 xff0c 用于从服务器下载各种文件 xff0c 并支持跨域访问操作 通过plus downloader获取下载管理对象 Downloader下载使用HTTP的GET POST方式请求下载文件
  • 卡尔曼滤波总结(KF、EKF、UKF)

    1 马尔科夫 参考 xff1a https zhuanlan zhihu com p 489239366 2 协方差矩阵 1 xff09 对于一个样本集合S xff0c 如果每个样本是一个n维空间中的一个列向量 xff0c 则使用协方差矩阵
  • Centos7搭建Squid代理服务器

    Centos7搭建Squid代理服务器 sumu s home 1 无需验证版 http 1 1 安装 yum install squid 1 2 修改配置文件 打开文件 vim etc squid squid conf修改 http ac
  • Python 3.6解决报错:'NoneType' object has no attribute 'decode'的办法

    for repo dict in repo dicts names append repo dict 39 name 39 plot dict 61 39 value 39 repo dict 39 stargazers count 39
  • 手把手教你实现ROS依赖任意第三方库+lpsolve求解整数线性规划问题为例

    How to link dynamic libraries use third party libraries in ROS lpsolve solver as examples 喜欢的话请关注 xff0c 欢迎github 给个小星星 g
  • UCOS-III

    一 UCOSIII 简介 UCOSIII 是一个可裁剪 可固化 可剥夺 的多任务系统 xff0c 没有任务数目的限制 xff0c 是 UCOS 的第三代内核 xff0c UCOSIII 有以下几个重要的特性 xff1a 可剥夺多任务管理 x