FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷

这篇具有很好参考价值的文章主要介绍了FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前情提要
FreeRTOS ~(四)同步互斥与通信 ~ (2/3)互斥的缺陷
举例子说明:利用队列解决前述的"互斥的缺陷"问题

static QueueHandle_t xQueueUARTHandle;

/* 利用队列的写数据和读数据来做类似标志位的工作,类似于锁,因此实际上并不关心这个数据表示的具体值是多少.
   而只在意数据是否写入队列,数据是否被读取走.
   队列在这里就相当于做了全局变量Flag的作用. */
int InitUARTLock(void)
{
	int val;
	/* 创建一个队列,只有1个Item,Item的大小是sizeof(int),因为val是int类型 */
	xQueueUARTHandle = xQueueCreate(1, sizeof(int));
	/* 创建队列有可能会失败,因此给一个返回值表示创建是否成功 */
	if (xQueueUARTHandle == NULL)
	{
		printf("can not create queue\r\n");
		return -1;
	}
	/* 创建完成就执行写队列操作,以此来激活队列使用,因为如果队列内没有数据,那么读取的Task就被阻塞了
	   可以看到,使用的时候,其实并不在意val的值是多少,而是利用FreeRTOS提供的队列机制,完成信号标志的切换 */
	xQueueSend(xQueueUARTHandle, &val, portMAX_DELAY);
	return 0;
}

void GetUARTLock(void)
{	
	int val;
	/* 在这个例子中,如果能够从队列中得到数据,那么就表明得到了串口的使用权 */
	xQueueReceive(xQueueUARTHandle, &val, portMAX_DELAY);
}

void PutUARTLock(void)
{	
	int val;
	/* 在这个例子中,使用完串口之后,要将串口释放掉,就通过写队列即可 */
	xQueueSend(xQueueUARTHandle, &val, portMAX_DELAY);
}

void TaskGenericFunction(void * param)
{
	while (1)
	{
		GetUARTLock();
		printf("%s\r\n", (char *)param);
		/* 如果这个通用函数内,没有最后那一行延时1个Tick的函数 vTaskDelay(1); 结果是怎么的?
		   对于main创建的任务而言,Task3与Task4的优先级一致均大于0,且Task4后创建,
		   那么任务调度器开启之后,先执行的任务是Task4,
		   在这里下一行代码就是释放串口使用权了,因此在本行,Task4在运行,Task3在等待获取串口权
		   当代码运行到下一行的时候,因为执行了写队列的操作,队列中有数据了,
		   因此Task3就立即变为了ready状态,但是Task4是running状态,因此仍然是Task4获取串口使用权,
		   那么最终的效果就是只有Task4独享了串口使用权,打印的效果就是:
		   Task 4 is running
		   Task 4 is running
		   Task 4 is running
		   Task 4 is running  ... 
		   因此必须加上延时,以确保当前执行的Task使用完串口打印功能后,主动放弃 */
		PutUARTLock();
		vTaskDelay(1);
	}
}

int main( void )
{
	prvSetupHardware();
	/*  */
	InitUARTLock();
	xTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);
	xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 4 is running", 1, NULL);
	/* Start the scheduler. */
	vTaskStartScheduler();
	return 0;
}
执行结果下:

FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷,嵌入式FreeRTOS学习笔记,FreeRTOS

这里用到了三个函数:
1.创建队列
2.写队列
3.读队列
详细的说明见下述链接文章末尾:

FreeRTOS ~(五)队列的常规使用 ~ (1/5)解决同步缺陷文章来源地址https://www.toymoban.com/news/detail-528260.html

