osThreadEnumerate这个函数不理解怎么用,拆开看其内部怎么写的,有如下
uint32_t osThreadEnumerate (osThreadId_t *thread_array, uint32_t array_items) {
uint32_t i, count;
TaskStatus_t *task;
if (IS_IRQ() || (thread_array == NULL) || (array_items == 0U)) {
count = 0U;
} else {
vTaskSuspendAll();
count = uxTaskGetNumberOfTasks();
task = pvPortMalloc (count * sizeof(TaskStatus_t));
if (task != NULL) {
count = uxTaskGetSystemState (task, count, NULL);
for (i = 0U; (i < count) && (i < array_items); i++) {
thread_array[i] = (osThreadId_t)task[i].xHandle;
}
count = i;
}
(void)xTaskResumeAll();
vPortFree (task);
}
return (count);
}
我有代码如下
uint32_t ArraySize, x,i;
osThreadId_t *thread_array;
for(;;)
{
osDelay(1000);
ArraySize = osThreadGetCount();
printf("Task size is %ld ok\t\n\r",ArraySize);
i = osThreadEnumerate(&thread_array,ArraySize);
printf("Task size is %ld\t\n\r",ArraySize);
}
打印的数据,第一次打印是6,第二次打印是一个很大的数,我跟着跑了一遍,没有发现哪里有修改这个变量,
Task size is 6 ok
Task size is 603983608
担心是有其他任务中断,也把其他任务关掉,还是没有效果,有用过这个函数的可以帮忙看下
追加一下:
程序在运行到vPortFree之前,变量都是对的,之后变量数值变化了。
查找这个vPortFree,里面的内容是释放使用的内存。所以这个变量的内容被这个函数释放了,没有了。