4.19作业

news/2024/5/19 9:18:47

1、总结二进制信号量和计数型信号量的区别,以及他们的使用场景。

二进制信号量:信号量的数值只能是0和1,用于共享资源的访问

计数型信号量:信号量的值都是大于或者等于2,实现生产者和消费者模型

2、使用技术型信号量完成生产者和消费者模型实验。

void StartDefaultTask(void *argument)
{for(;;){osSemaphoreRelease(myCountingSem01Handle);	printf("生产1\r\n");osSemaphoreRelease(myCountingSem01Handle);	printf("生产2\r\n");osDelay(500);}
}void StartTask02(void *argument)
{for(;;){osSemaphoreAcquire(myCountingSem01Handle,osWaitForever);printf("消费者1\r\n");osSemaphoreAcquire(myCountingSem01Handle,osWaitForever);printf("消费者2\r\n");osSemaphoreAcquire(myCountingSem01Handle,osWaitForever);printf("消费者3\r\n");osDelay(500);}
}

3、总结FreeRTOS中同步和互斥的五种方法的使用方法

1)队列:用于任务之间的通信,也可以存储数据

//创建队列函数
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr)

uint32_t msg_count:队列的容量

uint32_t msg_size:队列元素的大小

const osMessageQueueAttr_t *attr:属性

osMessageQueueId_t:创建队列返回的ID,通过这个ID可以找到对应的队列

//队列写函数
osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout)

osMessageQueueId_t mq_id:数据要写入哪个队列

const void *msg_ptr:要写入数据的地址

uint8_t msg_prio:数据的优先级,一般设置为0

uint32_t timeout:超时时间,单位是ms,特殊的值:osWaitForerver:一直等待,让任务去休眠

//队列读函数
osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout)

osMessageQueueId_t mq_id:要从哪个队列中读取数据

void *msg_ptr:数据要保存的地址

uint8_t *msg_prio:数据的优先级,一般设置为NULL

uint32_t timeout:超时时间

osStatus_t:是否读取成功

2)信号量:用于实现任务之间的同步和互斥

//创建信号量的函数:
osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr)

uint32_t max_count:信号量的最大值,二进制信号量的最大值是1

uint32_t initial_count:信号量的初始值

const osSemaphoreAttr_t *attr:信号量的属性

osSemaphoreId_t:信号量的ID

//获取信号量函数:
osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout)

osSemaphoreId_t semaphore_id:要获取哪一个信号量

uint32_t timeout:超时时间

osStatus_t:是否获取成功

获取成功信号量的值减一

//释放信号量函数:
osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id)

osSemaphoreId_t semaphore_id:要释放哪一个信号量的ID

osStatus_t:是否释放成功

释放成功信号量的值加一

3)互斥量:用于保护共享资源

//创建互斥量函数:
osMutexId_t osMutexNew (const osMutexAttr_t *attr)

const osMutexAttr_t *attr:互斥量的属性

osMutexId_t:互斥量的ID

//获取锁函数:
osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout)

osMutexId_t mutex_id:要获取哪一个互斥量

uint32_t timeout:超时时间

osStatus_t:是否成功获取到互斥量

//释放互斥量函数:
osStatus_t osMutexRelease (osMutexId_t mutex_id)

osMutexId_t mutex_id:要释放的互斥量ID

osStatus_t:是否成功释放

4)事件组:允许任务等待多个事件的状态,并且可以在任何事件被设置时唤醒等待的任务

//创建事件组函数:
osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr)

const osEventFlagsAttr_t *attr:属性

osEventFlagsId_t:事件组的ID

//设置事件组函数:
uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags)

osEventFlagsId_t ef_id:要设置的事件组的ID

uint32_t flags:要设置的事件

//等待事件组函数:
uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout)

osEventFlagsId_t ef_id:要等待一个哪一个事件组

uint32_t flags:要等待什么事件

uint32_t options:等待的选项,osFlagsWaitAll:等待全部事件完成,osFlagsWaitAny:等待任意事件完成

5)任务通知:通知任务,用来实现任务之间的同步和互斥

//任务通知函数:
uint32_t osThreadFlagsSet (osThreadId_t thread_id, uint32_t flags)

osThreadId_t thread_id:要通知任务的ID

uint32_t flags:要设置哪一个事件

