(学习日记)2024.05.07:UCOSIII第六十一节:User文件夹函数概览(uCOS-III->Source文件夹)第七部分

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2024.05.07:UCOSIII第六十一节:User文件夹函数概览(uCOS-III->Source文件夹)第七部分

  • 六十七、UCOSIII:User文件夹函数概览(uCOS-III->Source文件夹)第七部分
    • 5、uCOS-III文件夹
      • Source文件夹
        • os_tick.c文件
          • OS_TickTask
          • OS_TickTaskInit
          • OS_TickListInit
          • OS_TickListInsert
          • OS_TickListRemove
          • OS_TickListResetPeak
          • OS_TickListUpdate
        • os_time.c文件
          • OSTimeDly
          • OSTimeDlyHMSM
          • OSTimeDlyResume
          • OSTimeGet
          • OSTimeSet
          • OSTimeTick
        • os_tmr.c文件
          • OSTmrCreate
          • OSTmrDel
          • OSTmrRemainGet
          • OSTmrStart
          • OSTmrStateGet
          • OSTmrStop
          • OS_TmrClr
          • OS_TmrDbgListAdd 和 OS_TmrDbgListRemove
          • OS_TmrInit
          • OS_TmrLink
          • OS_TmrResetPeak
          • OS_TmrUnlink
          • OS_TmrTask
        • os_type.h文件
        • os_var.c文件

六十七、UCOSIII:User文件夹函数概览(uCOS-III->Source文件夹)第七部分

5、uCOS-III文件夹

在这里插入图片描述

Source文件夹

这些文件通常是 Micrium OS (UC/OS-III) 内核的核心文件,提供了操作系统的各种基本功能和特性。
在这里插入图片描述

os_tick.c文件

os_tick.c 实现了 UC/OS-III 内核中的系统时钟节拍功能。
包括了时钟节拍计数器的初始化、更新、中断处理等操作的具体实现。
时钟节拍用于系统的时间管理,它确定了系统的时间分辨率和任务调度的粒度,是实现实时多任务调度的基础。

OS_TickTask
  • 功能:这个函数是时钟任务,它不断地等待来自时基中断的信号,当接收到信号后,更新任务的等待时间,以便调度器可以及时地调度任务。
  • 参数:这个函数没有外部参数,但是在函数内部使用了局部变量p_arg,用于预防编译警告,但实际上没有被使用。
  • 其他:
    通过调用OSTaskSemPend等待来自时基中断的信号。
    如果接收到信号,且操作系统正在运行,则调用OS_TickListUpdate更新所有任务的等待时间。
OS_TickTaskInit
  • 功能:初始化时钟任务。
  • 参数:这个函数接收一个指向错误码的指针p_err,用于返回错误类型。
  • 其他:
    设置全局变量OSTickCtr为0,清除时钟计数器。
    调用OS_TickListInit初始化时钟列表。
    创建时钟任务,分配任务控制块和堆栈。
OS_TickListInit
  • 功能:初始化时钟列表。
  • 参数:这个函数没有参数。
  • 其他:
    遍历时钟轮中的所有刻度,将每个刻度的任务指针设置为NULL,以及元素数目初始化为0。
OS_TickListInsert
  • 功能:将任务插入时钟列表中,以便在指定时间后调度任务。
  • 参数:
    p_tcb:指向任务控制块的指针。
    time:指定的时间。
    opt:选项,用于指定如何计算时间。
    p_err:返回错误类型的指针。
  • 其他:
    根据指定的时间和选项,计算任务的匹配点和剩余等待时间。
    根据任务的匹配点确定插入到哪个时钟轮的刻度中。
    将任务插入到指定刻度的任务链表中,并更新任务之间的关系,同时更新该刻度的元素数目。
OS_TickListRemove
  • 功能:从时钟列表中移除任务。
  • 参数:这个函数接收一个指向任务控制块的指针p_tcb。
  • 其他:
    根据任务的指针获取其所在的时钟节拍列表。
    如果任务确实在时钟节拍列表中,则将其从列表中移除,并更新任务之间的关系。
    清空任务的延时等待时间和相关的指针,将其从时钟节拍列表中移除,并将该节拍列表中的元素数目减一。
