【UCOSIII源码阅读笔记】第一篇

别光看官方文档了!手把手带你拆解UCOSIII官方例程的源码结构(附文件功能速查表) 本文深入拆解UCOSIII官方例程的源码结构,提供详细的文件功能解析和实用速查表。从工程目录导航到内核源码解剖,再到硬件抽象层揭秘,帮助开发者快速掌握UCOSIII的核心架构和关键配置技巧,提升嵌入式开发效率。 阅读详情

消息队列相关设计架构

消息队列使用方式

创建消息队列:

OS_Q queue;                             //声明消息队列

/* 创建消息队列 queue */
OSQCreate ((OS_Q         *)&queue,            //指向消息队列的指针
           (CPU_CHAR     *)"Queue For Test",  //队列的名字
           (OS_MSG_QTY    )20,                //最多可存放消息的数目
           (OS_ERR       *)&err);             //返回错误类型

发布消息队列:

/* 发布消息到消息队列 queue */
OSQPost ((OS_Q        *)&queue,                            //消息变量指针
         (void        *)"Fire uC/OS-123",                //要发送的数据的指针,将内存块首地址通过队列“发送出去”
         (OS_MSG_SIZE  )sizeof ( "Fire uC/OS-123" ),     //数据字节大小
         (OS_OPT       )OS_OPT_POST_FIFO | OS_OPT_POST_ALL, //先进先出和发布给全部任务的形式
         (OS_ERR      *)&err);	                            //返回错误类型

其中的(void *)"Fire uC/OS-123"表示指向字符串的指针。
请求消息:

/* 请求消息队列 queue 的消息 */
pMsg = OSQPend ((OS_Q         *)&queue,                //消息变量指针
                (OS_TICK       )0,                     //等待时长为无限
                (OS_OPT        )OS_OPT_PEND_BLOCKING,  //如果没有获取到信号量就等待
                (OS_MSG_SIZE  *)&msg_size,             //获取消息的字节大小
                (CPU_TS       *)0,                     //获取任务发送时的时间戳
                (OS_ERR       *)&err);                 //返回错误
      
printf ( "\r\n接收消息的长度:%d字节,内容:%s\r\n", msg_size, pMsg );

架构分析

声明的消息队列OS_Q 的结构体内容如下:
在这里插入图片描述
其中包括PendList和MsgQ两个重要的结构体。
PendList用于在某个任务想要从OS_Q 中获取消息消息时,如果OS_Q 为空,则该任务被插入到PendList中排队,等待OS_Q 中消息的到来;当某个任务想要向OS_Q 发布消息时,如果看到这个OS_Q 的PendList中有任务在排队等待,则直接把消息给正在排队的任务。
MsgQ用于在某个任务想要向OS_Q 发布消息时,如果当前没有任务在这个OS_Q 上排队等消息,那么它就会把消息放到OS_Q 的MsgQ中;当某个任务想要从OS_Q 获取消息时,如果它发现OS_Q 的MsgQ中有消息,那么就直接从MsgQ中取走消息。
整个过程类似于学生去食堂买饭,食堂就是OS_Q ,学生排队区就是PendList,食品摆放区就是MsgQ,当一个学生来到看食品摆放区有食物时,他就直接拿走,没有就去排队区排队,当上饭阿姨上饭时发现有学生正在排队,阿姨就直接把饭给他,如果没有学生排队就把饭放在食品摆放区,等学生来拿。
ucosiii中消息队列的代码实现在os_q.c文件中,以发布消息为例,函数调用过程如下:
在这里插入图片描述
消息队列发布消息被分成3层,OSQPost()用于用户调用,主要对用户传入参数的正确性进行判断,OS_QPost()用于判断把消息放到MsgQ中还是直接给PendList中正在等待消息的任务,OS_MsgQPut()用于从消息池中取出一个消息,把他包装一下(设置一下消息指针、消息大小、消息时间戳)放到MsgQ,OS_Post()用于把消息给在PendList中等待的任务,并且将其从PendList中移除、唤醒。
与MsgQ有关的操作函数都封装在os_msg.c中,其中包括以下函数:
OS_MsgPoolInit():初始化消息池;
OS_MsgQFreeAll():把一个MsgQ上的所有消息放回到消息池中;
OS_MsgQInit():初始化MsgQ;
OS_MsgQGet:从MsgQ中获取一个消息;
OS_MsgQPut:把一个消息放到MsgQ中。

