Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
aarch64
信号量_semaphore
SMP
【aarch64】sem压测卡死(无反应)
发布于 2022-02-17 20:29:15 浏览:1270
订阅该版
[tocm] # 平台 qemu-virt64-aarch64 # Git版本 85dc9bd4a6e798c74f16a87bc91191907dfdbaf7 # 问题描述 在最新git版本上,测试出现低概率卡死,分析后是malloc时导致卡死,进一步定位出来卡死在sem信号量上。 因此对信号量进行压测处理,发现确实出现卡死现象。 表现: 1. 没有crash,单纯无反应,msh也没有输出。 2. 卡死出现概率,时高时低,但该测试代码下,基本上1分钟内必现 # 复现步骤 1. 修改bsp/qemu-virt64-aarch64 menuconfig为smp,个数为4 2. scons 3. ./qemu.sh 4. qemu命令行输入_thread_sample运行测试代码 # 测试代码 ``` /* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2017-5-30 Bernard the first version */ #include
#include
#include
int main(int argc, char** argv) { rt_kprintf("Hi, this is RT-Thread!!\n"); return 0; } static struct rt_semaphore s_sem; static void _cpu_bind_thread_entry(void *parameter) { uint32_t count = 0; while (1) { count++; if(0 == count%10000) rt_kprintf("[%d][%d]\r\n", rt_hw_cpu_id(), count); #if 1 rt_sem_take(&s_sem, RT_WAITING_FOREVER); rt_sem_release(&s_sem); #elif 1 { register rt_base_t temp; /* disable interrupt */ temp = rt_hw_interrupt_disable(); rt_hw_interrupt_enable(temp); } #else { void *p = RT_NULL; p = rt_malloc(1024); if(RT_NULL == p) { rt_kprintf("malloc fail \r\n"); break; } rt_free(p); } #endif } } static rt_thread_t s_ThteadId = RT_NULL; #define THREAD_PRIORITY 15 #define THREAD_STACK_SIZE 2048 #define THREAD_TIMESLICE 5 static void _thread_sample(void) { rt_ubase_t i; char ThreadName[RT_NAME_MAX]; rt_sem_init(&s_sem, "test", 1, RT_IPC_FLAG_PRIO); for (i = 0; i
_ _thread_sample msh />_thread_sample msh />[1][10000] [0][10000] [3][10000] [2][10000] [1][20000] [3][20000] [0][20000] [2][20000] [1][30000] [3][30000] [0][30000] [2][30000] [1][40000] [3][40000] [0][40000] [2][40000] [1][50000] [3][50000] [0][50000] [2][50000] [1][60000] [0][60000] [2][60000] [3][60000] [1][70000] [0][70000] [2][70000] [3][70000] [1][80000] [2][80000] [0][80000] [3][80000] [1][90000] [2][90000] [0][90000] [3][90000] [1][100000] [2][100000] [0][100000] [3][100000] [1][110000] [0][110000] [2][110000] [3][110000] [1][120000] [0][120000] [2][120000] [3][120000] [1][130000] [0][130000] [2][130000] [3][130000] //卡在这里没有任何反应 ``` # 尝试 1. malloc 压测时发现,后定位出来是sem有异常 2. 在aarch64 自己移植的rk3308上一样存在这个bug,但是概率相较于qemu来说高很多 3. 将中断绑定在同一个cpu上,则不会出现卡死情况 4. 在qemu-vexpress-a9平台下测试没有发现该问题(arm 32bit) 5. 测试过程中增加print输出频率,概率随之降低,但没有发现明显正相关 6. 修改rt-thread调度频率,也没有明显的正相关 @GuEe_GUI 大佬帮忙看一下,是否有别的思路进一步调试
查看更多
GuEe_GUI
2022-02-18
这家伙很懒,什么也没写!
卡死是因为其中一个core在ipc中处理暂停线程,由于上下文部分的代码存在缺陷,导致该循环(arc/ipc.c->_ipc_list_suspend)无法退出,所以其他核一直等待大内核锁解锁: ```c /* find a suitable position */ for (n = list->next; n != list; n = n->next) { sthread = rt_list_entry(n, struct rt_thread, tlist); /* find out */ if (thread->current_priority < sthread->current_priority) { /* insert this thread before the sthread */ rt_list_insert_before(&(sthread->tlist), &(thread->tlist)); break; } } ``` 而上下文中,rt_hw_context_switch的SAVE_CONTEXT_T没有将关中断的位保存进栈上的spsr(主动切换要关中断),导致该问题的发生,因此可以在上下文保存的宏代码中应用该补丁: ``` diff --git a/libcpu/aarch64/common/context_gcc.S b/libcpu/aarch64/common/context_gcc.S index d1c6cb0ad..d784ce376 100644 --- a/libcpu/aarch64/common/context_gcc.S +++ b/libcpu/aarch64/common/context_gcc.S @@ -158,7 +158,7 @@ rt_hw_get_gtimer_frq: MOV X2, X30 B 0f 1: - MOV X3, 0x05 + MOV X3, #((3 << 6) | 0x05) MOV X2, X30 B 0f 0: ``` 谢谢反馈!温馨提示:i变量用int不要用rt_ubase_t
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
xhwang
这家伙很懒,什么也没写!
提问
11
回答
4
被采纳
0
关注TA
发私信
相关问题
1
aarch64有计划支持SMP吗
2
【sem bug】在aarch64平台,压测过程中发现sem死机概率高?
3
rt-smart 支持64位的编译嘛?
4
RTthread的动态模块支持aarch64位的吗?
5
rtthread对aarch64的支持问题
6
用户态程序xmake配置平台aarch64时提示make not find
7
qemu-virt64-aarch64能不能支持gic-version3
8
SMP重新定义中断处理函数的问题
9
rt_tick_increase()在SMP时只增加当前核的TICK?
10
RISCV smp系统调度异常问题请教
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部