OS_TickListResetPeak
  • 功能:重置时钟列表中每个刻度的峰值检测器。
  • 参数:这个函数没有参数。
  • 其他:
    遍历时钟轮中的所有刻度,将每个刻度的峰值检测器重置为0。
OS_TickListUpdate
  • 功能:更新时钟列表,处理等待超时或延时到期的任务。
  • 参数:这个函数没有参数。
  • 其他:
    获取当前时间戳,增加时钟节拍计数器,计算当前所在的时钟节拍列表。
    遍历时钟节拍列表中的任务,根据任务的状态进行相应处理:
    如果任务处于延时状态,检查任务是否已经到期,如果到期则将任务状态设置为就绪状态并从列表中移除。
    如果任务处于有期限等待状态,检查任务是否已经到期,如果到期则将任务状态设置为就绪状态并从列表中移除。
    如果任务处于延时被挂起状态或有期限等待被挂起状态,检查任务是否已经到期,如果到期则将任务状态设置为被挂起状态并从列表中移除。
    更新任务的剩余等待时间,并记录任务等待的时间戳。
    根据执行时间更新最大运行时间。
    退出临界段。
os_time.c文件

os_time.c 实现了 UC/OS-III 内核中的时间管理功能。
包括了系统时钟的初始化、获取当前系统时间、延时等操作的具体实现。
时间管理模块用于处理系统的时间相关功能,如延时、定时等,确保任务按照预定的时间顺序执行。

OSTimeDly

void OSTimeDly(OS_TICK dly, OS_OPT opt, OS_ERR *p_err)
这个函数的作用是让当前任务延时一段时间。

参数包括:
dly: 延时的时钟节拍数。
opt: 选项,决定延时的类型。
p_err: 返回错误类型的指针。
在函数的实现中,首先对参数进行了检查,包括检查是否在中断中调用、是否任务被锁、选项是否合法等。然后根据选项类型执行相应的延时操作,最后将当前任务从就绪列表移除,插入到延时列表中,然后执行任务调度。

OSTimeDlyHMSM

void OSTimeDlyHMSM(CPU_INT16U hours, CPU_INT16U minutes, CPU_INT16U seconds, CPU_INT32U milli, OS_OPT opt, OS_ERR *p_err)
这个函数的作用和 OSTimeDly 类似,但是参数更具体化,可以直接指定时、分、秒、毫秒来进行延时。

在函数的实现中,首先对参数进行了检查,包括检查是否在中断中调用、是否任务被锁、选项是否合法等。然后根据选项类型计算延时的时钟节拍数,最后执行延时操作。

OSTimeDlyResume

void OSTimeDlyResume(OS_TCB *p_tcb, OS_ERR *p_err)
这个函数的作用是终止一个延时的任务,使其立即变为就绪状态。

  • 参数包括:
    p_tcb: 要终止延时的任务控制块。
    p_err: 返回错误类型的指针。
    在函数的实现中,首先对参数进行了检查,包括检查任务是否为空、是否在中断中调用等。然后根据任务的状态进行不同的处理,如果任务处于延时状态,则将其从延时列表中移除,并插入到就绪列表中,最后执行任务调度。
OSTimeGet

OS_TICK OSTimeGet(OS_ERR *p_err)

  • 参数:
    p_err: 一个指向 OS_ERR 类型的指针,用于返回错误码,如果没有错误则为 OS_ERR_NONE。
  • 返回值:
    OS_TICK: 当前的时钟节拍计数值。
OSTimeSet

void OSTimeSet(OS_TICK ticks, OS_ERR *p_err)

  • 参数:
    ticks: 要设置的时钟节拍计数值。
    p_err: 一个指向 OS_ERR 类型的指针,用于返回错误码,如果没有错误则为 OS_ERR_NONE。
  • 返回值:
    无(void)。
OSTimeTick

