Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
中断
任务调度
rt_hw_context_switch_interrupt的逻辑
发布于 2020-10-02 21:19:24 浏览:1631
订阅该版
arm cotex-a9 rt_hw_context_switch_interrupt函数的逻辑想咨询一下。 ``` .globl rt_thread_switch_interrupt_flag .globl rt_interrupt_from_thread .globl rt_interrupt_to_thread .globl rt_hw_context_switch_interrupt rt_hw_context_switch_interrupt: ldr r2, =rt_thread_switch_interrupt_flag ldr r3, [r2] cmp r3, #1 beq _reswitch ldr ip, =rt_interrupt_from_thread mov r3, #1 str r0, [ip] str r3, [r2] _reswitch: ldr r2, =rt_interrupt_to_thread str r1, [r2] bx lr ``` 在中断的ISR函数中如果调用rt_schedule函数的话,会走到此函数, 我所理解的流程: ``` 进入中断(①)⇒调用rt_schedule(②)⇒rt_hw_context_switch_interrupt(③) ⇒中断返回(④)⇒[from→to]的任务切换。 ``` 关于【rt_thread_switch_interrupt_flag 】的赋值不太理解。 我的理解是在 ③部分将 rt_thread_switch_interrupt_flag 赋值为1,之后再④部分将判断 rt_thread_switch_interrupt_flag如果为1,则调度切换。 但是rt_hw_context_switch_interrupt(③)函数一开始就判断了rt_thread_switch_interrupt_flag是否为1,如果为1,则代码直接跳到 _reswitch 处(这里的判断逻辑的意图不太理解)。 ``` rt_hw_context_switch_interrupt: ldr r2, =rt_thread_switch_interrupt_flag ldr r3, [r2] cmp r3, #1 //I beq _reswitch ``` 想问下为什么刚开始要判断这个呢?,进入这个函数(③)之前,应该没有对rt_thread_switch_interrupt_flag这个变量赋值的处理吧?
查看更多
2
个回答
默认排序
按发布时间排序
mxgsgtc
2020-10-05
这家伙很懒,什么也没写!
下面是自己的理解,不知道对不对,先记录下来: ``` 进入中断(①)⇒调用rt_schedule(②)⇒rt_hw_context_switch_interrupt(③) ⇒中断返回(④)⇒[from→to]的任务切换(⑤)。 ``` ③结束后,会走中断返回④和任务切换(⑤) ``` vector_irq: stmfd sp!, {r0-r12,lr} bl rt_interrupt_enter bl rt_hw_trap_irq bl rt_interrupt_leave ldr r0, =rt_thread_switch_interrupt_flag ldr r1, [r0] cmp r1, #1 beq rt_hw_context_switch_interrupt_do ldmfd sp!, {r0-r12,lr} subs pc, lr, #4 rt_hw_context_switch_interrupt_do: ``` 在中断返回后 ``` bl rt_interrupt_leave //此时中断会再度打开 ``` 就开始执行⑤(任务切换) ``` ldr r0, =rt_thread_switch_interrupt_flag ldr r1, [r0] cmp r1, #1 beq rt_hw_context_switch_interrupt_do ldmfd sp!, {r0-r12,lr} subs pc, lr, #4 rt_hw_context_switch_interrupt_do: ... ... ``` 再此过程中,由于中断再度打开,在向[to]任务切换的过程中,有可能被同一个中断再度打断。 换句话说: ``` 进入中断(①)⇒调用rt_schedule(②)⇒rt_hw_context_switch_interrupt(③) ⇒中断返回(④)⇒[from→to]的任务切换(⑤)。 ``` 在⑤时被中断打断,再次执行同一个ISR并且调用rt_schedule时,进入rt_hw_context_switch_interrupt函数后,rt_interrupt_from_thread变量就不需要在重新被赋值了(因为还是在同一个线程中)
伊森亨特
2023-02-08
这家伙很懒,什么也没写!
一直对rt_thread_switch_interrupt_flag不理解,它的意思是中断中发生任务切换,rt_thread_switch_interrupt_flag等于1,那不是中断中发生切换,就应该等于0啊,但是看流程图rt_thread_switch_interrupt_flag等于0的时候,都跳过了。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.6k
关于作者
mxgsgtc
这家伙很懒,什么也没写!
提问
20
回答
9
被采纳
0
关注TA
发私信
相关问题
1
使用CmBacktrace定位错误异常,请教分析原因
2
ARM9、raspberry-pi中断问题
3
内联函数不压栈,会因为中断导致栈内现场被破坏吗
4
中断的入口程序在哪个文件里?
5
我想实现一个定时器中断,发现rt_hw_interrupt_install未定义
6
临界区和关中断,是否需要同时使用?
7
gpio 引脚一直进中断,请问怎么办呢?
8
RT-Thread那些API可以在中断程序中调用?
9
spi dma 中断接收的问题
10
串口指令解析怎么处理
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RyanMqtt 移植指南(三)
2
RyanMqtt QOS质量测试(二)
3
WCH APT 零等待FLASH的思考
4
RyanMqtt使用介绍和示例代码(一)
5
RTT平台 zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程
热门标签
RT-Thread Studio
串口
Env
LWIP
AT
SPI
Bootloader
FinSH
ART-Pi
CAN总线
Hardfault
USB
文件系统
DMA
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
stm32
ESP8266
rt-smart
WIZnet_W5500
RTC
flash
ota
UART
FAL
packages_软件包
I2C
freemodbus
cubemx
潘多拉开发板_Pandora
定时器
PWM
BSP
ADC
socket
AB32VG1
SDIO
keil_MDK
中断
消息队列_msg_queue
编译报错
Debug
C++_cpp
msh
QEMU
SFUD
MicroPython
本月问答贡献
出出啊
1463
个答案
324
次被采纳
小小李sunny
1379
个答案
274
次被采纳
张世争
700
个答案
155
次被采纳
crystal266
518
个答案
152
次被采纳
whj467467222
1215
个答案
146
次被采纳
本月文章贡献
出出啊
1
篇文章
11
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
4
篇文章
6
次点赞
crystal266
2
篇文章
5
次点赞
whj467467222
2
篇文章
4
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部