到了这里,关于FreeRTOS ~(五)队列的常规使用 ~ (2/5)队列解决互斥缺陷的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FreeRTOS如何解决访问冲突/线程不安全(临界段、互斥锁、挂起调度、看门人任务)

    在多任务(多线程)系统中,存在一个隐患,那就是多线程的访问(在FreeRTOS中就是任务)。当一个任务A开始访问一个资源(外设、一块内存等),但是A还没有完成访问,B任务运行了,也开始访问,这就会造成数据破坏、错误等问题。 例如: 两个任务试图写入一个液晶显示

    2024年02月07日
    浏览(39)
  • FreeRTOS教程6 互斥量

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 本文主要学习 FreeRTOS 互斥量的相关知识, 包括优先级翻转问题、优先级继承、死锁现象、创建/删除互斥量 和 获取/释放互斥量等知识 使用二值信号量用于进

    2024年03月18日
    浏览(28)
  • 【STM32】FreeRTOS互斥量学习

    互斥量(Mutex) 互斥量又称互斥信号量(本质也是一种信号量,不具备传递数据功能),是一种特殊的二值信号量,它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性。比如有两个任务,A在运行,B就运行不了。 实验:创建三个任务,从高到低

    2024年02月13日
    浏览(27)
  • 五分钟学会使用FreeRTOS队列

    目录 何为队列? 示例代码 函数讲解 xQueueCreate xQueueSend xQueueReceive         在FreeRTOS中,队列是一种用于任务间通信的重要机制。队列可以用来在任务之间传递数据,实现数据的异步传输和共享。 队列的作用包括: 数据传输:任务可以通过将数据发送到队列中,供其他任

    2024年02月11日
    浏览(32)
  • FreeRTOS源码分析-10 互斥信号量

    目录   1 事件标志组概念及其应用 1.1 事件标志组定义 1.2 FreeRTOS事件标志组介绍 1.3 FreeRTOS事件标志组工作原理 2 事件标志组应用 2.1 功能需求 2.2 API  2.3 功能实现 3 事件标志组原理 3.1 事件标志组控制块 3.2 事件标志组获取标志位 3.3 等待事件标志触发 3.4 事件标志组设置标志

    2024年02月14日
    浏览(25)
  • FreeRTOS源码分析-9 互斥信号量

    目录 1 优先级翻转问题 2 互斥信号量概念及其应用 2.2FreeRTOS互斥信号量介绍 2.3FreeRTOS互斥信号量工作原理 3 互斥信号量函数应用 3.1功能分析 3.2API详解 3.3功能实现 4 递归互斥信号量函数应用 4.1死锁现象 ​编辑 4.2API详解 4.3解决死锁 5 互斥信号量实现原理 5.1互斥信号量创建

    2024年02月14日
    浏览(33)
  • 【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

    上一课: 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数 下一课: 【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验 1.1 时间管理 1.1.1 控制任务的执行周期 在任务函数的代码

    2024年02月04日
    浏览(42)
  • FreeRTOS的二值信号量和互斥量之间的区别和联系

    目录 1. 二值信号量和互斥量的作用 1.1 二值信号量的作用 1.2 互斥量的作用 2. FreeRTOS二值信号量和互斥锁关系 2.1 不同点 2.2 相同点 3. 如何选择 3.1 根据场景选择合适的同步机制 3.2 根据优先级设计同步机制 FreeRTOS是一款广泛应用于嵌入式系统中的实时操作系统,其中信号量(

    2024年02月06日
    浏览(28)
  • STM32F429 Discovery开发板应用:使用FreeRTOS队列+DMA双缓存实现串口数据接收

      参考帖子:https://blog.csdn.net/freedompoi/article/details/122350866 目前想要实现STM32F4自带的DMA双缓冲区,尝试过一版,结果不能预期,就使用了RxHalfCplt和RxCplt去实现DMA双缓冲区的效果。 现在有时间了,又重新实现STM32F4自带的DMA双缓冲区,作为参考。   MCU:STM32F429ZIT6 开发环境:

    2024年02月08日
    浏览(38)
  • STM32F4+FreeRTOS+LVGL实现嵌入式快速开发(缝合怪)

    极速进行项目开发,只需要懂一款芯片架构+一个操作系统+一个GUI。各种部件程序全靠抄 ,成为究极缝合怪。本文用stm32f407+FreeRTOS+lvgl演示一些demo。 原文链接:STM32F4+FreeRTOS+LVGL实现快速开发(缝合怪) lvgl官方的音乐播放器demo: 百问网的2048小游戏: STM32F407这款芯片就不多介绍

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包