void OSTimeTick(void)

  • 参数:
    无。

  • 返回值:
    无(void)。

  • OSTimeTick函数的逻辑解释:
    OSTimeTick 函数用于处理系统的时钟节拍事件。
    首先调用 OSTimeTickHook 函数,这是一个用户可定义的钩子函数,可以用于在时钟节拍到来时执行特定的操作。
    然后根据系统配置,可能会执行以下操作:
    如果启用了中断发送延迟(OS_CFG_ISR_POST_DEFERRED_EN > 0u),则将任务就绪信息发送到中断队列中,稍后由中断服务例程处理。
    如果禁用了中断发送延迟,则直接将任务就绪信息发送给时钟节拍任务(OSTickTask)。
    如果启用了时间片轮转调度(OS_CFG_SCHED_ROUND_ROBIN_EN > 0u),则检查当前任务的时间片是否耗尽,如果是,则切换到同优先级的其他任务运行。
    如果启用了软件定时器(OS_CFG_TMR_EN > 0u),则更新软件定时器的计数器,如果计数器减至0,则发送信号给软件定时器任务(OSTmrTask)。

os_tmr.c文件

os_tmr.c 实现了 UC/OS-III 内核中的定时器功能。
包括了定时器的创建、启动、停止、删除等操作的具体实现。
定时器用于在指定的时间间隔内执行特定的任务或事件,是实现系统定时功能的重要组成部分。

OSTmrCreate

此函数用于创建定时器。它接受多个参数,包括定时器控制块指针 p_tmr、定时器名称指针 p_name、初始延迟时间 dly、周期时间 period、选项 opt、定时器到期时的回调函数指针 p_callback 和传递给回调函数的参数指针 p_callback_arg。函数将指定的参数值写入定时器控制块中,并根据指定的选项进行不同的操作。如果函数执行成功,将错误类型指针 p_err 设置为 OS_ERR_NONE,否则设置为相应的错误类型。

OSTmrDel

此函数用于删除定时器。它接受定时器控制块指针 p_tmr 和错误类型指针 p_err 作为参数。函数首先进行参数检查,然后根据定时器的状态进行相应的处理,包括从定时器链表中移除定时器、清除定时器的状态并解锁调度器。如果函数执行成功,将错误类型指针 p_err 设置为 OS_ERR_NONE,否则设置为相应的错误类型。

OSTmrRemainGet

此函数用于获取定时器剩余时间。它接受定时器控制块指针 p_tmr 和错误类型指针 p_err 作为参数。函数根据定时器的状态计算定时器剩余时间,并返回该值。如果函数执行成功,将错误类型指针 p_err 设置为 OS_ERR_NONE,否则设置为相应的错误类型。

OSTmrStart

此函数用于启动定时器。它接受定时器控制块指针 p_tmr 和错误类型指针 p_err 作为参数。函数根据定时器的状态进行相应的处理,包括从定时器链表中移除定时器并重新插入到定时器链表中。如果函数执行成功,将错误类型指针 p_err 设置为 OS_ERR_NONE,否则设置为相应的错误类型。

OSTmrStateGet

此函数用于获取定时器的状态。它接受定时器控制块指针 p_tmr 和错误类型指针 p_err 作为参数。函数首先进行参数检查,然后获取定时器的状态并根据状态设置错误类型。最后返回定时器的状态。

OSTmrStop

此函数用于停止定时器。它接受定时器控制块指针 p_tmr、选项 opt、传递给回调函数的新参数 p_callback_arg 和错误类型指针 p_err 作为参数。函数根据定时器的状态和选项进行相应的处理,包括从定时器链表中移除定时器、执行回调函数等。最后返回执行结果。

OS_TmrClr

此函数用于清除定时器的字段。它接受定时器控制块指针 p_tmr 作为参数,并将定时器的各个字段重置为初始值。

OS_TmrDbgListAdd 和 OS_TmrDbgListRemove

这两个函数用于调试,用于将定时器添加到调试链表或从调试链表中移除定时器。调试链表用于跟踪定时器的状态和调试信息。

OS_TmrInit

此函数用于初始化定时器模块。它接受一个指向错误类型的指针 p_err。函数首先进行安全性检查,然后根据配置的定时器任务频率计算定时器更新计数器 OSTmrUpdateCnt。接着初始化其他相关的计数器和变量,并创建定时器任务。

OS_TmrLink

此函数用于将定时器链接到定时器轮中。它接受一个指向定时器控制块的指针 p_tmr 和一个选项 opt。函数首先确定定时器的匹配时间,并根据选项将定时器插入到合适的定时器轮中。

OS_TmrResetPeak

此函数用于重置定时器轮中每个轮子的最大成员数。它简单地将每个轮子的最大成员数设置为零。

