目录

1. 创建

2. 删除

3. 获取

4. 释放

5. 实例


信号量(Semaphore)的功能有一点与互斥量类似,同样是保护临界资源的一种有用方法。信号量可以但不一定实现互斥(不是说不能,一种情况是不存在共享临界区,谈不上互斥,另一种情况是允许共同进入临界区,比如读操作)。

它的运行机制可以理解为:信号量是一个正值,代表资源的可访问数目,当有任务访问时,这个数目减一,任务访问完成时,任务访问结束,释放他,让他加一,信号量为0时,其他任务则不能获取他,选择退出或者等待挂起,直到有信号量释放后,按照优先级来获取信号量,获取后就绪。

把资源想象成车位,信号量就是车位管理员,汽车需要停进有限的车位,当车位管理员发现车位足够时,则将汽车放行,如果车位数为0,则汽车都需要按照某种规则(比如按照优先级)等待空闲车位的出现。

1. 创建

同样,信号量的创建也分动态和静态两种方式,这里只考虑动态方式。

#define rtosSemCreate(                                  \handle                                              \name,                                               \value,                                              \flag                                                \)                                                   \{                                                   \handle = rt_sem_create(name, value, flag);      \}

参数:

handle - 信号量的句柄,属于返回值,创建成功则为非NULL值。

#define rtosSem_t                                       rt_sem_t

name - 信号量的名字,输入参数,字符串。

value - 信号量的默认值,一般是初始化为0

flag -  信号量的标志,支持2种方式:FIFO和PRIO。FIFO模式表示在多个线程等待信号量时,将按照先来先得的顺序获得信号量;PRIO模式表示在多个线程等待信号量时,将由优先级高的线程优先获得信号量。

2. 删除

系统不再使用信号量时,可通过删除信号量以释放系统资源。

#define rtosSemDelete(                                  \handle                                              \)                                                   \{                                                   \rt_sem_delete(handle);                          \}

3. 获取

线程通过调用该函数获取信号量来获得信号量资源实例,当信号量值大于零时,线程将获得信号量, 并且相应的信号量值会减 1;如果信号量的值等于零,那么说明当前信号量资源实例不可用,申请该信号量的线程将根据 time 参数的情况选择直接返回、或挂起等待一段时间、或永久等待,直到其他线程或中断释放该信号量。

#define rtosSemTake(                                    \handle,                                             \time,                                               \ret                                                 \)                                                   \{                                                   \ret = rt_sem_take(handle, time);                \}

返回0表示获取成功。

4. 释放

释放一个信号量,当信号量的值等于零时,并且有线程等待这个信号量时, 释放信号量将唤醒等待在该信号量线程队列中的第一个线程,由它获取信号量;否则 将把信号量的值加一

#define rtosSemRelease(                                 \handle,                                             \ret                                                 \)                                                   \{                                                   \ret = rt_sem_release(handle);                   \}

返回0表示释放成功。

5. 实例

和互斥量的实例类似,2个进程,一个进程负责修改变量,变量值变为10的倍数则释放信号量,这里连续释放2次信号量,另外一个负责显示变量的值,只有获取到信号量才打印变量值。2个进程的优先级依然是显示的优先级更高。

static rtosSem_t sem = NULL;
static uint8_t gSemValue = 0;
static void threadSemShow(void *parameter)
{while(1){uint32_t ret;rtosSemTake(sem, RTOS_WAIT_FOREVER, ret);if(ret == RTOS_EOK){Printf("Sem Value = %d\n", gSemValue);}else{Printf("Take sem fail\n");return;}}
}static void threadSemChange(void *parameter)
{while(1){uint32_t ret;gSemValue++;rtosThreadSleep(100);if((gSemValue % 10) == 0){Printf("Change thread release a semaphore.\n");rtosSemRelease(sem, ret);rtosSemRelease(sem, ret);}}
}static void semTestInit(void)
{rtosSemCreate(sem, "sem", 0, RTOS_IPC_FLAG_FIFO);rtosCreateThread(handle1,"Mutex S",threadSemShow,(void *)0,NULL,256,RTOS_PRIORITY_MAX - 2, 100);rtosCreateThread(handle2,"Mutex C",threadSemChange,(void *)0,NULL,256,RTOS_PRIORITY_MAX - 1, 100);rtosStartThread(handle1);rtosStartThread(handle2);
}

打印结果:

Change thread release a semaphore.
Sem Value = 10
Sem Value = 10
Change thread release a semaphore.
Sem Value = 20
Sem Value = 20
Change thread release a semaphore.
Sem Value = 30
Sem Value = 30
Change thread release a semaphore.
Sem Value = 40
Sem Value = 40
Change thread release a semaphore.
Sem Value = 50
Sem Value = 50

