2019年9月26日星期四(STM32 ucos3 )

2023-11-15

一.消息队列

1.概念

    信号量本身不能传递数据,如果希望在任务通信同时传递数据,可以使用消息队列 

    

 

 

    任务和中断都可以发送消息,但是只有任务能够接收消息

2.编程使用

 

(1)创建消息队列

  void  OSQCreate (OS_Q        *p_q,//消息队列控制块(指向一个消息队列)
                 CPU_CHAR    *p_name,//消息队列名字
                 OS_MSG_QTY   max_qty,//消息队列的长度(不为0)
                 OS_ERR      *p_err)//错误返回

(2)发送消息

  void  OSQPost (OS_Q         *p_q,//消息队列控制块(指向一个消息队列)
               void         *p_void,//发送消息首地址
               OS_MSG_SIZE   msg_size,//消息的长度
               OS_OPT        opt,//发送选项

                


               OS_ERR       *p_err)//错误返回

(3)接收消息

  void  *OSQPend (OS_Q         *p_q,//消息队列控制块(指向一个消息队列)
                OS_TICK       timeout,//超时时间,给0无限等待
                OS_OPT        opt,//接收选项

                


                OS_MSG_SIZE  *p_msg_size,//消息长度
                CPU_TS       *p_ts,//时间戳
                OS_ERR       *p_err)//错误返回

消息首地址通过返回值返回

3.任务内部的消息队列

    这种消息队列属于任务,只有本任务从消息队列中读取消息,其他的任务和中断可以往该消息队列中发送消息

编程使用:

(1)无需创建初始化
(2)发送消息

  void  OSTaskQPost (OS_TCB       *p_tcb,//任务控制块
                   void         *p_void,//消息首地址
                   OS_MSG_SIZE   msg_size,//消息长度
                   OS_OPT        opt,//发送属性
                   OS_ERR       *p_err)//错误返回

(3)接收消息(本任务调用)    

  void  *OSTaskQPend (OS_TICK       timeout,//超时时间
                    OS_OPT        opt,//接收属性
                    OS_MSG_SIZE  *p_msg_size,//消息大小
                    CPU_TS       *p_ts,//时间戳
                    OS_ERR       *p_err)//错误返回

返回收到消息首地址

二.软件定时器

1.概念

    软件定时器通过系统时钟节拍(tick)作为时钟源,实现定时的功能,适用于定时精度无需太高的场合,实现通过定时任务来实现

    定时器常用于完成某些周期性的工作

    定时器任务优先级和工作频率可以设置

        OS_CFG_TMR_TASK_PRIO决定了定时器任务优先级(2)

        OS_CFG_TMR_TASK_RATE_HZ决定了定时器的频率(100Hz)

2.编程使用

(1)创建定时器

  void  OSTmrCreate (OS_TMR               *p_tmr,//指向定时器
                   CPU_CHAR             *p_name,//定时器名字
                   OS_TICK               dly,//延时时间(单位是定时器参考周期 10ms)
                   OS_TICK               period,//周期时间(单位是定时器参考周期 10ms)
                   OS_OPT                opt,//定时器模式(单次模式/周期模式)

                    


                   OS_TMR_CALLBACK_PTR   p_callback,//定时器回调函数(无返回值,两个void *参数,第一个代表定时器)
                   void                 *p_callback_arg,//传递给回调函数的第二个参数
                   OS_ERR               *p_err)//错误返回

(2)如果不在使用,可以删除定时器

  CPU_BOOLEAN  OSTmrDel (OS_TMR  *p_tmr,//指向定时器
                       OS_ERR  *p_err))//错误返回

 (3)启动定时器

  CPU_BOOLEAN  OSTmrStart (OS_TMR  *p_tmr,//指向定时器
                       OS_ERR  *p_err)//错误返回

1)定时器以单次模式工作时,以延时时间(dly)间,只工作一次

 

