完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
不少屌丝同学都有类似经历吧,在使用ucosii创建任务时,关于任务堆栈大小设为多大合适搞的不清不楚,郁闷之下就随便整个数,比如就1024吧,呵呵,反正也没见得出问题,那就不多想了。 我想大多数同学都是这样做的吧。这样只是因为在一般情况下,1024确实已经足够大了,堆栈溢出的可能性很小而已。那么,如果你任务实际使用率只有很小的百分之几,一旦被你知道了,你会痛心不?我想你不痛心,μC/OS-II也会痛心的,它会觉得这个coder真是浪费啊,哈哈,这其实还好,至少只是太大导致浪费而已,万一小了那可就堆栈溢出——惨啦!顺便提醒下大家,堆和栈是完全不同的两个概念,出于国内习惯,还是称之为堆栈罢了! 下面,我就来告诉大家怎么知道运行中任务的堆栈实际使用情况,然后就知道应该分配多少堆栈大小合适了!开始正题。 1、首先需要知道,μC/OS-II中创建任务的函数有两个: OSTaskCreate()和OSTaskCreateExt() (1)OSTaskCreate() //创建普通任务 由于重点在下面的创建扩展任务函数,故本函数就不多说了!确实,要想实现检测目标任务栈实际使用情况的功能,是不能使用这个函数来创建目标任务的,必须使用OSTaskCreateExt() 。 (2)OSTaskCreateExt() //创建扩展任务 函数接口原型为: #if OS_TASK_CREATE_EXT_EN > 0 ( void (*task)(void *pd), //建立扩展任务(任务代码指针 ) 2、其次需要知道μC/OS-II中有这么个函数:OSTaskStkChk() 不错,检测任务堆栈实际使用情况正是用的这个函数,下面来本函数的接口原型: INT8U OSTaskStkChk ( INT8U prio, //待测任务的优先级 OS_STK_DATA *pdata //指向一个类型为OS_STK_DATA的结构体 ) 3、再次需要知道一个结构体: #if OS_TASK_CREATE_EXT_EN > 0 { 参数: prio 为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的 4、有了上述三个知识点后就可以啦,具体方法为: (1)将函数的最后一个参数opt 设置为:OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR (2)定义一个变量:OS_STK_DATA StackBytes; (3)调用函数OSTaskStkChk(TestTaskPRIO, &StackBytes) (4)StackBytes.OSFree的值即为被测任务堆栈未使用的字节数, StackBytes.OSUsed的值即为被测任务堆栈已使用的字节数。 5、需要设置宏:OS_TASK_OPT_STK_CLR为1 6、最后一点建议: (1)将被测任务经历最坏的堆栈使用状态,测出来的使用率才可靠 (2)堆栈使用率最好在%50~%80之间,太小浪费空间,太大不安全 (3)最好在工程中单独建立一个优先级较低延时较长的任务来测试其它任务的堆栈使用情况,不用时可以挂起该任务 |
|
|
|
2105 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1941 浏览 3 评论
4537 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2084 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 11:23 , Processed in 0.643688 second(s), Total 63, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号