FreeRTOS学习第8篇--同步和互斥操作引子

目录

  • FreeRTOS学习第8篇--同步和互斥操作引子
    • 同步和互斥概念
    • 实现同步和互斥的机制
    • PrintTask_Task任务相关代码片段
    • CalcTask_Task任务相关代码片段
    • 实验现象
    • 本文中使用的测试工程

FreeRTOS学习第8篇–同步和互斥操作引子

本文目标:学习与使用FreeRTOS中的同步和互斥操作引子

按照本文的描述,应该可以跑通实验并举一反三。

本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5

同步和互斥概念

同步用于控制任务执行顺序和时间,例如等待其他任务完成某项操作。

互斥用于保护共享资源,确保一次只有一个任务能够修改或访问这些资源。

实现同步和互斥的机制

  • 任务通知(task notification):用于任务之间的等待和唤醒,可以传递数据和状态。
  • 队列(queue):用于传递数据,任务和ISR都可以放入数据,从中读出数据。
  • 信号量(semaphore):用于维持资源的个数,生产者和消费者都可以使用。
  • 互斥量(mutex):用于保护共享资源的访问,确保一次只有一个任务能够修改资源。

这些知识点,后续会继续进行学习。

基于上面的知识点,在我自己硬件板子上进行实验,完成这个实验的体验。在本次实验中,设计两个两个任务,任务PrintTask负责打印一些信息,任务CalcTask进行计算,当计算任务完成计算时,将结果传递给任务PrintTask进行显示。

PrintTask_Task任务相关代码片段

