文章目录

  • 1 用信号量实现简单双向同步

1 用信号量实现简单双向同步

问题需求:

  • 两个或多个任务相互协同合作完成某一项任务。

    解决方案:
  • 使用A信号量发送启动命令,再使用B信号量报告工作完成。

    代码示例:
/*** @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;           // 用于指示任务运行状态的标志变量tSem task1WaitSem;
tSem task2WaitSem;/*** 任务的运行代码* @param param 任务初始运行参数*/
void task1Entry (void *param) {for (;;) {task1Flag = 1;tTaskDelay(1);tSemNotify(&task2WaitSem);tTaskDelay(1);tSemWait(&task1WaitSem, 0);task1Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task2Entry (void *param) {for (;;) {tSemWait(&task2WaitSem, 0);task2Flag = 1;tTaskDelay(1);tSemNotify(&task1WaitSem);task2Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @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();tSemInit(&task1WaitSem, 0, 1);tSemInit(&task2WaitSem, 0, 1);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. 手把手教你学用嵌入式操作系统

使用信号量实现简单双向同步相关推荐

  1. 干货 | 五大实例详解,携程 Redis 跨机房双向同步实践

    作者简介 Nick,携程软件技术专家,关注分布式数据存储以及操作系统内核. 前言 在<携程 Redis 跨 IDC 多向同步实践>一文曾和大家分享过携程在 Redis 双向同步方面的心得, ...

  2. mysql主从双向同步复制

    2019独角兽企业重金招聘Python工程师标准>>> Mysql 主从双向同步复制 MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务 ...

  3. MySQL 数据库双向同步复制

    MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约. 问题和制约 数据库的双主双写并双向同步场景,主要考虑数据完整性.一致性和避免冲突.对于同一个库,同一张表,同一个记录中的 ...

  4. Lsyncd:负载均衡之后,服务器的文件双向同步

    场景描述:     在 Linux 服务器上,通过使用 Nginx 实现负载均衡,或者在阿里云直接购买负载均衡,根据配置的转发规则,不同的请求会被转发到其不同的服务器上进行处理.如果遇到需要上传图片的 ...

  5. Windows和Linux VPS/GDrive之间文件夹的实时单向/双向同步教程

    说明:一般我们同步Windows和Linux之间的文件时,常用的方法有nfs挂载,inotify + rsync同步等,有钱的或许会买成熟的storenext系统,当然后者基本上都是公司在用,stor ...

  6. DMHS DM8到Oracle12c PDB双向同步(大小不敏感+落地文件转发)

    文章目录 前言 架构思路 数据库配置 ODBC配置 DMHS配置 配置dmhs_trans_ora.hs 配置dmhs_trans_dm8.hs 配置dmhs_bi_ora.hs 配置dmhs_bi_ ...

  7. 快速搭建DMHS DM之间双向同步

    快速搭建DMHS DM之间双向同步 1. 场景介绍 2. RPO与RTO概念 3. 双向同步原理 4. 搭建过程 4.1 准备AB测试库 4.2 开启归档和逻辑日志 4.3 初始化DMHS相关DDL触 ...

  8. Otter 双向同步mysql

    一.Otter目前支持了什么 1. 单向同步, mysql/oracle互相同步 2. 双向同步,无冲突变更 3. 文件同步,本地/aranda文件 4. 双A同步,冲突检测&冲突补救 5. ...

  9. SymmetricDS 数据库双向同步开源软件入门

    一句话概括该软件:SymmetricDS是一个文件和数据库同步软件,开源的,支持多主复制,同步时过滤和在异构的网络环境中进行数据转换传输.它支持单向和双向上的多个订阅者,异步的数据复制. 以下是从CS ...

最新文章

  1. Linux绝对路径和相对路径简单介绍
  2. 42021高考成绩查询北京6一个,北京高考成绩查询时间:6月27日
  3. 简易的AJAX工具[转]
  4. CSS基础「六」元素的显示与隐藏
  5. Spring JDBC模板惯用方式
  6. python实现目标检测_由浅入深:教你如何构建一个行人目标检测模型(Python)
  7. 用SQL Server 2017图形数据库替换数据仓库中的桥表
  8. 不抛出异常的swap
  9. latex 设置pdf的页边距
  10. NumPy 简单应用
  11. 第六、七章重点知识点总结
  12. 【ER网络?BA网络?WS网络?NW网络?】复杂网络分析+数据集+代码实现
  13. 手机屏幕测试html,华为手机屏幕检测代码是什么
  14. 如何下载网页中的视频文件?
  15. 互联网产品运营日记(1):上线首日
  16. 常见五轴机床的机械结构形式讲解!
  17. python基础之文件处理
  18. polar码译码——快速SC译码算法
  19. 宽带连接连接被远程计算机终止 619,连接宽带时出错代号的含义
  20. iosetup mysql_InnoDB:Error:io_setup()failedwithEAGAIN

热门文章

  1. 南京晓庄学院大一第二学期计算机数据结构期末考试试卷及答案,南京晓庄学院数据结构题库参考标准答案...
  2. 【控制】蚁群算法(ACO,Ant Colony Optimization)及 Matlab 实现
  3. 动手学深度深度学习-pycharm中配置mxnet开发环境
  4. 生成release版本的Android系统
  5. 【s操作】轻松优雅的解决孩子的小学数学题
  6. AMDF换成ACF和AMDF合作算法
  7. 英特尔将Nervana技术融入产品路线图
  8. Hibernate之一级缓存和二级缓存
  9. 解决Sublime包管理package control 报错 There are no packages available for installation
  10. RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”...