因为修改进程会释放2次信号量,所以显示进程会连续2次拿到信号量,从而打印了2次值。

RTT Nano学习笔记 8 - 信号量相关推荐

  1. RTT Nano学习笔记 1 - 准备工作

    RT-Thread Nano 是一个极简版的硬实时内核,适用于入门级 MCU 的场合.软件框图如下图: RT-Thread Nano 实时操作系统遵循 Apache 许可证 2.0 版本,实时操作系统 ...

  2. freeRtos学习笔记 (7)信号量

    freeRtos学习笔记 freeRtos信号量 信号量种类 信号量分为四种:二值信号量,互斥信号量,计数信号量和递归互斥信号量,其中计数信号量用于管理系统多个共享资源,用计数值表示可用资源数目;二值 ...

  3. Linux 学习笔记16 信号量

    Linux 学习笔记16 信号量Semaphore 信号量概念 信号量(或信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是控制进程(或线程)同步(谁先执行,谁后执行 ...

  4. 学习笔记--RTOS信号量

    学习笔记–RTOS信号量 本文基于正点原子RTOS开发指南,笔记自用,获取详细信息请关注正点原子官方账号 简介:信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问.和linux中的信号量差不 ...

  5. 【Jetson Nano学习笔记】2. ORB-SLAM3及ZED 2i驱动安装

    目录 ZED 2i驱动安装 安装驱动 自测 ROS测试 zed2i.launch rostopic list rosnode list display_zed2i.launch zed_rtabmap ...

  6. 哈工大操作系统学习笔记十——信号量与死锁

    哈工大os学习笔记十(信号量与死锁) 文章目录 哈工大os学习笔记十(信号量与死锁) 一. 信号量临界区保护 1.为什么要保护信号量 2.临界区 3.保护信号量的方法 3.1 轮换法 3.2 标记法 ...

  7. HarmonyOS_BearPi-HM Nano学习笔记之环境搭建

    前言:期待了已久的小熊派鸿蒙开发板终于出世了,12月11号准时抢到优惠券,果断下单,运费一起也就是29.9,实话说,很划算的,毕竟对自己的学习投资嘛,得舍得. 下面我把代码仓库.资料.视频课程地址贴出 ...

  8. FreeRTOS学习笔记之信号量

    一.创建信号量: 1. 动态创建信号量(自动分配内存): xSemaphoreCreateMutex:具有优先级继承关系,创建互斥信号量(一般用于保护全局变量,防止被意外修改): xSemaphore ...

  9. 【Jetson Nano学习笔记】4. python 3编译bridge

    目录 使用python3编译boost console_bridge python3+bridge 平台:Jetson Nano 系统版本:4.6.1 参考资料: How to setup ROS w ...

最新文章

  1. oracle类型sql转为mysql_Oracle和MySql之间SQL区别(等效转换以及需要注意的问题)...
  2. 代练怎么检测出来的_王者荣耀:代练熬夜打上王者,天美发来58个字,不敢收一分钱...
  3. 线性代数笔记:Frobenius 范数
  4. 分页请求json数据_pyspider抓取虎嗅网文章数据
  5. tms570 can 接收大量数据_超全!嵌入式必懂的CAN总线一文讲通了
  6. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 安装过程
  7. vagrant,流浪汉,我又来啦。
  8. 山东理工大学第七届ACM校赛-G 飞花的传送门
  9. 超过12000个零件,钢琴就是一部复杂的机器
  10. 程序员熬夜写代码,用C/C++打造一个安全的即时聊天系统
  11. Git学习(4)基本操作
  12. 第十一讲 在ASP.NET中使用用户控件
  13. js爬取网页文字图片 html爬取网页信息
  14. 通信技术以及5G和AI保障电网安全与网络安全
  15. 2016 年全国房价会呈什么趋势?
  16. Python 绘制正多边形
  17. 陈强教授《机器学习及R应用》课程 第十五章作业
  18. 7-45 实验8_2_推销员的便条 (100 分)
  19. java微信多客服_微信多客服聊天功能怎么实现?
  20. 做自媒体视频剪辑到哪里找素材?

热门文章

  1. Android aab打包报错(持续更新中~),android插件开发过时
  2. Windows下通过Git上传项目至Github
  3. SAP MM 固定资产采购订单
  4. 感谢ZhangYu dalao回关
  5. 吾生也有涯,而知也无涯,以有涯随无涯,殆己
  6. 开源H5棋牌 cocos creator微信棋牌小游戏 幼麟棋牌客户端分析笔记
  7. fly.js 的二次封装
  8. 硬件设备使用网线连接PC并访问外网
  9. Safari无法验证网站身份
  10. 股指期货开户的保证金和手续费是多少?怎么计算?