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

2024-02-26 14:04

本文主要是介绍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资源,计算速度会快一些。当然这只是一种例子,有一定的缺陷,当作学习使用。

本文完!

在这里插入图片描述

在这里插入图片描述

本文中使用的测试工程

这篇关于FreeRTOS学习第8篇--同步和互斥操作引子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/749113

相关文章

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

java Stream操作转换方法

《javaStream操作转换方法》文章总结了Java8中流(Stream)API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、... 目录流创建1、list 转 map2、filter()过滤3、foreach遍历4、groupingB

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后