完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在测试rt-thread 在龙芯2k上线程切换所需的花销,我的思路是创建1000个线程,所创将的线程都存放在全局静态数组中,线程中的内容是将自身挂起,如果线程被唤醒,将会唤醒下一个线程,然后再第一个和最后一个线程中测算1000个线程所需的时钟,循环测试一个小时,代码如下 #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就没有出现这样的问题,请各位指点一下是什么原因 |
|
相关推荐
5个回答
|
|
感觉主要还是测试用例设计的方法不合理,首先任务里面会主动调度,加上中断的被动调度,你其实不能保证所有任务都能按创建顺序去执行,所以测得时间越久,线程调度顺序会越混乱,时间也越离谱
可能可以改善的修改,创建最高优先级 0 的 moniter 线程,在 moniter 线程里面创建 1000 个 1 优先级的线程,减少抢占调度的可能,在测试一下看看。 |
|
|
|
|
|
|
|
创建失败的原因你可以减少测试回合,看看是否有内存泄漏,没有的话应该是回收不及时导致的,可以在下一轮测试前,增加等待时间,或者 find 线程是不是还在,在进行下一轮测试
|
|
|
|
创建失败的原因你可以减少测试回合,看看是否有内存泄漏,没有的话应该是回收不及时导致的,可以在下一轮测试前,增加等待时间,或者 find 线程是不是还在,在进行下一轮测试
|
|
|
|
好,我等会来试试,还有一个很有意思的现象,在我执行完一轮测试后,我再次测试的时候,花费的时间就直接从0.006ms 变成了 5 ms,等会我在测试一轮,测试结束后,看看是不是依然有线程存在
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
798 浏览 0 评论
4836 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2622 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2958 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31763 浏览 11 评论
73087 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 17:10 , Processed in 0.925687 second(s), Total 82, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号