OS_TmrUnlink

此函数用于将定时器从定时器轮中解除链接。它接受一个指向定时器控制块的指针 p_tmr。函数首先根据定时器的匹配时间确定定时器所在的轮子,然后将定时器从轮子中移除。

OS_TmrTask

此函数是定时器任务的主要函数。它接受一个指向参数的指针,该参数当前未使用。函数在一个循环中等待定时器任务信号,然后锁定调度器并更新定时器轮中的定时器状态。在每次循环中,它会检查定时器是否到期,如果到期,则执行相应的回调函数并将定时器从定时器轮中移除。

os_type.h文件

os_type.h 是 UC/OS-III 内核中使用的数据类型定义和宏定义的头文件。
定义了 UC/OS-III 内核中使用的各种数据类型、常量和宏,以及一些平台相关的配置选项。
提供了对于 UC/OS-III 内核的跨平台支持,使得代码可以在不同的处理器架构上移植和使用。

os_var.c文件

os_var.c 实现了 UC/OS-III 内核中的全局变量和内存区域的管理。
包括了全局变量的初始化、内存区域的分配和释放等操作的具体实现。
全局变量和内存区域管理模块用于管理 UC/OS-III 内核中的全局数据和动态内存,确保数据的正确性和一致性。

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

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

相关文章

RISC-V CVA6 在 Linux 下相关环境下载与安装

RISC-V CVA6 在 Linux 下相关环境下载与安装 所需环境与源码下载 CVA6 源码下载 首先,我们可以直接从 GitHub 一次性拉取所有源码: git clone --recursive https://github.com/openhwgroup/cva6.git如果这里遇到网络问题,拉取失败&#x…

error while loading shared libraries: libstdc++.so.6

/home/rtlinux/Linux/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/../libexec/gcc/arm-none-linux-gnueabi/4.4.3/cc1: error while loading shared libraries: libstdc.so.6: cannot open shared object file: No such file or directory 解决: s…

Fluent.Ribbon创建Office的RibbonWindow菜单

链接: Fluent.Ribbon文档 优势: 1. 可以创建类似Office办公软件的复杂窗口; 2. 可以应用自定义主题风格界面

实现 <el-cascader> 组件的回显功能

vue A页面&#xff0c;用户填写了el-cascader多层级数据&#xff0c;层级list数据从接口获取&#xff1b; vue B页面&#xff0c;多层级数据要进行回显&#xff0c;接口给到的数据是value值&#xff1b; 直接看demo <template><div><el-cascaderv-model"…

android studio 编译一直显示Download maven-metadata.xml

今天打开之前的项目的时候遇到这个问题:android studio 编译一直显示Download maven-metadata.xml, AI 查询 报错问题&#xff1a;"android studio 编译一直显示Download maven-metadata.xml" 解释&#xff1a; 这个错误通常表示Android Studio在尝试从Maven仓库…

xpath获取JavaScript内容