2)定时器以周期模式工作时,延时时间为0,以周期时间(period)超时时间,周期性工作

 

3)定时器以周期模式工作时,延时时间非0,第一个周期超时时间为(dly),以后周期超时时间是周期时间(period),周期性工作

    

练习:

    使用软件定时器3s读取一次温湿度并且通过串口打印(将DHT11中的ms延时换成us)

三.事件标识组

1.概念

    事件标识组也是用来实现同步,而且用于多个对象之间的同步,同步方式有与同步/或同步

 

    与同步就是等待所有的条件成立,或同步等待其中一个条件成立

  

2.编程接口

 

(1)创建

  void  OSFlagCreate (OS_FLAG_GRP  *p_grp,//指向事件标识组
                    CPU_CHAR     *p_name,//名称
                    OS_FLAGS      flags,//初始值(32位)
                    OS_ERR       *p_err)//错误返回

(2)修改事件标识组标识

  OS_FLAGS  OSFlagPost (OS_FLAG_GRP  *p_grp,//指向事件标识组
                      OS_FLAGS      flags,//代表要修改的位(要修改的位为1,不修改的位为0)
                      OS_OPT        opt,//改为1/改为0

                        


                      OS_ERR       *p_err)//错误返回

(3)等待事件标识组

  OS_FLAGS  OSFlagPend (OS_FLAG_GRP  *p_grp,//指向事件标识组
                      OS_FLAGS      flags,//代表要等待的位(要等待的位为1,不等待的位为0)
                      OS_TICK       timeout,//超时时间
                      OS_OPT        opt,//等待选项

                      


                      CPU_TS       *p_ts,//时间戳
                      OS_ERR       *p_err)//错误返回

四.等待多个内核对象

1.概念

    等待多个内核对象允许等待多个不同的内核对象(信号量,消息队列,标识组),根据等到的不同的内核对象进行不同的处理,类似与Linux中多路复用

    要使用等待多个内核对象的功能,需要将 宏 OS_CFG_PEND_MULTI_EN 的值置1

2.函数接口(等待)

  OS_OBJ_QTY  OSPendMulti (OS_PEND_DATA  *p_pend_data_tbl,//等待对象数组
                         OS_OBJ_QTY     tbl_size,//数组长度
                         OS_TICK        timeout,//超时时间
                         OS_OPT         opt,//等待选项

                            


                         OS_ERR        *p_err)//错误返回

//对象数组成员类型

struct  os_pend_data {
    OS_PEND_DATA        *PrevPtr;
    OS_PEND_DATA        *NextPtr;
    OS_TCB              *TCBPtr;//任务控制块
    OS_PEND_OBJ         *PendObjPtr;//要等待的对象
    OS_PEND_OBJ         *RdyObjPtr;//等到的对象
    void                *RdyMsgPtr;//消息首地址
    OS_MSG_SIZE          RdyMsgSize;//消息长度
    CPU_TS               RdyTS;//时间戳
};

转载于:https://www.cnblogs.com/zjlbk/p/11593836.html

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

