文章目录

  • 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 分析

同二值信号量。

事件标志组还可以用来组合资源控制:


参考资料:

  1. 手把手教你学用嵌入式操作系统

事件标志组解决任务间资源共享问题相关推荐

  1. FreeRTOS 事件标志组

      FreeRTOS任务可以使用信号量来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步.有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量就无能为力了. FreeRTO ...

  2. 互斥量、临界区、信号量、事件标志组和消息邮箱

    为了好的理解互斥量.临界区.信号量.事件标志组和消息邮箱,下面一些知识对初学者来说很重要: 为了实现各任务之间的合作和无冲突的运行,在有关联的任务之间必须建立一些制约关系.这些制约关系主要有两种:直接 ...

  3. 互斥量、临界区、信号量、事件标志组和消息邮箱(转)

    互斥量.临界区.信号量.事件标志组和消息邮箱          为了好的理解互斥量.临界区.信号量.事件标志组和消息邮箱,下面一些知识对初学者来说很重要: 为了实现各任务之间的合作和无冲突的运行,在有 ...

  4. FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列, 但是在FreeRTOS中任务间的通讯还有信号量,邮箱,事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 ..增 ...

  5. 互斥信号量解决任务间资源共享问题

    文章目录 1 互斥信号量解决任务间资源共享问题 1.1 工作原理 1.2 任务访问流程 1.3 总结 1 互斥信号量解决任务间资源共享问题 1.1 工作原理 实例:tinyOS中的实现 1.2 任务访 ...

  6. 邮箱解决任务间资源共享问题

    文章目录 1 邮箱解决任务间资源共享问题 1.1 工作原理 1.2 设计原理 1 邮箱解决任务间资源共享问题 1.1 工作原理 将邮箱看作一个装锁的容器.在初始化的时候,向邮箱中存入一个消息,相当于存 ...

  7. 二值信号量解决任务间资源共享问题

    文章目录 1 二值信号量解决任务间资源共享问题 1.1 信号量定义 1.2 工作原理 1.3 任务访问流程 1.4 分析 1 二值信号量解决任务间资源共享问题 1.1 信号量定义 1.2 工作原理 实 ...

  8. 关中断解决任务间资源共享问题

    文章目录 1 关中断解决任务间资源共享问题 1.1 工作原理 1.2 任务访问流程 1.3 需要注意的地方 1 关中断解决任务间资源共享问题 1.1 工作原理 实例:关中断为tinyOS的影响 1.2 ...

  9. FreeRTOS源码分析与应用开发07:事件标志组

    目录 1. 概述 2. 事件标志组类型 3. 创建事件标志组 4. 删除事件标志组 5. 设置事件标志位 5.1 任务级设置 5.2 中断级设置 6. 清除事件标志位 6.1 任务级清除 6.2 中断 ...

最新文章

  1. 苹果地图副总裁_也许,苹果汽车的到来只是早晚问题
  2. android studio 多dex,AndroidStudio利用android-support-multidex解决64k的各种异常
  3. cdr文件过大导出pdf打不开_PDF快速导出JPG对应的分辨率技巧
  4. Oracle数据库备份报错12514,Oracle数据库备份导出时,出错:ORA-12514
  5. 银行现在都很缺钱吗,为什么给的利息比以前高了?
  6. H5新增的标签和属性
  7. NVLink技术及影响解析
  8. Nplayer本地文件拷到服务器,手把手教你简易NAS构建,手机/平板/智能电视随意调取,家庭存储云共享,有了自己的网络云盘后再也不用担心容量不够了!...
  9. Python赋值语句浅析
  10. 电商知识图谱的构建及搜索推荐场景下的应用实践
  11. Zookeeper脑图
  12. Android App跳转微信小程序教程
  13. 【编译原理】理解BNF
  14. 手机图片怎么转文本?
  15. python怎么算二元一次方程_Python简单实现二元一次方程求根
  16. MEION:Costas环 环路滤波器参数设置程序
  17. 利用php curl暴力破解urp账号密码
  18. java中隐函数求导法则_隐函数求导法则
  19. 动态规划C++实现--换钱的方法数(二)(动态规划及其改进方法)
  20. 《守望先锋》中的网络同步技术

热门文章

  1. 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第1章-绪论
  2. Ardino基础教程 16_一位数码管
  3. 【发布】温度监测报警器v1.2a内测版!
  4. 杨氏干涉的模拟的MATLAB仿真
  5. 拿到了B轮融资,但这家创业公司还是被天使投资人玩死了
  6. KubeCon + CloudNativeCon北美2018年会议透明度报告:一项破纪录的CNCF活动
  7. 写给MongoDB开发者的50条建议Tip6
  8. HDOJ--4786--Fibonacci Tree【生成树】
  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入
  10. Spring @Autowired、@Resource、@Required、@Component、@Repository、@Service、@Controller注解的用法和作用...