Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
线程上下文调度切换_context
5
上下文切换后,返回指向任务的堆栈指针指向越界问题
发布于 2022-05-09 18:00:15 浏览:583
订阅该版
芯片为STM32H750 编译器GCC 开发工具STM32CUBEIDE RTT版本4.0.3 堆栈总大小64KB,该main任务堆栈空间4000B(实际没干啥,只是让一个LED闪烁)。现在运行的情况下,任务调度开启后,该main任务被执行前,在contextswich的地方返回后,指向属于它的任务空间的堆栈指针会往后面(地址增加几十个字节,0x24001370)的空间偏移几十个字节,此时已经越过该任务最末端的边界了,导致一旦执行了该任务的其他代码就会因为入栈导致下一个任务(0x24001328)的控制块数据被写乱。 正常来说,一个任务被调用后,堆栈指针不应该是指向最末端的吗?为什么我这里会出现这样的情况,大概如何排查问题? **执行BX LR之前** ![6d2c7b4cc6c23739a21babd901733d71.png.webp](https://oss-club.rt-thread.org/uploads/20220509/6d2c7b4cc6c23739a21babd901733d71.png.webp) **执行BX LR之后** ![4006fdfbeb25d232c332f353f4e7086e.png.webp](https://oss-club.rt-thread.org/uploads/20220509/4006fdfbeb25d232c332f353f4e7086e.png.webp)
查看更多
blta
2022-05-10
这家伙很懒,什么也没写!
**现象** 如下图所示: ![image.png](https://oss-club.rt-thread.org/uploads/20220510/7397f284a990708f880aee62e5ff9188.png.webp) 1. 首先你这个问题应该出现在rt_hw_context_switch_to->PendSV->pendsv_exit 即第一次切换任务的时候 2. 当前进入PendSV后lr的被系统自动赋值的EXC_RETURN值是0XFFFFFFED,意味着上文有浮点操作(CONTROL.FPCA 置位了), 中断进入需要额外压入浮点部分寄存器组,对应中断退出时需要弹出相应寄存器组。加上正常的8个寄存器,就是你这个pop的26word = 104bytes。 **问题** 问题就出现在这多弹出的18word 上。正常情况下,一个任务刚进来,哪里来的浮点操作,所以rtthread 对线程栈帧的初始化,只有正常的8个,并不构造浮点寄存器部分的。而现在EXC_RETURN值是0XFFFFFFED,意味着需要弹出浮点寄存器,就导致PendSV exit的时候栈溢出。一般CONTROL.FPCA在复位后,未进行浮点操作的情况下不应该出现置位现象,但是有时这个CONTROL.FPCA刚开始确实被置位了,莫名其妙。 ``` rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) { struct stack_frame *stack_frame; rt_uint8_t *stk; unsigned long i; stk = stack_addr + sizeof(rt_uint32_t); stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8); stk -= sizeof(struct stack_frame); stack_frame = (struct stack_frame *)stk; /* init all register */ for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++) { ((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef; } stack_frame->exception_stack_frame.r0 = (unsigned long)parameter; /* r0 : argument */ stack_frame->exception_stack_frame.r1 = 0; /* r1 */ stack_frame->exception_stack_frame.r2 = 0; /* r2 */ stack_frame->exception_stack_frame.r3 = 0; /* r3 */ stack_frame->exception_stack_frame.r12 = 0; /* r12 */ stack_frame->exception_stack_frame.lr = (unsigned long)texit; /* lr */ stack_frame->exception_stack_frame.pc = (unsigned long)tentry; /* entry point, pc */ stack_frame->exception_stack_frame.psr = 0x01000000L; /* PSR */ #if USE_FPU stack_frame->flag = 0; #endif /* USE_FPU */ /* return task's current stack address */ return stk; } ``` **解决** 如下图图示: ![image.png](https://oss-club.rt-thread.org/uploads/20220510/54b63d5fc31102f8da93e2ee84f055dd.png.webp) 其实rtthred为了避免这个问题,在`rt_hw_context_switch_to` 已经做了处理,第一次切换时直接把CONTROL.FPCA强制清零 ``` /* * void rt_hw_context_switch_to(rt_uint32 to); * r0 --> to */ .global rt_hw_context_switch_to .type rt_hw_context_switch_to, %function rt_hw_context_switch_to: LDR r1, =rt_interrupt_to_thread STR r0, [r1] #if defined (__VFP_FP__) && !defined(__SOFTFP__) /* CLEAR CONTROL.FPCA */ MRS r2, CONTROL /* read */ BIC r2, #0x04 /* modify */ MSR CONTROL, r2 /* write-back */ #endif ``` **你的这个问题 应该是#if清零操作未执行,可以先把#if屏蔽掉试一下,再检查那两个宏的问题**
2
个回答
默认排序
按发布时间排序
出出啊
2022-05-09
恃人不如自恃,人之为己者不如己之自为也
首先啊,建议你使用 4.1.0 版本内核。 进入 main 线程之前 main 线程控制块数据已经被破坏了吧。看线程栈看不出啥了,调出 main 线程的线程控制块结构体来瞧瞧是不是被修改了。
撰写答案
登录
注册新账号
关注者
0
被浏览
583
关于作者
SSSANTON
这家伙很懒,什么也没写!
提问
3
回答
2
被采纳
0
关注TA
发私信
相关问题
1
modbusRTU如何避免因为被高优先级任务切走而导致本次通讯失败
2
RT-Thread 4.0.2初次上下文切换失败
3
pendSV中bx lr指令,lr指向哪里?psp中剩余的寄存器啥时候弹出的?
4
Cortex-M0在bootloader环境下的上下文切换问题?
5
arc内核移植线程切换
6
rt_thread_yield 无法在同级别中释放cpu
7
线程执行完后退出 是如何通知cpu切换任务的
8
RTT-NANO 3.1.3 线程切换问题
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
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部