//任务通知等待函数:
uint32_t osThreadFlagsWait (uint32_t flags, uint32_t options, uint32_t timeout)

uint32_t flags:要等待哪些事件

uint32_t options:等待的选项

uint32_t timeout:超时时间

4、总结任务通知和其他任务通信机制的区别

1)任务通知无需创建,可以直接使用,通过任务控制块来实现(TCB),队列、信号量、互斥量、事件组都需要创建后才能使用。

2)任务通知所需的资源比队列、信号量、互斥量、事件组要少。

3)队列、信号量、互斥量、事件组主要用于多对多之间的通信,任务通知是一对一之间的通信。

5、根据文档和录屏学习一下软件定时器,了解软件定时器的作用和软件定时器和硬件定时器的区别

软件定时器的作用:在指定的时间到来时执行指定的函数,或者以某个频率周期性地执行某个函数。被执行的函数叫做软件定时器回调函数。

区别:

1)硬件定时器精度比软件定时器高

2)软件定时器消耗的资源比较多

3)软件定时器的数量理论上没有限制,硬件定时器的数量和硬件相关


http://www.mrgr.cn/p/41208061

相关文章

手撕netty源码(一)- NioEventLoopGroup

文章目录 前言一、NIO 与 netty二、NioEventLoopGroup 对象的创建过程2.1 创建流程图 前言 本文是手撕netty源码系列的开篇文章,会先介绍一下netty对NIO关键代码的封装位置,主要介绍 NioEventLoopGroup 对象的创建过程,看看new一个对象可以做…

快速新建springboot项目

一、初始化 1.打开IDEA,在Spring initializer这里按照下图项目进行配置。注意:如果jdk是1.8建议将Server URL这里替换为图中的阿里云服务器,否则容易找不到对应的java8,然后点击next 2.在这里提前配置一些需要使用的依赖&#xf…

软考 系统架构设计师系列知识点之大数据设计理论与实践(13)

