Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
中断
关中断
关于rt_hw_interrupt_disable的一点疑问
发布于 2024-01-26 18:49:16 浏览:1083
订阅该版
![1833A0FE-4BA4-4352-AF14-631524A7EB20.jpeg](https://oss-club.rt-thread.org/uploads/20240126/e55789b3e19609c211611a49a2877ce1.jpeg.webp) 如上图中,假如执行完MRS R0,PRIMASK之后发生了任务抢占,那么就出现了非预期的结果,即可能出现在其他地方使能中断的情况,那么这种可能是否存在呢?存在的话可能会造成不可预测的结果,该如何避免?
查看更多
lchnu
2024-01-26
Witness, Understand, Skill
执行完毕MRS之后,可能发生中断,也会导致线程被抢占。但是,发生中断时,R0等寄存器自动入栈,不会对disable函数造成影响。 对`rt_hw_interrupt_disable`函数而言,重要的是,`调用它之后,在它和rt_hw_interrupt_enable之间的操作,不能被中断/可能的线程调度打断`,而不是`执行CPSID I指令之前不能被打断。` 以官方的`interrupt_sample.c`为例,我做了修改,两个线程的优先级改为10和9,且线程中将cnt设置为传递的参数。 你可以看到,对全局变量cnt操作时,如果不加关中断,会导致no为10的场合,实际输出20。 ```c /* 程序清单:关闭中断进行全局变量的访问 */ #include
#include
#define THREAD_PRIORITY 10 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 /* 同时访问的全局变量 */ void do_something() { for (rt_uint8_t i = 0; i < 255; i++) { for(rt_uint8_t j = 0; j < 255; j++) { ; } } } static rt_uint32_t cnt; void thread_entry(void *parameter) { rt_uint32_t no; rt_uint32_t level; no = (rt_uint32_t) parameter; rt_uint32_t t = 10; while (t--) { /* 关闭中断 */ // level = rt_hw_interrupt_disable(); cnt = no; do_something(); /* 恢复中断 */ // rt_hw_interrupt_enable(level); rt_kprintf("tid[%d]'s cnt is %d\n", no, cnt); rt_thread_mdelay(5); } } int interrupt_sample(void) { rt_thread_t thread; /* 创建thread1线程 */ thread = rt_thread_create("thread1", thread_entry, (void *) 10, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (thread != RT_NULL) rt_thread_startup(thread); /* 创建thread2线程 */ thread = rt_thread_create("thread2", thread_entry, (void *) 20, THREAD_STACK_SIZE, THREAD_PRIORITY-1, THREAD_TIMESLICE); if (thread != RT_NULL) rt_thread_startup(thread); return 0; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(interrupt_sample, interrupt sample); ``` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240126/c5f66971699d036d5cb916432a688069.png.webp)
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
wakojosin
这家伙很懒,什么也没写!
提问
1
回答
1
被采纳
0
关注TA
发私信
相关问题
1
使用CmBacktrace定位错误异常,请教分析原因
2
ARM9、raspberry-pi中断问题
3
内联函数不压栈,会因为中断导致栈内现场被破坏吗
4
rt_hw_context_switch_interrupt的逻辑
5
中断的入口程序在哪个文件里?
6
我想实现一个定时器中断,发现rt_hw_interrupt_install未定义
7
临界区和关中断,是否需要同时使用?
8
gpio 引脚一直进中断,请问怎么办呢?
9
RT-Thread那些API可以在中断程序中调用?
10
spi dma 中断接收的问题
推荐文章
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
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
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
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部