前言
信号 signal,并不是线程间同步的信号量 semaphore。后者是线程间同步机制的一种,而前者是线程间异步通信的一种。
官方文档里对其解释是:“信号(又称为软中断信号),在软件层次上是对中断机制的一种模拟,在原理上,一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。”
信号本质是**软中断**,用来通知线程发生了异步事件,**用做线程之间的异常通知、应急处理**。一个**线程不必通过任何操作来等待信号的到达**,事实上,**线程也不知道信号到底什么时候到达**。线程之间可以互相通过调用 `rt_thread_kill` 发送信号。
以上画线部分是我特意要大家注意的,我们要看待中断回调函数那样,看待信号回调函数**被执行的实机**,但不需要过分担忧的是回调函数**执行时间**,因为**终究信号回调函数还是在线程上下文被执行的**。
从官方文档可以清楚了解到,使用信号很简单,安装信号、解除信号掩码、发送信号、处理信号等几个过程。
更多关于信号的原理详见官方文档 [信号]( https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/ipc2/ipc2?id=%e4%bf%a1%e5%8f%b7 )
一个示例引起的血案
官方原版示例笔者就不贴出来了,直接拷贝到自己的项目完美运行。但是,笔者经过如下修改,发现一点儿疑问。
/* 线程 1 的入口函数 */
static void thread1_entry(void *parameter)
{
...
while (cnt < 10)
{
...
tick = rt_tick_get();
rt_thread_mdelay(1000);
tick = rt_tick_get();
}
...
}
把延时时间增长,前后添加测时。多次运行发现 tick 值改变只有 300 (`rt_thread_mdelay(300)`)。这说明了线程响应 signal 后,处理了信号回调函数之后放弃了之前的延时!那么问题来了,应用层想要的延时时间不足,应用层知道吗?答案是,*不知道!*
rt-thread 中阻塞函数列表
前一段时间在文章 rt-thread 那些你必须知道的几类 api 里总结了 *禁止在中断中调用*、*必须在任务调度器运行以后才能使用*、*不能用在线程自己身上*的几类 api。
可能还缺一种:哪些 api 会引起线程调度,使得当前线程放弃 cpu 使用权——所有调用 `rt_schedule` 的函数都属于这类。这里边又分三种情况,一种是时间片耗尽让出 cpu 使用权;一种是释放资源或者信号让出 cpu 使用权;还有一种是等待资源而被动放弃 cpu。最后这种情况,是有目地的,往往希望有资源可用了之后从阻塞中恢复继续运行,如果线程从阻塞中恢复运行但同时没有资源可用是不是就乌龙了?以下的关注重点也是这类函数。
所有第三类引起线程调度的函数和上面的 `rt_thread_mdelay` 一样,在 signal 面前可能遇到一样的遭遇。大体上,分这么几类:
-
延时函数
-
线程间同步机制函数
-
线程间通信机制部分函数(signal除外)
-
posix 下的 select poll 等接口(可能使用了线程间同步和通信机制)
这几类在遇到 signal 之后行为分别是什么样的?
被阻塞函数遇到 signal 后什么反应?
延时函数遇到 signal
这个前面已经经过测试的了,它会退出阻塞提前结束延时,但是应用层并不知道是达到延时时间还是有信号。
线程间同步通信机制函数遇到 signal
-
`rt_sem_take` 线程 error 非 RT_EOK (包括 RT_EINTR)直接返回线程错误状态
/* do schedule */
rt_schedule();
if (thread->error != RT_EOK)
{
return thread->error;
}
-
`rt_mutex_take` 考虑到了 signal 的影响,返回继续阻塞等待 `time` 时间。这是 ipc 里唯一例外的一个。
/* do schedule */
rt_schedule();
if (thread->error != RT_EOK)
{
#ifdef RT_USING_SIGNALS
/* interrupt by signal, try it again */
if (thread->error == -RT_EINTR) goto __again;
#endif /* RT_USING_SIGNALS */
其它,其余的 ipc 都和 `rt_sem_take` 一样。
完成量遇到 signal
`rt_completion_wait` 返回线程错误状态。
/* do schedule */
rt_schedule();
/* thread is waked up */
result = thread->error;
level = rt_hw_interrupt_disable();
}
}
...
return result;
select poll 等接口与 signal
因为文件描述符对应的设备不尽相同,设备底层实现 `poll` 的方式可能也千差万别,但是他们大概率是使用上面的线程间同步和通信机制了。
`poll` 实现过程调用个超时等待函数 `poll_wait_timeout` ,它也没有区分超时和信号两种情况。
rt_schedule();
level = rt_hw_interrupt_disable();
}
ret = !pt->triggered;
rt_hw_interrupt_enable(level);
return ret;
我们发现,`rt_sem_take` 结束了阻塞,并可能返回了 `RT_EINTR` ,而 `rt_mutex_take` 继续了循环阻塞。
等待资源而被动放弃 cpu 时怎么应对 signal 才合适?
现做以下约定,等待资源而被动放弃 cpu 的线程在此约定下,当有 signal 的时候会提前结束阻塞,返回应用层,应用层可以根据线程错误状态区别处理。
1. 复位线程错误状态为 `RT_EOK` 。
2. 调用 `rt_schedule` 进行线程调度,线程被阻塞挂起。
3. 从 `rt_schedule` 恢复唤醒,有一定手段通知到应用层(返回线程错误状态),应用层可以区分出是因为资源可用还是因为信号。
哪些 api 做到了以上这几点呢?
```
rt_completion_wait
rt_sem_take
rt_event_recv
rt_mb_send_wait
rt_mb_recv
rt_mq_send_wait
rt_mq_recv
rt_data_queue_push
rt_data_queue_pop
rt_mp_alloc
哪些 api 没有做到以上几点?
```
rt_mutex_take
rt_thread_sleep
rt_thread_delay
rt_thread_delay_until
rt_thread_mdelay
rt_wqueue_wait
笔者曾经在 gitee 上提交过一个 [issue]( https://gitee.com/rtthread/rt-thread/issues/I44JNS ) ,当时笔者隐隐中认为 ipc 中的不一致行为总有些隐患,感觉所有的阻塞等待都应该处理一下意外唤醒后的超时等待。却没意识到有什么意外情况可以让这些函数从阻塞等待中提前退出。通过研究 signal 实现原理的过程中发现,这种意外情况还有存在的,只是担忧的问题重点变了,不是处理阻塞等待剩余时间,而是在 signal 的影响下通知应用层的问题。
解决方案
有了上面的梳理,下面的修改方向就有了,改动范围也确定了。
-
几个延时函数返回 `thread->error` 代替目前的 `RT_EOK` ;
-
`rt_mutex_take` 去掉 `goto __again` 也返回 `thread->error` ;
-
`rt_wqueue_wait` 返回 `thread->error` 代替目前的 `RT_EOK` 。
-
`poll` 目前返回值是 >= 0 的,返回 0 可能是超时,也可能是被信号中断了。暂时不发表修改意见。
结束语
以上搜索不一定完整完全,但应该包括了大部分受到影响的函数。如果看客有发现其它的 api 有不符合上述约定行为的,请留言告知,谢谢!
本人能力有限,文中难免有错误。望各位同仁不吝赐教。
相关文章
rt-thread 优化系列(0) SysTick 优化分析
rt-thread 优化系列(一) 之 过多关中断
rt-thread 优化系列(二) 之 同步和消息关中断分析
rt-thread优化系列(三)软定时器的定时漂移问题分析
审核编辑:汤梓红
相关推荐
近年来,处理器性能越来越强,无论是通用处理器还是嵌入式处理器,都进入了多核处理器时代,多核处理器中,....
电子设计 发表于 07-01 12:04
•
48次
阅读
开始实验前,开发板 SDK 请选择 1.0.7 之后的版本
最终的工程可以在这里下载 wav_player_rom.zip
使能相关组件
需要使用到...
发表于 07-01 11:53 •
513次
阅读
rt-thread studio 安装
首先需要确保已经安装 rt-thread studio
在工具栏找到 SDK 管理器,点击后在弹出窗口,Board_Supp...
发表于 07-01 11:41 •
354次
阅读
一文带你深入理解 RT-Thread I/O 设备模型 — UART 设备源码分析。
矜辰所致 发表于 07-01 11:24
•
232次
阅读
开发环境:RT-Thread Studio
开发板:Art-Pi
OS版本:4.0.3
硬件
显示屏:金逸晨GMG12864-03A
温湿度:DHT1...
发表于 07-01 11:24 •
273次
阅读
问题发生位置:drv_eth.c文件rt_stm32_eth_tx函数中(254行)
修复方法:stm32f4xx_hal_eth.h头文件631行Lock成员变量定义为...
发表于 07-01 11:12 •
457次
阅读
一、功能简介
在window系统中将rtthread移植到zynq
在sdk中实现无bsp的zynq工程调试
在zynq中演示rtthread的shell功能
二、配...
发表于 07-01 10:48 •
709次
阅读
1、Linux RIL的概述与驱动
在移动网络通信中,尤其是智能手机,平板等智能设备中,RIL是一个非常重要的组件,RIL使各...
发表于 07-01 10:29 •
1079次
阅读
1、移植RIL到ART-Smart之共享内存简析
本次移植的linux ril中,rild作为一个client与modem通过AT命令交互,同时也作为...
发表于 07-01 10:17 •
1142次
阅读
在FPGA设计中我们经常会遇到对一个信号进行延时的情况,一般只延时一个或几个CLK时,通常是直接打拍....
发表于 06-30 17:39 •
152次
阅读
事情还是得从RTTHREAD 官方的文档Keil 模拟器 STM32F103 上手指南
说起,用了很久的KEIL,相信大家很少有人用...
发表于 06-30 17:12 •
3254次
阅读
内核是操作系统最重要的部分,学习RT-Thread也是从最基本的内核开始。 RT-Thread内....
发表于 06-30 17:10 •
90次
阅读
硬件介绍
NuMaker-IoT-M487 开发板以 NuMicro M487 系列微控制器为主控核心,主频 192MHz,512KB FLASH,160K...
发表于 06-30 17:01 •
3175次
阅读
MCU启动文件(startup.s)里定义的 Stack 是 1KB
Stack_Size EQU 0x00000400
Rt-Thread 也定义了一个 Stack
请...
发表于 06-30 16:52 •
5769次
阅读
介绍Windows下通过 Uboot TFTP 方式下载和启动rt-smart 内核
学完 RT-Thread 内核,从本文开始熟悉了解 RT-Thread I/O 设备管理相关知识。
矜辰所致 发表于 06-30 10:38
•
1227次
阅读
采用麻雀一号为主控设备来实现,摄像头数据,人体红外感应或门开关来判断是否有人闯入机房。通过Node-....
极速紫韵 发表于 06-30 06:45
•
1343次
阅读
本项目采用到硬件方案是:通过ART-Pi STM32H750主板上的I2C引脚和UART以及一个普通....
极速紫韵 发表于 06-30 06:22
•
1306次
阅读
基于RT-Thread和中蓝讯科开发板,实现按键触发语音报警和NodeRed收集报警信息并上报腾讯云....
极速紫韵 发表于 06-30 00:36
•
1172次
阅读
应用篇-在STM32L051上使用RT-Thread 第五篇,也是本次应用的完结篇。
矜辰所致 发表于 06-29 10:34
•
1466次
阅读
如果传输线阻抗50Ω,Cin=3pf,则τ10-90=0.33ns。如果信号的上升时间小于0.33n....
硬件攻城狮 发表于 06-28 15:51
•
1782次
阅读
应用篇-在STM32L051上使用RT-Thread 第四篇,巧妙的使用信号量处理串口通讯。
矜辰所致 发表于 06-28 10:59
•
1499次
阅读
滑环为一种工作于旋转部件的零件,其必定是有损耗的,因此其使用寿命也是由年限的,本文将介绍延长滑环使用....
晶沛电子 发表于 06-28 10:55
•
80次
阅读
应用篇-在STM32L051上使用RT-Thread 第三篇,学习RT-Thread Studio如....
矜辰所致 发表于 06-27 10:32
•
1431次
阅读
应用篇-在STM32L051上使用RT-Thread 第二篇,使用STM32CubeMX 进行对应外....
矜辰所致 发表于 06-26 14:02
•
2175次
阅读
我们知道,在写裸机程序时,当我们完成硬件初始化后,就需要在主函数中进行调用。当我们使用RT-Thre....
嵌入式大杂烩 发表于 06-25 21:38
•
3252次
阅读
学完了 RT-Thread 内核基础,来使用 RT-Thread 实现一个小应用。
硬件平台:ST....
矜辰所致 发表于 06-25 20:45
•
3440次
阅读
在ESP32上面运行 RT-THREAD.
作为一种安装在机电设备上用来360°旋转传输电能、信号、气液等介质的连接件,滑环在很多领域都有应用,....
晶沛电子 发表于 06-24 15:53
•
155次
阅读
光纤色散是指由于光纤所传输的信号是由不同频率成分和不同模式成分所携带的,不同频率成分和不同模式成....
发表于 06-24 15:17 •
23次
阅读
然而,高速电路是什么,什么信号才属于高速信号?这是笔者曾在一次面试中被问到过的一个问题,当时脑袋中迅....
硬件攻城狮 发表于 06-24 11:16
•
143次
阅读
RT-Thread 内核部分最后一个点 中断管理,顺带着对前面所学知识做个小结。
矜辰所致 发表于 06-24 10:25
•
3394次
阅读
figure class=image image_resized style=width:55%;n....
发表于 06-23 15:14 •
25次
阅读
基于NK-980IoT的国学唐诗学习机 1 项目背景 最近一直在陪小孩学习国学精髓,比如唐诗、宋词这....
无论是在家里还是在公司,安防都尤为的重要,与其亡羊补牢,更重要的是防患于未然。安全是目的,防范是....
有两位网友说了,可以从修正下同轴连接器的角度出发,把超过绿油部分的连接器底座的区域磨掉。恩,这个方法....
高速先生 发表于 06-23 14:21
•
127次
阅读
很久之前就开始整理下面的优化项列表了,但是有很多问题研究不深,一时不敢冒失推出。
出出 发表于 06-23 10:21
•
2403次
阅读
记得最初学习 RT-Thread ,对于内存管理我也是简单看看然后一笔带过,当时觉得用不上,在我做的....
矜辰所致 发表于 06-23 10:11
•
270次
阅读
区别于 rt-thread 内核实现的两种定时器,这种定时器依赖芯片内置的定时器外设,依靠稳定高速的....
出出 发表于 06-23 10:10
•
1522次
阅读
XI4-Stream跟AXI4的区别就是AXI4-Stream去除了地址线,这样就不涉及读写数据的概....
FPGA之家 发表于 06-23 10:08
•
135次
阅读
所谓软定时器,是由一个线程运行维护的定时器列表。由线程调用定时器回调函数。
出出 发表于 06-23 09:35
•
1487次
阅读
手把手教你使用RT-Thread制作GD32 RISC-V系列BSP 熟悉RT-Thread的朋....
嵌入式大杂烩 发表于 06-22 19:44
•
2081次
阅读
讲完了线程同步的机制,我们要开始线程通讯的学习,
矜辰所致 发表于 06-22 10:06
•
253次
阅读
本周笔者花了好多天的时间,计划从多个方面对串口驱动做个比较。下面就从以下几个角度做个对比测试。
出出 发表于 06-22 09:22
•
1363次
阅读
在前一篇文章里,大致提出了我的串口驱动框架理论。里面做了一些对串口驱动特性的幻想。也在 NUC970....
出出 发表于 06-22 09:03
•
1471次
阅读
熟悉RT-Thread的朋友都知道,RT-Thread提供了许多BSP,但不是所有的板子都能找到相应....
嵌入式大杂烩 发表于 06-22 08:54
•
1484次
阅读
了解信号的对称性如何可以简化计算傅里叶系数时,用来找到电路的稳态响应
发表于 06-21 14:38 •
38次
阅读
上文说到 RT-Thread 对临界区的处理方式有多种,其中已经分析了关闭调度器和屏蔽中断的方式,
....
矜辰所致 发表于 06-21 10:40
•
2733次
阅读
串口驱动三种工作模式:轮询、中断、DMA。
出出 发表于 06-21 10:37
•
2203次
阅读
书接前文,上篇优化聊的是关中断操作,在很多地方过保护,导致关中断时间太久,可能引起其它中断不能及时响....
出出 发表于 06-21 09:47
•
1931次
阅读
关于优化的话题永远不过时,没期限。
出出 发表于 06-21 09:03
•
1481次
阅读
论坛里有人提出了一个疑问,说 STM32 系列 bsp 在初始化系统时钟的过程中使用到了 tick ....
出出 发表于 06-21 08:55
•
1321次
阅读
本文聊聊临界区,以及RT-Thread对临界区的处理
矜辰所致 发表于 06-20 16:06
•
2205次
阅读
调试 stm32 的usb host 的艰辛历程。希望有遇到相同问题的人能从中发现点儿什么。
出出 发表于 06-20 15:24
•
265次
阅读
RT-Thread第4课,听听 RT-Thread 的心跳,再学习一下基于心跳的软件定时器使用。
矜辰所致 发表于 06-20 11:50
•
2293次
阅读
serialX 作为一个非阻塞串口驱动框架,在遇到一些异常时,需要做一些特殊处理,今天,笔者带大家来....
出出 发表于 06-20 11:43
•
328次
阅读
CLK的每个周期为12us。若在某个时刻,CLK处于下降沿,若此时DO为高电平则取“1”,低电平则取....
FPGA之家 发表于 06-20 10:22
•
178次
阅读
开发环境: RT-Thread版本:4.0.3 操作系统:Windows10 Keil版本:V5.3....
嵌入式大杂烩 发表于 06-20 00:26
•
1941次
阅读
信息1N4148WT快速开关二极管(Trr < 4.0nsec)扁平引线、小于0.70mm高度的表面贴装器件超小型塑料封装SOD523F湿度敏感度为1无铅版本且符合RoHS标准雾锡(Sn)镀铅层绿色塑封混合材料规格参数产品种类:发光二极管(通用、电源、转换) 峰值反向电压:75V 正向连续电流:0.3A 配置:Single 恢复时间:4ns 最大反向漏泄电流:5uA 工作温度范围:+150℃ ~ -55℃ 安装风格:SMD/SMT 二极管型:标准 RoHS:是 安装类型:表面贴装 箱体:SOD-523F-2 包装:剪切带(CT)电路图、引脚图和封装图...
发表于 04-18 20:01 •
718次
阅读
应用 此产品是一般用途,适用于许多不同的应用。 电路图、引脚图和封装图
发表于 04-18 20:01 •
284次
阅读
信息 1N916 此产品是一般用途,适用于许多不同的应用。
发表于 04-18 20:01 •
463次
阅读
WT 特性 快速开关二极管(Trr
发表于 04-18 20:00 •
279次
阅读
信息 1N916B 此产品是一般用途,适用于许多不同的应用。
发表于 04-18 20:00 •
240次
阅读
率MOSFET采用安森美半导体的沟槽技术生产,该技术专门用于最大限度地降低栅极电荷和低导通电阻。该器件适用于低栅极电荷驱动或低导通电阻要求的应用。 特性 优势 高压(100V) 用于存储48V的LiB电路 高速开关和低损耗 对应于电机电路所需的特性 符合RoHS标准 环境考虑 4V驱动器 ESD二极管保护门 应用 终端产品 锂离子电池充电和放电C平衡 锂离子电池充电器 电路图、引脚图和封装图...
发表于 04-18 19:55 •
178次
阅读
信息高压NPN双极晶体管设计用于通用开关应用。该器件采用TO-92封装,专为中等功率应用而设计。 可提供无铅封装 电路图、引脚图和封装图
发表于 04-18 19:54 •
983次
阅读
信息高压NPN双极晶体管设计用于通用开关应用。该器件采用TO-92封装,专为中等功率应用而设计。 可提供无铅封装 电路图、引脚图和封装图
发表于 04-18 19:54 •
292次
阅读
信息 PNP双极晶体管设计用于线性和开关应用。该器件采用TO-92封装,专为中等功率应用而设计。 可提供无铅封装* 电路图、引脚图和封装图
发表于 04-18 19:53 •
754次
阅读
信息优势和特点 接受发送器输入(0-20mA或4-20mA) 提供发送器环路电源 100 Hz带宽 1-5V或0-10V输出Additional 7B Resources: Accessories and Backplanes Sales and Service: North America (SCS Embedded Tech), Rest of World电路图、引脚图和封装图
发表于 04-18 19:49 •
345次
阅读
信息优势和特点 接受所有常见TC输入(J, K, T, E, R, S, B) 内部CJC和开路TC检测 与传感器温度成比例的线性输出 0至+10 V输出Additional 3B Resources: Accessories, Backplanes and Power SuppliesSales and Service: North America (SCS Embedded Tech), Rest of WorldDownload a PDF copy of this user manual电路图、引脚图和封装图
发表于 04-18 19:45 •
203次
阅读
信息优势和特点 接受交流输入 20mV至1V输入 交流电流检测应用 3 Hz带宽 电压(± 10V)和电流输出(0-20mA或4-20mA)Additional 3B Resources: Accessories, Backplanes and Power SuppliesSales and Service: North America (SCS Embedded Tech), Rest of WorldDownload a PDF copy of this user manual电路图、引脚图和封装图
发表于 04-18 19:43 •
266次
阅读
信息优势和特点 接受交流应变计或扭矩传感器输入 完善的应变计调理 1kHz至10KHz交流激励 10KHz带宽 电压(± 10V)和电流输出(0-20mA或4-20mA)Additional 3B Resources: Accessories, Backplanes and Power SuppliesSales and Service: North America (SCS Embedded Tech), Rest of WorldDownload a PDF copy of this user manual电路图、引脚图和封装图
发表于 04-18 19:39 •
253次
阅读
信息优势和特点 接受应变计输入 提供电桥激励 低噪声 3Hz带宽 电压(± 10V)和电流输出(0-20mA或4-20mA)Additional 3B Resources: Accessories, Backplanes and Power SuppliesSales and Service: North America (SCS Embedded Tech), Rest of WorldDownload a PDF copy of this user manual电路图、引脚图和封装图
发表于 04-18 19:39 •
264次
阅读
信息优势和特点 接受LVDT或RVDT输入 完善的LVDT调理 1kHz至10KHz交流激励 100 Hz带宽 电压(± 10V)和电流输出(0-20mA或4-20mA)Additional 3B Resources: Accessories, Backplanes and Power SuppliesSales and Service: North America (SCS Embedded Tech), Rest of WorldDownload a PDF copy of this user manual电路图、引脚图和封装图
发表于 04-18 19:39 •
346次
阅读
信息优势和特点 Process Current Output (0-20mA or 4-20mA) RS-485 Interface Programmable Slew Rate National Instruments Labview Supported 产品详情The 6B Series of modules and boards provides the hardware needed to implement a flexible, distributed monitoring and control application. By selecting only the modules and interfaces needed and connecting them via RS-485, the data acquisition and control strategy can be designed for optimum location of the I/O as well as minimizing sensor runs. The modularity and configurability of the 6B Series also makes them very cost effective.电路图、引脚图和封装图...
发表于 04-18 19:16 •
295次
阅读
信息优势和特点 Accepts mV and V Input RS-485 Interface National Instruments Labview Supported 2500V CMV Version Available 6B12-HV Additional 6B Resources: Accessories, Backplanes and Power SuppliesSales and Service: North America (SCS Embedded Tech), Rest of World
发表于 04-18 19:16 •
659次
阅读
信息优势和特点 Accepts RTD Input RS-485 Interface National Instruments Labview Supported 2500V CMV Version Available 6B13-HV Additional 6B Resources: Accessories, Backplanes and Power SuppliesSales and Service: North America (SCS Embedded Tech), Rest of World电路图、引脚图和封装图
发表于 04-18 19:16 •
688次
阅读
信息优势和特点 2500V CMV Version Available 6B11-HV Accepts mV, V, I, and Common TC Inputs (J, K, T, E, R, S, B) National Instruments Labview Supported RS-485 接口Additional 6B Resources: Accessories, Backplanes and Power SuppliesSales and Service: North America (SCS Embedded Tech), Rest of World电路图、引脚图和封装图
发表于 04-18 19:16 •
407次
阅读
信息小信号二极管 低正向压降 快速开关 非常小的薄型 最大剖面高度为0.43mm 尺寸为1.0 x 0.6mm
发表于 04-18 19:14 •
238次
阅读
评论