2019年9月26日星期四(STM32 ucos3 ) 的相关文章

  • 写需求分析必须牢记的5大要点

    需求验证的5大要点 要做好需求验证 必须在思想 方法 语言 人员 内容5个要点上做好相应的工作 否则就会产生很多负面的影响 1 思想 前面已经说过 由于Review被翻译成 评审 导致很多人将其与中国人常说的评审相混淆 其实它们之间是有区别
  • STM32+ESP8266+MQTT连接阿里云(1)

    ESP8266连接阿里云的流程 发送 目的是让ESP8266退出透传 AT RESTORE 让模块恢复出厂设置 AT 判断模块的好坏及工作状态 正常就会回复OK ATE0 关闭回显 这个没什么好说的 AT CWMODE CUR 1 设置为s
  • Eclipse搭建stm32+jlink开发环境全攻略(进阶篇一)

    Eclipse搭建stm32 jlink开发环境全攻略 进阶篇 一 本篇开始讲解一些比较实用的东西 在前面的两章中 我们讲解了eclipse开发stm32的大部分问题 然而 在实际使用过程中 我们仍然会遇到一些不太理想的地方 比如 ecli
  • uboot分析之Makefile

    Uboot分析之Makefile 1 uboot根目录下执行 make smdk2410 config smdk2410 config unconfig MKCONFIG config arm arm920t smdk2410 samsun
  • coreutils-stty 初始设置和echo 16进制modBus数据至串口

    安装USB串口驱动 注 我所使用的USB serial芯片为pl2303 个人根据自己不同的芯片安装对应驱动 kmod usb serial pl2303 串口 dev ttyUSB0 配置 其中 F 指定端口 cs8表示8位 parenb
  • 使用嵌入式linux完全手册光盘的arm-linux-gcc 遇到问题 自己编译

    Redhat9下重新生成交叉编译器gcc 3 4 5 glibc 2 3 6 看到论坛上有兄弟也遇到 arm linux gcc lib tls libc so 6 version GLIBC 2 4 not found required
  • 我的第一个Imx6ULL应用《百度图像识别》

    Imx6ULL填坑计划 此次用到的所有资料我都放到了奶牛快传里 下载的话速度极快 https c t work s fe0b4a22171342 我买这个板子已经很久了 跟着野火正点原子的教程踉踉跄跄学了一段儿 对很多基础知识也是一知半解
  • 嵌入式学习:stm32学习路线推荐之思维导图

    从9月1日开始学习STM32后 对于STM32的一些个人总结 1 对于STM32和51的区别 对于 STM32来说 基本的大概都和51单片的内容相似 但是由于STM的引脚和寄存器的数量较多 所以需要一个更加完善的管理机制 导致了 时钟 的产
  • 基于DS18B20和HS1101的仓库自动报警系统

    基于DS18B20和HS1101的仓库自动报警系统 背景介绍 效果展示 完整版的项目代码 仿真文件 下面是项目原理图 具体管脚定义如下图 18B20温度原理 HS1101湿度传感器 红外测距报警模块我用到的是GP2D12 通过数模转化器AD
  • Qt creator4.8.0 以上使用SqLite数据库进行数据操作

    文章目录 前言 一 在 pro工程文件中添加sql模块 二 使用步骤 1 添加头文件 2 链接并打开数据库 3 创建用户信息表management info 4 插入数据操作 5 修改数据库操作 6 查询数据库 总结 前言 Qt creat
  • 使用MicroPython开发ESP32(02):库介绍

    文章目录 目的 库基础说明 库列表 Python基础库 嵌入式设备相关库 ESP32特有库 总结 目的 对于Python来说丰富的库是其使用快速简易的关键 这点对于MicroPython也一样 这篇文章就对MicroPython的库做个罗列
  • 嵌入式 ARM 汇编编程例题

    文章目录 用汇编语言实现 128 位数的减法 已知 32 位变量 X Y 存放在存储器的地址 0x90010 0x90014 中 要求实现 Z X Y 其中 Z 的值存放在 0x90018 中 已知 32 位有符号数 X 存放在存储器的地址
  • 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件 又称为脉冲电机 在驱动电源的作用下 步进电机受到脉冲的控制 其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比 步进电机每接收一个电脉冲 转
  • C++实现FFT频谱分析

    Update 9 10 2022 鸽了太久 增补了一些新的表述和简单推导 以及FFT在算法竞赛中的应用部分 帖子里的代码已经分别在2021全国大学生电子设计竞赛 洛谷OJ和课程设计中实战过 可靠性有保障 Origin 10 23 2021
  • connect函数的用法

    作者 曾宏安 华清远见嵌入式学院讲师 在网络编程中 connect函数经常用来在套接字上初始化连接 无论是流式套接字还是数据报套接字都可以使用connect函数 但含义却不一样 下面我们分别来讨论一下 一 流式套接字 流式套接字通常使用的是
  • 按键的短按和长按检测

    方法一 常用的加延时函数 在中断服务函数中加一个比如10ms的延时函数 延时时间的长短取决于实际所用的按键特性 只要延时时间比抖动时间略大即可 原理很简单 加了延时就避开了抖动的这段时间 在延时之后判断引脚电平 如果为低电平就表示是按下 v
  • LWIP在STM32上的移植

    本文做记录摘抄 加上自己的体会 文章标题 STM32使用LWIP实现DHCP客户端 http www cnblogs com dengxiaojun p 4379545 html 该文章介绍了几点 LWIP源码的内容 关键点 1 inclu
  • 通过External Tools在STM32CubeIDE下使用DAP-LINK

    目录 一 文章背景 二 准备工作 2 1 Stm32CubeIDE 2 2 DAP LINK 2 3 STM32目标板 三 配置过程 3 1 连接目标板 3 2 配置仿真器 3 3 更改调试设置为远程调试 3 4 新建OpenOcd扩展工具
  • 面经——小米面经(2021春招)

    摘自 小米面经 2021春招 感谢小米 感谢雷总 感谢上官可编程 作者 阿波罗啦啦啦啦 发布时间 2021 05 01 11 08 41 网址 https blog csdn net weixin 44933419 article deta
  • Java的引用类型有几种?区别是什么?

    nbsp Java的引用类型有几种 区别是什么 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复

