完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
疑问一:while (OSStatRdy ==OS_FALSE) {
OStimeDly(2u * OS_TICKS_PER_SEC /10u); /* Wait until statistic task is ready 只要执行完OSStatInit();就会将OSStatRdy 变为OS_TRUE, 也就是说这句话在这之后只要一运行while (OSStatRdy ==OS_FALSE)就相当于while (0),不知道自己的理解对不对? 疑问二:OSIdleCtrMax/= 100uL;只要执行OS_TaskStat就会执行OSIdleCtrMax/= 100uL;OSIdleCtrMax为0.1s 执行OSIdleCtrMax/= 100uL,不就是为了得到1ms(0.1s/100)空闲任务计数的最大值吗?为什么要每次运行程序都要执行一遍 疑问三:OS_TaskStat走到(void)OSTaskSuspend(OS_PRIO_SELF);函数挂起自己什么时候被唤醒?OSIdleCtrRun是100个滴答时钟的空闲值吗? 下面是ucos II的OS_TaskStat函数的源码: #ifOS_TASK_STAT_EN > 0u void OS_TaskStat (void *p_arg) { #if OS_CRITICAL_METHOD == 3u /* Allocate storage forCPU status register */ OS_CPU_SR cpu_sr = 0u; #endif p_arg = p_arg; /* Preventcompiler warning for not using 'p_arg' */ while (OSStatRdy == OS_FALSE) { OSTimeDly(2u * OS_TICKS_PER_SEC / 10u); /* Wait until statistic task is ready */ } OSIdleCtrMax /= 100uL;//1ms的计数最大值 if (OSIdleCtrMax == 0uL) { OSCPUUsage = 0u; #if OS_TASK_SUSPEND_EN > 0u (void)OSTaskSuspend(OS_PRIO_SELF); #else for (;;) { OSTimeDly(OS_TICKS_PER_SEC);//OS_TICKS_PER_SEC:1s的滴答数(1000ms/5ms = 200) } #endif } for (;;) { OS_ENTER_CRITICAL(); //OSIdleCtrRun为100个滴答时钟的空闲计数器值。(0.5s) OSIdleCtrRun = OSIdleCtr; /* 获取过去的一秒空闲计数器的值 */ OSIdleCtr = 0uL; /* 重置下一秒空闲计数器 */ OS_EXIT_CRITICAL(); OSCPUUsage = (INT8U)(100uL -OSIdleCtrRun / OSIdleCtrMax); OSTaskStatHook(); /* 调用用户自定义的钩子函数 */ #if (OS_TASK_STAT_STK_CHK_EN > 0u)&& (OS_TASK_CREATE_EXT_EN > 0u) OS_TaskStatStkChk(); /* 检查每个任务的堆栈 */ #endif OSTimeDly(OS_TICKS_PER_SEC / 10u); /* 在接下来的0.1s积累osidlectr */ } } #endif 代码的中文备注是我自己写的,不一定对。 0.0 求各路大神指教。。。 |
|
相关推荐
10个回答
|
|
没研究过内核 帮顶
|
|
|
|
谢谢您,不过cpu使用率这个不难,知识很浅,只不过我是初学。。。
|
|
|
|
自己顶,希望原子哥帮帮忙。。。
|
|
|
|
好吧。。。
|
|
|
|
第一个是只调用一次。第二个也是只计算一次,以后就一直在for循环里了,只有当max>0不满足时才再次计算。第三个如果挂起那应该是需要其它任务来让它就绪,要不然自己是不可能让自己再次就绪的。这是我的理解,希望能对楼主有帮助。
|
|
|
|
不好意思啊,这里我说的有误,刚刚没仔细看你的程序,你的这个max是在主for循环外面就计算好了,所以后续的就不会再计算,除非是把这个任务删除后重新加入进来才会再次计算,我的这个版本是在外做自此计算,主for循环里做检测,当max>0不满足就再计算,一般是不会出现max不满足条件的。
|
|
|
|
十分感谢您的回答。但我还有些疑问想向您请教:
①#define OS_TASK_SUSPEND_EN 1u 根据下面蓝色的代码编译器会编译(void)OSTaskSuspend(OS_PRIO_SELF);那就是说函数OS_TaskStat自己挂起了自己,那么他什么时候被唤醒? #if OS_TASK_SUSPEND_EN > 0u (void)OSTaskSuspend(OS_PRIO_SELF); #else for (;;) { OSTimeDly(OS_TICKS_PER_SEC);//OS_TICKS_PER_SEC:1s的滴答数(1000ms/5ms = 200) } #endif ②也就是说 OSIdleCtrMax/= 100uL;只会执行一遍,所以说 OSIdleCtrMax经过 OSIdleCtrMax/= 100uL;这个函数计算的值就是1ms(0.1s/100)所得空闲任务计数的最大值。 这是计算CPU使用率的语句OSCPUUsage = (INT8U)(100uL - OSIdleCtrRun / OSIdleCtrMax); 分母是1ms所得空闲任务计数的最大值,那么分子就应该是0.1s(1ms*100)空闲任务所记的值,但是没发现任务是0.1s被唤醒的啊? |
|
|
|
帮顶。。。。
|
|
|
|
至于为啥会调用,你直接去看void SysTick_Handler(void)
{ OSIntEnter(); OSTimeTick(); OSIntExit(); }里面的OSTimeTick(); 你就明白了,它会遍历任务控制块链表的tick,并每次进行减1操作,到任务控制块的tick为零时,这个任务就会被置于就绪列表中,这样就等待优先级到自己的时候就调用了。 |
|
|
|
我觉得这就是定时而已,做时钟和系统时钟用,没有其他的
|
|
|
|
只有小组成员才能发言,加入小组>>
705 浏览 0 评论
1114 浏览 1 评论
2491 浏览 5 评论
2826 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2671 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
661浏览 9评论
671浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
789浏览 6评论
634浏览 5评论
679浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 23:42 , Processed in 1.412381 second(s), Total 100, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号