编程技巧

1、os_msg.c中维护一个消息池和所有的MsgQ,消息池把空闲消息用链表串起来,MsgQ把一个OS_Q 中正在使用的消息用链表串起来,如果在自己的项目中有类似的资源管理方式需求,可以参考os_msg.c,对资源进行申请和回收。
2、消息池结构体如下:

struct  os_msg_pool {                                       /* OS_MSG POOL                                            */
    OS_MSG              *NextPtr;                           /* Pointer to next message                                */
    OS_MSG_QTY           NbrFree;                           /* Number of messages available from this pool            */
    OS_MSG_QTY           NbrUsed;                           /* Current number of messages used                        */
    OS_MSG_QTY           NbrUsedMax;                        /* Peak number of messages used                           */
};

这种以Nbr开头的变量表示某种数量的形式可以参考;
消息结构体如下:

struct  os_msg {                                            /* MESSAGE CONTROL BLOCK                                  */
    OS_MSG              *NextPtr;                           /* Pointer to next message                                */
    void                *MsgPtr;                            /* Actual message                                         */
    OS_MSG_SIZE          MsgSize;                           /* Size of the message (in # bytes)                       */
    CPU_TS               MsgTS;                             /* Time stamp of when message was sent                    */
};

TS表示时间(time stamp),这种变量命名可以参考。

UCOS官网的UCOSiii官方源代码 立即下载

相关推荐

UCOS-III源代码

UCOS-III源代码

UCOSiii源码分析——os_task.c任务管理函数分析

ucos的任务处理相关的函数解析。

weixin_46199479的博客 4159

1. 官方 uCOS-III 源码.zip_fighteux_uCOS II_ucosiii源码_ucosii源码下载_ucos

官方UCOS-II源码,欢迎大家下载学习

(学习日记)2024.03.17:UCOSIII第十九节:源码介绍

2024.03.18 三十三、UCOSIII:源码介绍 1、下载源码 2、μC/OS-III源码文件介绍 1. EvalBoards 2. uC-CPU - cpu_c.h文件 - cpu_c.c文件与cpu_a.asm文件 - cpu_core.c - cpu_core.h - cpu_def.h 3. uC-LIB 4. μC/OS-III - os_cpu.h - oc_cpu_a.asm - os_cpu_c.c

一个放笔记的小书架 1544

通俗易懂的图解二叉搜索树、AVL树和红黑树

搜索是一种很常见的需求,当数据较多时,如何找到目标对象时,即需要搜索查找。 那么如何快速找到目标呢,最朴素的思想就是暴力查找,一个一个对比。 显然,当数据量增大时,我们需要优化查找方法获取更快的查找速度,我们可以通过维护一个有序数组,从而实现二分查找,查找速度从O(n)降为O(longn)。 但是数组并不便于插入和删除,链表便成为了最好的选择。 既然是采用二分查找,那么不如直接按照查找的步骤维护一种数据结构,于是二叉搜索树出现了。 二叉搜索树的性质为: 若左子树不为空,则左子树上所有节点值都小于根结点值;

暗色光的博客 758

PSpice 导入 LTspice 仿真实验 --(如何解决PSpice模型无法使用的错误)

参考了网上第三方器件导入LTspice的博客和资料,不论是哪个公司下载的SPICE模型导入LTspice的方法都类似。如果遇到导入报错的情况可以先看一下报错提示,如果通过语法修改实现功能的则说明可以进行仿真,当然性能可能与官方给的模型存在一点出入,但做一个基本的功能验证本人认为还是可以的,总比做出板子用不了或者完全不匹配的要好一些。

伊丽莎白的学习之路 8998

