事件标志组解决任务间资源共享问题
文章目录
- 1 事件标志组解决任务间资源共享问题
- 1.1 工作原理
- 1.2 分析
1 事件标志组解决任务间资源共享问题
1.1 工作原理
tinyOS的事件标志组实现:
代码:
/*** @brief tOS应用示例* @details* @author 01课堂 李述铜 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版权所有,禁止用于商业用途*/
#include "tinyOS.h"
#include "app.h"
#include "hal.h"static tTask task1; // 任务1结构
static tTask task2; // 任务2结构
static tTask task3; // 任务3结构
static tTask task4; // 任务4结构static tTaskStack task1Env[TASK1_ENV_SIZE]; // 任务1的堆栈空间
static tTaskStack task2Env[TASK2_ENV_SIZE]; // 任务2的堆栈空间
static tTaskStack task3Env[TASK3_ENV_SIZE]; // 任务3的堆栈空间
static tTaskStack task4Env[TASK4_ENV_SIZE]; // 任务4的堆栈空间int task1Flag; // 用于指示任务运行状态的标志变量
int task2Flag; // 用于指示任务运行状态的标志变量
int task3Flag; // 用于指示任务运行状态的标志变量
int task4Flag; // 用于指示任务运行状态的标志变量static uint32_t shareCount = 0; // 全局共享计数器static tSem shareCountSem;
static tFlagGroup shareCountFlagGroup;/*** 初始化共享计数器* @param count 初始的计数器*/
void shareCountInit (uint32_t count) {shareCount = count;
}/*** 增加共享计数器值* @param count 增加的数量*/
static uint32_t realCount = 0;
void shareCountIncrease (uint32_t count, int interrupt) {realCount += count;if (interrupt == 0) {shareCount += count;} else {// 以下展开,以便模拟汇编指令被打断的情况uint32_t var = shareCount;var = var + count;interruptByOtherTask(); // 模拟被其它任务打断shareCount = var;}
}/*** 获取共享计数器值* @return 当前计数值*/
uint32_t shareCountGet (void) {return shareCount;
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task1Entry (void *param) {uint32_t before;uint32_t resultFlag;#if 1tFlagGroupWait(&shareCountFlagGroup, TFLAGGROUP_SET_ANY|TFLAGGROUP_CONSUME, 0x1, &resultFlag, 0);shareCountIncrease(1, 1); xprintf("Task1 S1:%d/%d\n", shareCountGet(), realCount);tFlagGroupNotify(&shareCountFlagGroup, 1, 0x1);
#elsebefore = shareCountGet();shareCountIncrease(1, 0);interruptByOtherTask(); // 如果在这期间被打断xprintf("Task1 S2:%d/%d\n", before + 1, realCount);
#endiffor (;;) {tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task2Entry (void *param) {uint32_t before;uint32_t resultFlag;#if 1tFlagGroupWait(&shareCountFlagGroup, TFLAGGROUP_SET_ANY|TFLAGGROUP_CONSUME, 0x1, &resultFlag, 0);shareCountIncrease(1, 0);// task2的修改会被覆盖xprintf("Task2 S1:%d/%d\n", shareCountGet(), realCount);tFlagGroupNotify(&shareCountFlagGroup, 1, 0x1);
#elsebefore = shareCountGet();shareCountIncrease(1, 0);xprintf("Task2 S2:%d/%d\n", before + 1, realCount);
#endiffor (;;) {tTaskDelay(10);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task3Entry (void *param) {for (;;) {task3Flag = 1;tTaskDelay(1);task3Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task4Entry (void *param) {for (;;) {task4Flag = 1;tTaskDelay(1);task4Flag = 0;tTaskDelay(1);}
}/*** App的初始化*/
void tInitApp (void) {halInit();tFlagGroupInit(&shareCountFlagGroup, 0x1);shareCountInit(0);tTaskInit(&task1, task1Entry, (void *) 0x0, TASK1_PRIO, task1Env, sizeof(task1Env));tTaskInit(&task2, task2Entry, (void *) 0x0, TASK2_PRIO, task2Env, sizeof(task2Env));tTaskInit(&task3, task3Entry, (void *) 0x0, TASK3_PRIO, task3Env, sizeof(task3Env));tTaskInit(&task4, task4Entry, (void *) 0x0, TASK4_PRIO, task4Env, sizeof(task4Env));
}
1.2 分析
同二值信号量。
事件标志组还可以用来组合资源控制:
参考资料:
- 手把手教你学用嵌入式操作系统
事件标志组解决任务间资源共享问题相关推荐
- FreeRTOS 事件标志组
FreeRTOS任务可以使用信号量来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步.有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量就无能为力了. FreeRTO ...
- 互斥量、临界区、信号量、事件标志组和消息邮箱
为了好的理解互斥量.临界区.信号量.事件标志组和消息邮箱,下面一些知识对初学者来说很重要: 为了实现各任务之间的合作和无冲突的运行,在有关联的任务之间必须建立一些制约关系.这些制约关系主要有两种:直接 ...
- 互斥量、临界区、信号量、事件标志组和消息邮箱(转)
互斥量.临界区.信号量.事件标志组和消息邮箱 为了好的理解互斥量.临界区.信号量.事件标志组和消息邮箱,下面一些知识对初学者来说很重要: 为了实现各任务之间的合作和无冲突的运行,在有 ...
- FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)
我们在前面单独介绍过FreeRTOS的任务通知和消息队列, 但是在FreeRTOS中任务间的通讯还有信号量,邮箱,事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 ..增 ...
- 互斥信号量解决任务间资源共享问题
文章目录 1 互斥信号量解决任务间资源共享问题 1.1 工作原理 1.2 任务访问流程 1.3 总结 1 互斥信号量解决任务间资源共享问题 1.1 工作原理 实例:tinyOS中的实现 1.2 任务访 ...
- 邮箱解决任务间资源共享问题
文章目录 1 邮箱解决任务间资源共享问题 1.1 工作原理 1.2 设计原理 1 邮箱解决任务间资源共享问题 1.1 工作原理 将邮箱看作一个装锁的容器.在初始化的时候,向邮箱中存入一个消息,相当于存 ...
- 二值信号量解决任务间资源共享问题
文章目录 1 二值信号量解决任务间资源共享问题 1.1 信号量定义 1.2 工作原理 1.3 任务访问流程 1.4 分析 1 二值信号量解决任务间资源共享问题 1.1 信号量定义 1.2 工作原理 实 ...
- 关中断解决任务间资源共享问题
文章目录 1 关中断解决任务间资源共享问题 1.1 工作原理 1.2 任务访问流程 1.3 需要注意的地方 1 关中断解决任务间资源共享问题 1.1 工作原理 实例:关中断为tinyOS的影响 1.2 ...
- FreeRTOS源码分析与应用开发07:事件标志组
目录 1. 概述 2. 事件标志组类型 3. 创建事件标志组 4. 删除事件标志组 5. 设置事件标志位 5.1 任务级设置 5.2 中断级设置 6. 清除事件标志位 6.1 任务级清除 6.2 中断 ...
最新文章
- 苹果地图副总裁_也许,苹果汽车的到来只是早晚问题
- android studio 多dex,AndroidStudio利用android-support-multidex解决64k的各种异常
- cdr文件过大导出pdf打不开_PDF快速导出JPG对应的分辨率技巧
- Oracle数据库备份报错12514,Oracle数据库备份导出时,出错:ORA-12514
- 银行现在都很缺钱吗,为什么给的利息比以前高了?
- H5新增的标签和属性
- NVLink技术及影响解析
- Nplayer本地文件拷到服务器,手把手教你简易NAS构建,手机/平板/智能电视随意调取,家庭存储云共享,有了自己的网络云盘后再也不用担心容量不够了!...
- Python赋值语句浅析
- 电商知识图谱的构建及搜索推荐场景下的应用实践
- Zookeeper脑图
- Android App跳转微信小程序教程
- 【编译原理】理解BNF
- 手机图片怎么转文本?
- python怎么算二元一次方程_Python简单实现二元一次方程求根
- MEION:Costas环 环路滤波器参数设置程序
- 利用php curl暴力破解urp账号密码
- java中隐函数求导法则_隐函数求导法则
- 动态规划C++实现--换钱的方法数(二)(动态规划及其改进方法)
- 《守望先锋》中的网络同步技术
热门文章
- 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第1章-绪论
- Ardino基础教程 16_一位数码管
- 【发布】温度监测报警器v1.2a内测版!
- 杨氏干涉的模拟的MATLAB仿真
- 拿到了B轮融资,但这家创业公司还是被天使投资人玩死了
- KubeCon + CloudNativeCon北美2018年会议透明度报告:一项破纪录的CNCF活动
- 写给MongoDB开发者的50条建议Tip6
- HDOJ--4786--Fibonacci Tree【生成树】
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入
- Spring @Autowired、@Resource、@Required、@Component、@Repository、@Service、@Controller注解的用法和作用...