Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
aarch64
QEMU
信号量_semaphore
【sem bug】在aarch64平台,压测过程中发现sem死机概率高?
发布于 2022-02-14 11:44:18 浏览:1114
订阅该版
[tocm] # 平台 `qemu-virt64-aarch64` # git版本 `5178e7ec0` # 复现步骤 1. 修改`bsp/qemu-virt64-aarch64 menuconfig`为smp 2. `scons` 3. `./qemu.sh` 4. 起来的qemu命令行输入_thread_sample运行测试代码 # 测试代码 ```c /* * 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
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) { int count = 0; while (1) { count++; rt_kprintf("[%d]running [%d]\r\n", rt_hw_cpu_id(), count); #if 1 rt_sem_take(&s_sem, RT_WAITING_FOREVER); rt_sem_release(&s_sem); #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
Hi, this is RT-Thread!! msh />_ _thread_sample msh />_thread_sample [0]running [1] [0]running [2] [0]running [3] [0]running [4] [0]running [5] [0]running [6] [0]running [7] [0]running [8] [0]running [9] [0]running [10] [0]running [11] [0]running [12] [0]running [13] [0]running [14] [0]running [15] [0]running [16] [0]running [17] [0]running [18] [0]running [19] [0]running [20] [0]running [21] [0]running [22] [0]running [23] [0]running [24] [0]running [25] [0]running [26] [0]running [27] [0]running [28] [0]running [29] [0]running [30] [0]running [31] [0]running [32] [0]running [33] [0]running [34] [0]running [35] [0]running [36] [0]running [37] [0]running [38] [0]running [39] [0]running [40] [0]running [41] [0]running [42] [0]running [43] [0]running [44] [0]running [45] [0]running [46] [0]running [47] [0]running [48] [[1]running [1] [1]running [2] [1]running [3] [1]running [4] [1]running [5] [1]running [6] [1]running [7] [1]running [8] [1]running [9] [1]running [10] [1]running [11] [1]running [12] [1]running [13] [1]running [14] [1]running [15] [1]running [16] [1]running [17] [1]running [18] [1]running [19] [1]running [20] [1]running [21] [1]running [22] error exception: Execption: X00:0x0000000000000400 X01:0x0000000077000601 X02:0x0000000076e00601 X03:0x00000000400435f0 X04:0x0000000000000000 X05:0x0000000000000000 X06:0x0000000000000002 X07:0x000000000000004d X08:0x0000000000000058 X09:0x0000000000000063 X10:0x000000000000000a X11:0x000000000000000b X12:0x000000000000000c X13:0x000000000000000d X14:0x000000000000000e X15:0x000000000000000f X1]running [23] 0010 X17:0x0000000000000011 X18:0x0000000000000012 X19:0x0000000000000013 X20:0x0000000000000014 X21:0x0000000000000015 X22:0x0000000000000016 X23:0x0000000000000017 X24:0x0000000000000018 X25:0x0000000000000019 X26[24:0x00000000000[1]running [24] [1]running [25] [1]running [26] [1]running [27] [1]running [28] [1]running [29] [1]running [30] [1]running [31] [1]running [32] [1]running [33] [1]running [34] [1]running [35] [1]running [36] [1]running [37] [1]running [38] [1]running [39] [1]running [40] [1]running [41] [1]running [42] [1]running [43] [1]running [44] [1]running [45] [1]running [46] [1]running [47] [1]running [48] [1]running [49] [1]running [50] [:0x000000000000001a X27:0x000000000000001b X28:0x0000000000000000 X29:0x0000000040067924 X30:0x000000004001a930 SPSR :0x00000000200003c5 EPC :0x0000000076e00601 thread cpu bind pri status sp stack size max used left tick error ---------------- --- ---- --- ------- ---------- ---------- ------ ---------- --- error exception: Execption: X00:0x00000000000003c0 X01:0x0000000000000003 X02:0x0000000007ba07ba X03:0x00000000400435f0 X04:0x0000000000000000 X05:0x0000000000000000 X06:0x0000000000000000 X07:0x000000000000004d X08:0x0000000000000058 X09:0x0000000000000063 X10:0x000000000000000a X11:0x000000000000000b X12:0x000000000000000c X13:0x000000000000000d X14:0x000000000000000e X15:0x000000000000000f X16:0x0000000000000010 X17:0x0000000000000011 X18:0x0000000000000012 X19:0x0000000000000013 X20:0x0000000000000014 X21:0x0000000000000015 X22:0x0000000000000016 X23:0x0000000000000017 X24:0x0000000000000018 X25:0x0000000000000019 X26:0x000000000000001a X27:0x000000000000001b X28:0x0000000000000000 X29:0x00000000400674d4 X30:0x000000004001f010 SPSR :0x00000000800003c5 EPC :0x000000004001f06c thread cpu bind pri status sp stack size max used left tick error ---------------- --- ---- --- ------- ---------- ---------- ------ ---------- --- ``` # Github issue 支持日志  # 尝试 1. 将代码回退到 353f717037b57f663ddce9447fd05700f3087a66 版本([libcpu/aarch64] add smp support )依旧存在该问题。 2. 本身在2021年3月份移植过aarch64,当时贵平台还未对aarch64有很好支持,在自己完成的bsp以及libcpu的情况下,压测也同样有sem信号量压测不过的问题 3. 单线程下没有该问题 4. 在qemu-vexpress-a9平台下测试没有发现该问题(arm 32bit) # 后果 rt-thread中malloc 等大量依赖于sem机制,如果sem压测不过将导致整个系统都有该问题,对malloc进行压测,同样导致死机异常。
查看更多
GuEe_GUI
2022-02-16
这家伙很懒,什么也没写!
问题已经查清楚,该问题为gicv2的SGI中断中,中断号的10~12bit为源cpuid,而0~9bit为中断id,因此trap中需要进行清理位操作,该补丁已向上游提交,可以更新后使用,或者你也可以临时应用该补丁: ```patch diff --git a/libcpu/aarch64/common/trap.c b/libcpu/aarch64/common/trap.c index a648c2dd8..f828f7e01 100644 --- a/libcpu/aarch64/common/trap.c +++ b/libcpu/aarch64/common/trap.c @@ -148,7 +148,7 @@ void rt_hw_trap_irq(void) } #else void *param; - int ir; + int ir, ir_self; rt_isr_handler_t isr_func; extern struct rt_irq_desc isr_table[]; @@ -160,17 +160,20 @@ void rt_hw_trap_irq(void) return; } + /* bit 10~12 is cpuid, bit 0~9 is interrupt id */ + ir_self = ir & 0x3ffUL; + /* get interrupt service routine */ - isr_func = isr_table[ir].handler; + isr_func = isr_table[ir_self].handler; #ifdef RT_USING_INTERRUPT_INFO - isr_table[ir].counter++; + isr_table[ir_self].counter++; #endif if (isr_func) { /* Interrupt for myself. */ - param = isr_table[ir].param; + param = isr_table[ir_self].param; /* turn to interrupt service routine */ - isr_func(ir, param); + isr_func(ir_self, param); } /* end of interrupt */ ``` 由于不清楚你的硬件平台具体是什么错误,所以给一份可能的解决方案,希望该修复可以解决你的问题。
4
个回答
默认排序
按发布时间排序
xhwang
2022-02-14
这家伙很懒,什么也没写!
@GuEe_GUI 大佬烦请帮忙看一下。目前项目在即还请多多支持。本身基于RK3308平台移植,若在项目上成功应用,后续会考虑将平台代码贡献出来。
hfmm
2022-02-14
这家伙很懒,什么也没写!
RT-Thread v4.1.0 Beta 这个版本也这样吗
出出啊
2022-02-15
恃人不如自恃,人之为己者不如己之自为也
大部分时间在 printf ,这是因为 sem 引起的吗? 把那个 printf 放到 sem 里,竞争才激烈
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
xhwang
这家伙很懒,什么也没写!
提问
11
回答
4
被采纳
0
关注TA
发私信
相关问题
1
Linux下的Qemu mini2440虚拟机(32位和64位)
2
有qemu Linux的rt-thread开发环境建立吗?
3
qemu+mini2440+bootloader问题
4
QEMU gdbstub 在Win7下的bug
5
请教如何在windows下使用qemu测试rrt0.31中的例子
6
QEMU运行os问题
7
QEMU-mini2440 模拟环境上运行RT-thread这篇
8
在Ubuntu上执行qemu的configure命令checkzlib失败
9
求大舅:telnet-连接QEMU时,QEMU segmentation fault 结束
10
RealTouch打算出QEMU模拟器吗
推荐文章
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
ART-Pi2移植CMSIS-DAP(基于CherryUSB协议栈)
2
RT-thred的stm32h723对应bsp包CubeMX添加其他外设报错
3
RT-Thread中的time溢出问题,时间戳溢出,解决方法
4
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
5
SystemView线程名字不显示
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
9
个答案
2
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
lizimu
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部