ucosiii内核源码解析---os_core.c

os_core.c是OS的核心函数,掌握其内容对我们的学习很有帮助。

weixin_46199479的博客 2278

uniapp开发AndroidAPP集成支付宝支付及问题处理(商家订单参数异常等),集成微信小程序支付及问题处理(运行真机调试白屏)

2、选择支付宝支付,调用支付接口唤起支付宝支付。

qq_16785561的博客 3486

【Ucos-III源码分析】——互斥信号量(互斥锁)

mutex互斥信号量(互斥锁)

m0_58457065的博客 1407

告别手动复制粘贴!用R语言脚本批量抓取TCMSP中药靶点基因(附完整代码)

本文介绍如何使用R语言脚本自动化抓取TCMSP数据库中的中药靶点基因数据,告别手动复制粘贴的低效操作。通过详细的代码示例和参数设置,帮助研究人员快速获取并过滤符合药代动力学标准的中药成分及其靶点基因,大幅提升研究效率。特别适合生物信息学和中药现代化研究领域的从业者。

weixin_26950847的博客 264

【openEuler容器镜像部署指南】

【代码】【List集合排序 】

weixin_43878094的博客 1111

读uCOSIII源码笔记

首先谈一下自己读RTOS的粗略认识吧,刚开始接触单片机时使用的都是while(true),一个循环处理所有的任务。直到写了一个通过GPRS模块与上层服务通信(长连接)之后,才发现在while(true)中处理好恶心,老是掉线之后连接不上。可能是对AT指令的处理没有搞好,就开始各种找怎么解决,接触到了uC/OSIII,阅读了他提供的文档,阅读了源代码,慢慢看,感觉进步很多,用着用着就爱上了。

avenger0422的专栏 8324

TGRS 2026 即插即用 | 注意力篇 | SCFM:双向交叉显著性引导注意力,高层语义与低层细节的双向互补!

本文介绍了MPCNet中的语义引导交叉注意力融合模块(SCFM),该模块通过双向交叉显著性引导机制实现跨尺度特征融合。SCFM创新性地结合了高层语义和低层细节的互补信息,通过轻量局部空间注意力预增强和坐标注意力全局融合引导,显著提升了红外小目标检测的精度。实验表明,SCFM在多个数据集上达到SOTA性能,同时保持轻量高效的计算特性,支持端侧设备部署。 SCFM的核心贡献包括: 双向交叉显著性引导机制,实现语义与细节的互补融合 轻量局部空间注意力预增强模块,计算量仅为传统方法的1/10 坐标注意力全局融合引导

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 149

【UCOSIII源码阅读笔记】第四篇——临界区

本文对ucosiii中的临界区代码进行分析。

inputA的博客 568

zabbix系列:内存VM.MEMORY.SIZE监控之total、free、pused、available 参数说明

free -m buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的. zabbix Web total:1046/1024=1.02G Available:216/1046=20.65% zabbix参数 total- 总物理内存. free- 可用内存. active- 内存当前使用或最近使用,所以它在RAM中。 inactive- 未使用内存. wired- 被标记为始终驻留在RAM中的内...

NIO4444 5668

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

ucosIII学习总结

看到以前写的ucos博客还有人看,感到很欣慰,写篇博客给刚学习ucos的同学一些建议,希望对你们的学习有所帮助。 写在前面,当初学ucos完全是误打误撞,从单片机一路走来,不想做嵌入式,看到RTOS在自动控制、物联网等有一定应用就搞起来了,没想到最后还是入了嵌入式的行当,也蛮好,蛮好。 由于从单片机走来,对于编程还算了解一点皮毛,可是这点皮毛在学习操作系统时简直不够用。ucos中上来就是很多链...

u010743406的博客 741

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【UCOSIII源码阅读笔记】第二篇

本文主要分析ucosiii中管理优先级表的os_prio.c文件。

inputA的博客 532

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

UCOSiii--源码阅读