xpath获取JavaScript内容 常见的网站中有使用 JavaScript 动态生成的网页内容 此时用 request 获取到的网页内容可能是这样 <span class"datetime" id"date"></span></div> <script type"text/javascript">$(function…

Windows平台下使用CMake+Boost构建C++程序

1.创建工程结构如下 Boost/ CMakeLists.txt Python/ build/ src/Boost目录是通过b2.exe install编译安装后产生的头文件和库文件包 2.将Boost添加到系统环境变量中 添加Boost_INCLUDE_DIR环境变量&#xff1a; 变量名&#xff1a;Boost_INCLUDE_DIR 变量值&#xff1a;C…

ReactJS中使用TypeScript

TypeScript TypeScript 实际上就是具有强类型的 JavaScript&#xff0c;可以对类型进行强校验&#xff0c;好处是代码阅读起来比较清晰&#xff0c;代码类型出现问题时&#xff0c;在编译时就可以发现&#xff0c;而不会在运行时由于类型的错误而导致报错。但是&#xff0c;从…

【个人博客搭建】(13)SqlSugar仓储实现

前边项目搭建了仓储层。但是还未使用。 这里&#xff0c;我们带来的就是简单的仓储实现》 1、创建Repository类&#xff1a; public class Repository<T> : SimpleClient<T> where T : class, new(){public Repository(ISqlSugarClient db){base.Context db;}//…

中国各银行流动性比例数据集(2000-2022年)

01、数据简介 银行流动性比例是指银行的流动性资产期末余额与流动性负债期末余额之比&#xff0c;用于衡量银行流动性的总体水平。这个比例越高&#xff0c;表明银行偿还短期债务的能力越强&#xff0c;流动性风险越小。 本数据覆盖到城市商业银行、城镇银行、大型商业银行、…

NX二次开发直接加载dlx(不用加载到菜单)

一、概述 在NX二次开发中我们开发一个组合功能时常常会用到UI界面&#xff0c;在查看开发效果时必须将dlx和dll放置到Application目录中通过调用菜单&#xff0c;然后可以预览&#xff1b;当然在VS中切换dll生成路径&#xff0c;这样可以避免来回重复将dll放置到Application目录…

vue+vue-qr生成带logo的二维码并自动下载

1.安装 vue-qr组件&#xff1a; yarn vue-qr --save 或者 npm install vue-qr --save2.页面挂载使用&#xff1a;&#xff08;也可以在main.js全局挂载&#xff09; 单页面引入: import vueQr from vue-qr; export default {components: {vueQr}, }3.全局挂载引入: import …

张小泉签约实在智能,用实在Agent打造自动化高

在不少老杭州人的童年记忆里&#xff0c;妈妈裁剪衣服、料理食材、修剪各种物品&#xff0c;用的都是张小泉刀剪。 近日&#xff0c;实在智能与“刀剪第一股”张小泉&#xff08;股票代码&#xff1a;301055.SZ&#xff09;正式达成合作&#xff0c;实在Agent数字员工助力张小…

【Godot4.2】自定义数字处理相关函数库 - myNum

概述 在编写myList类的时候&#xff0c;涉及了格式化显示有序列表的序号问题&#xff0c;于是编写出了一套新的函数库myNum&#xff0c;用于方便的处理整数或浮点数格式化。 初期只加入了几个简单函数&#xff0c;后续会加入十、十六、二进制转化以及科学计数法等内容。&…

正则表达式(Regular Expression)详解

一、简介 正则表达式(Regular Expression)是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母、数字&#xff09;和特殊字符&#xff08;\、&#xff1f;、[等&#xff09;&#xff0c;可以用来描述和匹配字符串的特定模式。正则表达式提供…

【工具】-根源上解决VScode打印输出乱码的问题

目录 1 第一步&#xff1a; 改编译命令&#xff0c;保持一致2 第二步&#xff1a; 更改VScode的编码格式-保持一致 1 第一步&#xff1a; 改编译命令&#xff0c;保持一致 看一下你的控制台的编译的命名后缀&#xff0c;有两个关键的参数&#xff0c;如下图&#xff1a; “-f…

不同路径 1 2

class Solution {public int uniquePaths(int m, int n) {int[][] dpnew int[m][n];//记录到每个格子有多少种路径for(int i0;i<m;i) dp[i][0]1;for(int j0;j<n;j) dp[0][j]1;//初始化for(int i1;i<m;i){for(int j1;j<n;j){dp[i][j]dp[i-1][j]dp[i][j-1];}}return …

C++—DAY4

在Complex类的基础上&#xff0c;完成^&#xff0c;<<&#xff0c;>>&#xff0c;~运算符的重载 #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){}Complex(int rel,int vir):rel(rel),vir(vir){}void show(){c…

深度学习中的熵、交叉熵、相对熵(KL散度)、极大释然估计之间的联系与区别

熵的最初来源于热力学。在热力学中&#xff0c;熵代表了系统的无序程度或混乱程度&#xff0c;也可以理解为系统的热力学状态的一种度量。后来被广泛引用于各个领域中&#xff0c;如信息学、统计学、AI等&#xff0c;甚至社会学当中。接下来将大家领略一下深度学习中熵的应用。…

深度学习框架TensorFlow和PyTorch的选取

大家好&#xff0c;当涉及到深度学习框架时&#xff0c;TensorFlow和PyTorch是最受欢迎的两个选择。它们都是功能强大的开源库&#xff0c;使开发人员和研究人员能够构建和训练用于各种应用的神经网络。本文将探讨TensorFlow和PyTorch之间的主要区别&#xff0c;帮助你做出明智…