随机推荐

  • Rational Rose2007(v7.0)下载地址、安装及激活详解教程(图)

    详细下载和安装过程请查询 http www cnblogs com leaven p 3718361 html http blog csdn net skl tz article details 8925152 最近需要画uml图 之前用的
  • 区块链公链开发有哪些价值?

    2018年公链开始大量出现 区块链公链开发有什么价值 实质上真正创造区块链价值的是兴建在主网络之上的DAPP 并不是底层链的主网络 获得成功的底层链都要具有身后强劲的DAPP项目集群的支持 尽管DAPP的基本构建标准与底层链主互联网息息相关
  • Python入门教程(保姆级),从零基础入门到精通

    对于刚开始接触Python的小伙伴来说 没有思路方法 不知道从何开始学习 把软件环境安装好后就不知所措了 接下来我给大家分享下多位大牛倾力打造的python系统学习流程 一个月才设计完的 Python基础部分 老话说的好 万丈高楼平地起 不
  • Linux下使用校园网

    Linux下使用Drcom登陆校园网方法汇总 第一种方法 用wine登录各种客户端 正版的提示不能找到动态连接库rasapi32 内建的原装的试过都没有用 放弃 破解版的不是登录超时就是各种错误 第二种方法 用学校提供的LINUX版本 提示
  • 西米支付:数字人民币接口来了!实时清算至数字人民币钱包。

    1 产品概述 什么是数字人民币 是由中国人民银行发行的数字形式的法定货币 由指定运营机构参与运营 与实物人民 币等价 具有价值特征和法偿性 是一种零售型央行数字货币 也是未来主流支付方式之一 主要用于满足国内零售支付的需求 商户如何开通数字
  • unity keycode对应的键值

    KeyCode KeyCode是由Event keyCode返回的 这些直接映射到键盘上的物理键 值 对应键 Backspace 退格键 Delete Delete键 Tab TabTab键 Clear Clear键 Return 回车键
  • 泛型类型的子类及通配符的使用

    本文讲述以下几个方面的内容 试图说明泛型类型的子类及通配符的使用 1 子类及替换原则 2 使用extends关键字的通配符 3 使用super关键字的通配符 1 子类及替换原则 在java语言中 我们通俗讲一个类是另一个类的子类型 是通过使
  • 【深入探究人工智能】:历史、应用、技术与未来

    深入探究人工智能 前言 人工智能的历史 人工智能的应用 人工智能的技术 人工智能的未来 当代的人工智能产物 结语 小结 博客主页 小智 x0 0x 欢迎关注 点赞 收藏 留言 系列专栏 小智带你闲聊 代码仓库 小智的代码仓库 前言 人工智能
  • [python] 路径相似度

    问题以及解 path 1 b1 path a b1 path a b1 c 1 输入一个路径的值 path 正则表达式 正则表达式 设这个字符串为ST1 2 输入一个被比较的路径值 path 1 b1 ST2 将第一个字符串ST1 进行sp
  • 2022java面试题

    seata tcc 和at模式区别 feign 常用哪些参数 缓存穿透 缓存击穿 Springmvc执行流程 过滤器拦截器的区别 kafka的0拷贝 kafka的原理 线程池如何实现只有线程池里面的任务执行完之后 才去给线程池添加任务 让你
  • 随机森林(Random Forest),决策树,bagging, boosting(Adaptive Boosting,GBDT)

    http www cnblogs com maybe2030 p 4585705 html 阅读目录 1 什么是随机森林 2 随机森林的特点 3 随机森林的相关基础知识 4 随机森林的生成 5 袋外错误率 oob error 6 随机森林工
  • 【每日一C之十七】#ifndef与#pragma once的用法与区别

    每日一C之 ifndef与 pragma once 每天拾一个C语言贝壳 厚积薄发 积跬步以致千里
  • Unity 笔记SortingLayer、Order in Layer和RenderQueue讲解

    1 首先先了解一下摄像机的Depth 深度渲染 深度值越低 越先渲染 深度值高 后渲染 所以一般UICamera的Depth大于3D摄像机 Culling Mask 主要是相机针对不同层级的物体进行渲染的操作 想让相机渲染哪个层就勾选哪个层
  • InputStream Reader FileInputStream BufferedReader InputStreamReader FileReader FileInputStream和转换流

    原文地址 转发备忘 https blog csdn net liu940204 article details 79994467 ava io下面有两个抽象类 InputStream和Reader InputStream是表示字节输入流的所
  • 全网最全fiddler使用教程和fiddler如何抓包(fiddler手机抓包)-笔者亲测

    目录 导读 一 前言 二 HTTP协议 三 Fiddler简介和工作原理 四 Fiddler六大块详解 五 Fiddler过滤器 六 Fiddler 对于WEB项目的抓包和改包项目实战 七 Fiddler弱网测试 八 Fiddler抓取ht
  • springboot项目打包提示Unable to find a single main class from the following candidates错误

    提示Unable to find a single main class from the following candidates错误的原因是会从所有代码里面扫描包括main方法的类 找到多个类就报错了 解决办法是在pom xml指定启动
  • 因果关系的骚操作

    import numpy as np from sklearn datasets import load boston boston load boston print boston target shape print boston da
  • 【软考备考-综合知识】操作系统基础

    操作系统概念 能有效地组织和管理系统中的各种软 硬件资源 合理地组织计算机系统工作流程 控制程序的执行 并且向用户提供一个良好的工作环境和友好的接口 特征与功能 操作系统的4个特征是并发性 共享性 虚拟性和不确定性 操作系统的功能可以分为处
  • ElasticSearch的Update By Query的坑(使用注意事项及其方案)

    ES的Update By Query对应的就是关系型数据库的update set where 语句 ES的Update By Query可能存在的坑 比如批量更新时非事务模式执行 允许部分成功部分失败 大批量操作会超时 频繁更新会报错 版本
  • 2019年9月26日星期四(STM32 ucos3 )

    一 消息队列 1 概念 信号量本身不能传递数据 如果希望在任务通信同时传递数据 可以使用消息队列 任务和中断都可以发送消息 但是只有任务能够接收消息 2 编程使用 1 创建消息队列 void OSQCreate OS Q p q 消息队列控