我在阅读ucos源码过程遇到的一写小问题 1.OSTaskDel()任务删除函数 在任务函数中,调用次函数传入空指针,将会删除本任务(一直以为要传入任务控制块才行,原来还可以传入空指针) 2.钩子函数 以空闲任务的钩子函数来说, 在OSIdleTaskHook() (在os_cpu_c.c)中调用 最终调用的是函数App_OS_IdleTaskHook(),也就是说如果我们想要在空闲任务的钩子函数中做其他处理就需要将代码写在App_OS_IdleTaskHook() 如下:空闲任务钩子函数相应的处理

风间琉璃的博客 1456

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

第五章 UCOSIII任务管理

多任务操作系统最主要的就是对任务的管理,包括任务的创建、挂起、删除和调度等,因 此对于 UCOSIII操作系统中任务管理的理解就显得尤为重要。本章我们就讲解 UCOSIII中的任 务管理,本章分为如下几个部分: 5.1 UCOSIII启动和初始化 5.2任务状态 5.3任务控制块 5.4任务堆栈 5.5任务就绪表 5.3任务调度和切换 ...

weixin_42215853的博客 505

(学习日记)2024.02.29:UCOSIII第二节

2024.02.29 四、UCOSIII:新建工程 1、创建文件夹 2、新建工程 五、UCOSIII:调试配置 1、设置软件仿真 2、修改时钟大小 3、添加头文件路径 六、调试模式中示波器的使用 1、 在app.c中编写main函数 2、调试模式 3、使用示波器 4、常见错误 1. Build时报错 Error: L6218E 2. keil5软件仿真没有实时波形 3. Build时报错 error 65 4. Peripherals显示空白 5. 调试模式时,程序前没有灰块

一个放笔记的小书架 1521

ucosiii源码分析笔记 pdf下载_2020年最详细的Android第三方源码库笔记,开放下载...

笔记特点:内容详实,涵盖了和Android开发相关的各个源码库。不仅深入浅出地分析源码,还记录了大佬们在使用时遇到的问题,并提供了解决的方法。内容概要:一共分为十个章节,包含Glide、LeakCanary、ARouter、EventBus、Retrofit源码详细解析,以及它们的使用,和一些容易遇到的问题。由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。如有需要获取资料文档的...

weixin_39639698的博客 447

【UCOSIII源码阅读笔记】第三篇——PendSV异常处理分析

本文对ucos中为什么使用PendSV,以及如何使用PendSV进行分析。

inputA的博客 1622

GD32F103RCT6/GD32F303RCT6-UCOSIII底层移植(2)新建任务

GD32F103RCT6/GD32F303RCT6 UCOSIII底层移植 任务创建

各位大佬,一起学习交流一下吧! 947

UCOSIII--源码阅读(2)

1.任务的挂起与创建 OS 的任务支持挂起和恢复的功能,挂起就相当于暂停,暂停后任务从就绪列表中移除,恢复即重新将任务插入就绪列表。一个任务挂起多少次就要被恢复多少次才能重新运行在这里插入代码片 在任务实现挂起和恢复的时候,要根据任务的状态来操作,任务的状态不同,操作也不同,有关任务状态的宏定义在 os.h 中实现,总共有 9 种状态, TaskState : 为了实现任务的挂起和恢复 TCB 中有任务的状态 TaskState 和任务挂起 计数器 SusPendCtr 这两个成员 OS_STATE

风间琉璃的博客 277

UCOSIII内核文件扫盲:从`os_core.c`到`uC-LIB`,每个文件夹都是干嘛的?给新手的保姆级导航

本文详细解析了UCOSIII内核源码结构,从核心文件`os_core.c`到基础库`uC-LIB`,为新手提供清晰的导航指南。通过类比工厂车间,帮助读者理解任务调度、内存管理等关键模块的功能与实现,并介绍官方例程的实战应用,助力快速掌握实时操作系统开发。

weixin_30576827的博客 267
上一篇: stm32 485接收数据异常调试过程
下一篇: 【UCOSIII源码阅读笔记】第二篇
inputA
博客等级 码龄7年 297粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值