接前一篇文章:软考 系统架构设计师系列知识点之大数据设计理论与实践(12) 所属章节: 第19章. 大数据架构设计理论与实践 第4节 Kappa架构 19.4.2 Kappa架构介绍 Kappa架构由Jay Kreps提出(Lambda由Storm之父Nayhan M…

react引入iconfont的svg图标

react引入iconfont的svg图标 本文目录 react引入iconfont的svg图标普通图标通过link引入css组件内引入css使用 svg图标通过script引入js组件内引入js使用 通过封装组件自定义封装组件中调用 通过antd封装使用 普通图标 通过link引入css <link rel"stylesheet" h…

C语言 字符类型

下面 我们来说字符类型 我们来看这个 保险单 金额 和 总额 都可以用数字类型 而性别则需要字符型 字符数据的存储 – ASCI码 字符类型 char 就是专为存储字符(如字母&#xff0c;标点和数字)而设计的类型。 使用单引号包含单个字符或转义字符去表示一个 char 类型的常量。 …

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡)

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

ZYNQ--PL读写PS端DDR数据

PL 和PS的高效交互是zynq 7000 soc开发的重中之重&#xff0c;我们常常需要将PL端的大量数 据实时送到PS端处理&#xff0c;或者将PS端处理结果实时送到PL端处理&#xff0c;常规我们会想到使用DMA 的方式来进行&#xff0c;但是各种协议非常麻烦&#xff0c;灵活性也比较差&am…

CDN、边缘计算与云计算:构建现代网络的核心技术

在数字化时代&#xff0c;数据的快速传输和处理是保持竞争力的关键。内容分发网络&#xff08;CDN&#xff09;、边缘计算和云计算共同构成了现代互联网基础架构的核心&#xff0c;使内容快速、安全地到达用户手中。本文将探讨这三种技术的功能、相互关系以及未来的发展趋势。 …

网络 (基础概念, OSI 七层模型, TCP/IP 五层模型)

网络互连 网络互连: 将多台计算机连接在一起, 完成数据共享 数据共享的本质是网络数据传输, 即计算机之间通过网络来传输数, 也叫做网络通信 根据网络互连的规模不同, 将网络划分为局域网和广域网 注意: 局域网和广域网是相对的概念 局域网LAN 又称内网, 局域网和局域网之间在没…

【快速入门 LVGL】-- 5、Gui Guider界面移植到STM32工程

上篇&#xff0c;我们已学习&#xff1a;【快速入门 LVGL】-- 4、显示中文 工程中添加了两个按钮作示范。运行效果如图&#xff1a; 本篇&#xff1a;把Gui Guider设计好的界面&#xff0c;移植到STM32工程。 特别地&#xff1a; 在使用Gui Guider进行界面设计时&#xff0c;应…

读天才与算法:人脑与AI的数学思维笔记08_生物的创造力

读天才与算法:人脑与AI的数学思维笔记08_生物的创造力1. 生物的创造力 1.1. 在进化树中是否有其他的物种已经具有与我们人类相当的创造力水平 1.2. 20世纪50年代中期,动物学家德斯蒙德莫里斯(Desmond Morris)在伦敦动物园做了这样一个试验 1.2.1. …

[转帖]18--k8s之Nginx ingress

https://www.cnblogs.com/caodan01/p/15142709.html 目录一、介绍 二、安装nginx ingress 三、http部署1.编写一个service准备实验 2.编写http的ingress 3.部署四、https部署 五、常用配置 一、介绍 ingress为kubernetes集群中的服务提供了入口,可以提供负载均衡,ssl终止和基…

基于Vue+ElementPlus自定义带历史记录的搜索框组件

前言 基于Vue2.5ElementPlus实现的一个自定义带历史记录的搜索框组件 效果如图&#xff1a; 基本样式&#xff1a; 获取焦点后&#xff1a; 这里的历史记录默认最大存储10条&#xff0c;同时右侧的清空按钮可以清空所有历史记录。 同时搜索记录也支持点击搜索&#xff0c;按…

SpringCloud系列(11)--将微服务注册进Eureka集群

前言&#xff1a;在上一章节中我们介绍并成功搭建了Eureka集群&#xff0c;本章节则介绍如何把微服务注册进Eureka集群&#xff0c;使服务达到高可用的目的 Eureka架构原理图 1、分别修改consumer-order80模块和provider-payment8001模块的application.yml文件&#xff0c;使这…

【七】jmeter5.5+influxdb2.0+prometheus+grafana

参考文章&#xff1a;https://blog.csdn.net/wenxingchen/article/details/126892890 https://blog.csdn.net/Zuo19960127/article/details/119726652 https://blog.csdn.net/shnu_cdk/article/details/132182858 promethus参考 由于自己下载的是infuldb2.0&#xff0c;所以按照…

【目标检测】FPN特征金字塔完整流程详解

学习视频&#xff1a;1.1.2 FPN结构详解 对比 可以看到FPN是自上而下、自下而上并且可以进行多尺度特征融合的的层级结构。 具体结构 1x1 conv: 对通道数进行调整&#xff0c;不同大小的特征图通道数不同&#xff0c;越高层次的特征图通道数越大&#xff0c;论文中使用256个1…

OpenTelemetry-2.Go接入Jaeger(grpc,gin-http)

目录 1.什么是OpenTelemetry 2.搭建jaeger 3.链路追踪 本地调用 远程调用 GRPC proto server端 client端 Gin-HTTP 调用流程 api1 api2 grpc 4.完整代码 1.什么是OpenTelemetry 参考&#xff1a;OpenTelemetry-1.介绍-CSDN博客 2.搭建jaeger 参考&#xff1a;…

【深度学习】烟雾和火焰数据集,野外数据集,超大量数据集,目标检测,YOLOv5

标注了2w张数据集&#xff0c;是目标检测yolo格式的&#xff0c;有火焰、烟雾两个目标&#xff0c;下图是训练时候的样子&#xff1a; 训练方法看这里&#xff1a; https://qq742971636.blog.csdn.net/article/details/138097481 数据集介绍 都是博主辛苦整理和标注的&…

java 学习一

jdk下载地址 配置环境变量

GPT国内能用吗

2022年11月&#xff0c;Open AI发布ChatGPT&#xff0c;ChatGPT展现了大型语模型在自然语言处理方面的惊人进步&#xff0c;其生成文本的流畅度和连贯性令人印象深刻&#xff0c;为AI应用打开了新的可能性。 ChatGPT的出现推动了AI技术在各个领域的应用&#xff0c;例如&#x…