void PrintTask(void *params)
{struct TaskPrintInfo *pInfo = params;OLED_Init();while (1){
//		vTaskDelay(3000);  // 进入blockwhile (g_calc_end == 0);  // 等待计算任务完成/* 打印信息 */if (g_LCDCanUse){g_LCDCanUse = 0;OLED_ShowString(pInfo->x,pInfo->y,"Sum:",16);OLED_ShowNum((pInfo->x + 8 * 6),pInfo->y,g_sum,10,16);OLED_ShowString(pInfo->x,pInfo->y + 16,"Time(ms): ",16);OLED_ShowNum((pInfo->x + 8 * 10),pInfo->y + 16,g_time / 1000000,4,16);g_LCDCanUse = 1;}OLED_Refresh();     vTaskDelete(NULL);}
}
   xTaskCreate(PrintTask, "task1", 128, &g_Task1Info, osPriorityNormal, NULL);
static struct TaskPrintInfo g_Task1Info = {0, 0,   "Task1"};

CalcTask_Task任务相关代码片段

void CalcTask(void *params)
{uint32_t i = 0;OLED_ShowString(0, 0, "Waiting",16);OLED_Refresh();     g_time = system_get_ns();for (i = 0; i < 10000000; i++){g_sum += i;}g_calc_end = 1;  // 计算完成标志g_time = system_get_ns() - g_time;vTaskDelete(NULL);
}
  xTaskCreate(CalcTask, "task2", 128, &g_Task2Info, osPriorityNormal, NULL);
static struct TaskPrintInfo g_Task2Info = {0, 16,  "Task2"};

实验现象

下载代码到板子上,可以看到计算的结果在第一行中进行显示,在第二行那里显示了计算这么多个数所需要的时间,打印任务PrintTask在计算任务CalcTask没计算完时也抢占cpu资源,导致计算会有些慢,这里我根据计算的结果,简单粗暴的加了相应的延迟vTaskDelay(3000); // 进入block,使打印任务一开始先阻塞着,不抢占cpu资源,计算速度会快一些。当然这只是一种例子,有一定的缺陷,当作学习使用。

本文完!

在这里插入图片描述

在这里插入图片描述

本文中使用的测试工程

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】学习和总结联合查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-OPj5g6evbkm5ol0U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

从零实现一套低代码(保姆级教程)【后端服务】 --- 【22】实现数据库管理的前端页面

摘要 在上一篇中&#xff0c;我们实现了三个接口&#xff1a; 新增实体的接口删除实体的接口获取实体列表的接口 其实复杂的地方在于&#xff0c;我们创建一个实体&#xff0c;是在数据库中创建了一张表。而这张表中的数据&#xff0c;是要根据低代码平台中的操作进行更改。…

嵌入式学习-qt-Day1

嵌入式学习-qt-Day1 一、思维导图 二、作业 1.自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//字体设置QFont font1;//创建字体对象1font1.setWeight(QFont::Bold);//字体…

魔改Mac OS渗透测试工具箱!

简介 本工具箱为v1版本&#xff0c;由"森然"师傅进行二开。 通过Python进行调用&#xff0c;并实现图形化界面。 参考&#xff1a;狐狸工具箱&#xff0c;闲客工具箱 环境以及工具 综合了常用的几个工具 适配Mac、Windos、Linux用户 注意&#xff1a;自带的jav…

HTTP 与HTTPS笔记

HTTP 80 HTTP是一个在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的约定和规范。 HTTP状态码 1xx 提示信息&#xff0c;表示目前是协议处理的中间状态&#xff0c;还需要后续的操作&#xff1b;2xx 200 204 026 成功3xx 重定向&#xff…

仿12306校招项目业务二(列车检索)

目录 验证数据 加载城市数据 查询列车站点信息 查询列车余票信息 构建列车返回数据 12306 项目中列车数据检索接口路径 &#xfeff; TicketController的pageListTicketQuery&#xfeff;。 GetMapping("/api/ticket-service/ticket/query")public Result<T…

带使能控制的锂电池充放电解决方案

一、产品概述 TP4594R 是一款集成线性充电管理、同步升压转换、电池电量指示和多种保护功能的单芯片电源管理 SOC&#xff0c;为锂电池的充放电提供完整的单芯片电源解决方案。 TP4594R 内部集成了线性充电管理模块、同步升压放电管理模块、电量检测与 LED 指示模块、保护模块…

Rust升级慢,使用国内镜像进行加速

背景 rustup 是 Rust 官方的跨平台 Rust 安装工具&#xff0c;国内用户使用rustup update的时候&#xff0c;网速非常慢&#xff0c;可以使用国内的阿里云镜像源来进行加速 0x01 配置方法 1. Linux与Mac OS用户配置环境变量 修改~/.bash_profile文件添加如下内容&#xff1…

【服务发现--ingress】

1、ingress介绍 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟…

if语句test

import com.sun.jdi.PathSearchingVirtualMachine;import java.sql.SQLOutput; import java.util.Scanner;public class Test5 {public static void main(String[] args) {//在电影院检查票据&#xff0c;票据在1-100之间才是真实有效的票据&#xff0c;且奇数做左边&#xff0…

2.25基础会计学

资本公积是指由股东投入、但不能构成“股本”或“实收资本”的资金部分。 盈余公积是指公司按照规定从净利润中提取的各种积累资金。 所以区别在于盈余公积来自净利润。 借贷其实就是钱从哪来和到哪去的问题&#xff0c;来源是贷&#xff0c;流向是借。比如购入9w原材料&…

Vue事件处理之v-on

1. 使用及定义 定义方法 function 方法名称(接受的event或是什么都不写) {//不管方法后括号内写与不写event,都可以接受到方法内表达式 }//定义一个接受参数的方法,此时也会在传入event function 方法名称(传入参数) {//可接受传入参数与event方法内表达式 } //定义一个接受参…

Cover和contain属性

一.背景的盒子 代码&#xff1a; <body><div class"box"></div><style>.box {width: 500px;height: 500px;border: 1px solid #ccc;background: url(./20191017095131790.png) no-repeat;}</style></body> 盒子的宽度和高度是…

软件游戏显示d3dx9_42.dll丢失的5种解决方法,快速解决dll问题

当计算机系统中d3dx9_42.dll文件丢失时&#xff0c;可能会引发一系列运行问题和功能异常&#xff0c;具体表现形式多样且影响范围较广。首先&#xff0c;对于依赖于DirectX 9.0c版本的各类应用程序&#xff0c;尤其是部分经典的老款游戏&#xff0c;由于d3dx9_42.dll是其中不可…

2024年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特…

Sentinel 动态规则扩展

一、规则 Sentinel 的理念是开发者只需要关注资源的定义&#xff0c;当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则&#xff1a; 通过 API 直接修改 (loadRules)通过 DataSource 适配不同数据源修改 手动通过 API 修改比较直观&#xff0c;…

代码随想录算法训练营第三天

● 自己看到题目的第一想法 203.移除链表元素 方法一&#xff1a; 思路&#xff1a; 设置虚拟头节点 dummyhead 设置临时指针 cur 遍历 整个链表 循环&#xff1a; 如果 cur !nullptr &&cur->next !nullptr 则 遍历链表 否则结束遍历 如果 cur->next val 则…

CSS之包含块(contatining block)

可能了解包含块的人很少&#xff0c;但有这么个问题&#xff0c;大家可以看看。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scal…

【架构】GPU架构总结

文章目录 GPU架构GPU渲染内存架构Streaming Multiprocessor(SM)CUDA CoreTensor CoreRT CoreCPU-GPU异构系统GPU资源管理模型 GPU架构演进G80 架构Fermi 架构Maxwell架构Tesla架构Pascal架构Volta 架构Turing架构Ampere 架构Hopper架构 参考文献 GPU架构 主要组成包括&#xf…

报错:org.springframework.jdbc.BadSqlGrammarException:

//报错 2024-02-24 19:44:10.814 ERROR 6184 --- [nio-9090-exec-5] c.e.exception.GlobalExceptionHandler : 异常信息&#xff1a; org.springframework.jdbc.BadSqlGrammarException: GPT&#xff1a; 根据异常信息&#xff0c;这是一个Spring框架抛出的BadSqlGrammar…