Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
线程上下文调度切换_context
多线程切换最终导致线程创建失败
发布于 2022-08-26 08:45:34 浏览:969
订阅该版
我在测试rt-thread 在龙芯2k上线程切换所需的花销,我的思路是创建1000个线程,所创将的线程都存放在全局静态数组中,线程中的内容是将自身挂起,如果线程被唤醒,将会唤醒下一个线程,然后再第一个和最后一个线程中测算1000个线程所需的时钟,循环测试一个小时,代码如下 ```c #include
#include
#define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 #define THREAD_MAX 1000 #define THREAD_TEST_TIME 1000*60*60 static rt_thread_t tid[THREAD_MAX] ; static rt_tick_t old_tk,new_tk; static double max_tk = 0,min_tk = 0,avg_tk = 0; static void thread1_entry(void *parameter) { rt_uint64_t flag=RT_NULL; rt_uint64_t num = (rt_uint64_t)parameter; double spend_tk; if(num==0){ rt_kprintf("start supend ---------------------\n"); }else if(num==THREAD_MAX-1){ rt_kprintf("end supend ----------------------\n"); } flag = rt_thread_suspend(rt_thread_self()); if(flag!=RT_EOK){ rt_kprintf("thread%d is suspend failed\n",num); } rt_schedule(); if(num==0){ old_tk = rt_tick_get(); rt_kprintf("thread start---------------\n"); }else if(num==THREAD_MAX-1){ new_tk = rt_tick_get(); rt_kprintf("thread end------------\n"); spend_tk = (1.0*new_tk-old_tk)/THREAD_MAX; printf("old time = %d,new time = %d,spend %f ms do change task \n",old_tk,new_tk,spend_tk); // rt_kprintf(" old time = %d,new time = %d,spend %f ms do change task \n",old_tk,spend_tk); if(min_tk==0||min_tk>spend_tk){ min_tk = spend_tk; } if(max_tk==0||max_tk
(THREAD_TEST_TIME)){ break; } } printf("do change task %ld times, mins_task = %f ms,max_task = %f ms,avg_task = %f ms \n",count*1000,min_tk,max_tk,avg_tk/count); // thread_switch_test(); } /* export the msh command */ MSH_CMD_EXPORT(thread_switch, thread switch); ``` 最后再测试的过程中,前十分钟的运行没什么问题,但之后会出现切换线程的时间大幅度的增加,由原来的0.006ms 突然变成 5ms 左右,而且在运行一段时间后,还会线程创建失败,之后我将线程数量改成500就没有出现这样的问题,请各位指点一下是什么原因
查看更多
快没时间了
2022-08-26
这家伙很懒,什么也没写!
感觉主要还是测试用例设计的方法不合理,首先任务里面会主动调度,加上中断的被动调度,你其实不能保证所有任务都能按创建顺序去执行,所以测得时间越久,线程调度顺序会越混乱,时间也越离谱 可能可以改善的修改,创建最高优先级 0 的 moniter 线程,在 moniter 线程里面创建 1000 个 1 优先级的线程,减少抢占调度的可能,在测试一下看看
4
个回答
默认排序
按发布时间排序
张世争
2022-08-26
学以致用
在 shell 线程运行这个操作?
红枫
认证专家
2022-08-26
这家伙很懒,什么也没写!
可能是RAM空间不够用了,导致线程创建失败! 测试切换时间,须严谨!线程中串口打印是很耗时间的,须将其减除。 测试切换的线程优先级要足够高,以避免其它线程干扰测量。 没必要做那么多线程,建2个线程,打乒乓式地来回切换,做个计数就可以。
破壁者
2022-10-09
这家伙很懒,什么也没写!
好像只是挂起线程没有删除线程吧。第二次创建时候又多了一倍的内存,但是为什么卡好像还不能定位。你代码里也有创建失败的打印,既然创建成功内存应该够
撰写答案
登录
注册新账号
关注者
0
被浏览
969
关于作者
Zzxy
这家伙很懒,什么也没写!
提问
9
回答
5
被采纳
1
关注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
TinyUSB Demo运行教程
2
RT-Thread学习大礼包一键带走!
3
freemodbus从机调试说明
4
【1024】瑞萨 RA 系列 BSP 制作与适配最新版本的 Keil 、 RSC、固件,较新的 FSP
5
基于 RT-Thread 星火一号开发板的俄罗斯方块
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
用户名由3_15位
10
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
踩姑娘的小蘑菇
2
个答案
1
次被采纳
bernard
1
个答案
1
次被采纳
rv666
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部