Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
中断
线程
交互
理解编写线程和中断的程序时要特别留意的原因 如何在两者间做安全的传递数据的交互
发布于 2021-07-13 10:42:36 浏览:1046
订阅该版
![image.png](https://oss-club.rt-thread.org/uploads/20210713/4c6475fb33a40b274360d05b228d099f.png.webp) 个人感觉,中断和线程处理数据交互,可以使用一个队列结合信号量的方式,提升整体容错率。 消息队列不知道能不能用,可以查看下。 原则是:凡是内部涉及互斥锁mutex调用的API都不能在rt-thread的中断服务函数内使用。 补充说明: 中断和线程内不能有“同时写”同一个变量的场景,这是危险的。 并不是说,中断和线程不能都写同一个变量。如果中断和线程都出现了写同一个变量的语句,只要能够做到绝对不会“同时进行”,这也是可以的。 所谓的“同时写”,指的是线程A正在写变量a,但是还没写完,从汇编角度刚读取了其且进行了处理,假设该处理是+1操作,那么就得到了运算结果a+1,该结果尚未写入到变量A,此时!发生了中断!然后在中断内又写了变量a,且进行处理,假设对a置位为0了,那么在中断服务程序结束后,退回到线程A内,线程A会继续将之前得到的a+1,写入到变量A。 最造成的结果时,虽然中断服务程序写了0,但是却被线程的a+1的操作给覆盖了! 那这样的中断程序岂不是一点用处都没了。所以,不能“同时写”,这是危险的。
查看更多
sync
2021-07-13
这家伙很懒,什么也没写!
可以参考RT-thread对串口的处理方式,使用消息队列来实现数据传递 ```c /* 接收数据回调函数 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); if (result == -RT_EFULL) { /* 消息队列满 */ LOG_E("message queue full!"); } return result; } ```
4
个回答
默认排序
按发布时间排序
liuduanfei
2021-07-13
这家伙很懒,什么也没写!
从内核实现中学习 是个好的方式
XXDQ_1957
2021-07-19
这家伙很懒,什么也没写!
这种使用场景本来不该用信号量吧,这个场景需要把所有历史信息记录下来。 我一开始看兄弟你的描述, 如果单纯防止“同时写”, 不是只要在线程写变量的时候禁中断不就可以了吗,再看一看才发现我理解错了。。。
123
认证专家
2021-07-13
这家伙很懒,什么也没写!
https://club.rt-thread.org/ask/question/431797.html aozima 大佬总结的挺好的了。
撰写答案
登录
注册新账号
关注者
0
被浏览
1k
关于作者
大话西游2018
这家伙很懒,什么也没写!
提问
36
回答
40
被采纳
1
关注TA
发私信
相关问题
1
请问执行rt_thread_delete的操作后,线程还在运行是什么情况?
2
rtthread中,线程中的ADC采样率需求比时钟嘀嗒需求高怎么办?
3
有没有检测系统中有没有某个名字的线程的接口函数?
4
使用finsh 进行ota成功,线程里开ota失败
5
调度锁会引起线程内存不足
6
线程处于close状态消耗资源吗
7
paho_mqtt线程相关疑问
8
thread中不能使用rt_timer_start() 来开启定时器
9
线程递归是什么形成的?
10
程序运行一会儿报错,拜托拜托
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
vscode插件 - RT-Thread Studio项目助手 | 跨平台开发
2
Console串口使用说明
3
WATCHDOG设备驱动开发
4
【NXP-MCXA153】eFlexPWM驱动移植
5
RT-Thread 下 Ethernet/IP 的支持
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部