目录 前言 12.1 实现事件机制的预备知识 12.1.1 守护任务 12.1.2 事件的不确定性 12.1.3 事件组的报文 12.2 事件概念 12.3 事件用途参考 12.4 事件实现原理简述 12.5 事件实现需要克服的问题 12.5.1 避免在用户的应用程序中创建竞争条件 12.5.2 避免不确定性 12.6 事件控制块 12.7 创建事件 12.8 事件置位 12.9 事件置位中断版 12.10 等待事件 12.11 清除事件 12.12 删除事件 前言 默认以32bit事件类型和任…
以下转载自安富莱电子: http://forum.armfly.com/forum.php 为什么要使用事件标志事件标志组是实现多任务同步的有效机制之一.也许有不理解的初学者会问采用事件标志组多麻烦,搞个全局变量不是更简单?其实不然,在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了. 使用全局变量相比事件标志组主要有如下三个问题: 使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现. 使用了全局变量就…
以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 计数信号量的另一种实现方式----基于任务通知(Task Notifications)的计数信号量,这里我们将这种方式实现的计数信号量称之为任务计数信号量. 任务计数信号量效率更高,需要的 RAM 空间更小.当然,缺点也是有的,它没有之前介绍的计数信号量实现的功能全面. 任务通知(Task Notifications)介绍FreeRTOS 每个已经创建的任务都有…
假设你已经看过FreeRTOS 事件标志组这篇随笔了. 之前的基础篇,真的就只是简单了解一下,相当于大学实验室的实验,但是,我们实际公司项目中,需要更多地思考,就算我们之前只是学习了基础概念以及基础语法,只要我们勤加思考,就能灵活的运用基础知识了,基础是内功,基础打好了,功力自然上升. 事件标志组的概念就不再解释了,直接来正题. 你一定和我刚开始接触FreeRTOS一样,知道了事件标志组,也调用过API函数,并且也实现了开发板上历程的功能,不过开发板历程仅仅是介绍了某些API函数的用法,仅仅使用…
实验 //设置事件位的任务 void eventsetbit_task(void *pvParameters) { u8 key; while(1) { if(EventGroupTask_Handler!=NULL) { key=KEY_Scan(0); switch(key) { case KEY0_PRES: xTaskNotify((TaskHandle_t )EventGroupTask_Handler,//接收任务通知的任务句柄 (uint32_t )EVENTBIT_0, //要更…
前言 参考: https://www.freertos.org/RTOS-task-notifications.html 原文:https://www.cnblogs.com/lizhuming/p/16557005.html 任务通知实现原理个人构想 任务通知的实现机制和消息队列和事件标志机制不一样. 消息队列和事件标志机制实现需要的资源,数据结构都是需要申请,创建的,独立于内核,分离于任务的组件. 这些组件的实现构想都是拿个内存块组成数据结构,一部分内存做信息传递,一部分内存做阻塞链表等等,…
FreeRTOS事件标志组 事件标志组简介 1. 事件位(事件标志) 事件位用于表明某个事件是否发生,事件位通常用作事件标志,比如下面的几个例子: 当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置1,当队列中没有消息需要处理的时候就可以将这个位(标志)置0. 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置1,当没有数据需要从网络发送出去的话就将这个位(标志)置0. 现在需要向网络中发送一个心跳信息,将某个位(标志)置1.现在不需要项网络中发送心跳信息,这个位(标志)置…
事件标志是一个用来实现同步的对象,由多个位组成,用作指示对应事件存在的标志.事件标志由用来指示对应事件存在的位模式(bitpattern)和一个等待事件标志的任务队列组成. uTenux提供了一组API用于处理事件标志:创建.删除.设置.等待.清除. 1.创建事件标志:tk_cre_flg 为建立的事件标志分配一个控制块 事件结构体: typedef struct t_cflg { VP exinf; /* 事件标志扩展信息 */ ATR flgatr; /* 事件标志的属性 */ UINT i…
多线程 等待一次性事件 future概念 背景:有时候,一个线程只等待另一个线程一次,而且需要它等待的线程的返回值. 案例:滴滴叫车时,点完了叫车按钮后,叫车的后台线程就启动了,去通知周围的出租车.这时,用户就可以去干别的了,而且用户只等待叫车的线程一次就够了,也就是有出租车应答了,这个等待就结束了,不会去再次等待有别的出租车应答.应答后,叫车的线程会返回出租车的车牌号,出租车的位置等信息,给叫车的用户. 问题:实现上面的场景,很容易就联想到用多线程去实现,但是std::thread是没有返回值…
信号量 事件标志和消息队列分别应用于什么场景(反正我学的时候有点闹不清,现在总结一下): 信号量和事件标志用于任务同步.详细来说,这个功能可以替代以前裸机中你打一个标记的功能,比如使用了一个定时器,500ms到的时候,需要扫描一次键盘,为了尽快处理完中断,需要打一个标记,在主函数中做键盘扫描的具体实现.在这期间,主函数要一直查询标记是否被置位,一旦发现标记置位,就开始做处理.这种通信方式被称为同步.ucos中信号量和事件标志都可以用作任务间同步,或任务与ISR之间的同步. 区别在于:信号量用于单…