在做FreeRTOS中任务查询的例程的时候,使用了这条函数:
**uxTaskGetSystemState**,该函数对其填入参数进行填充:
1、pxTaskStatusArray 任务状态列表,里面储存了,任务名称,优先级,等等信息
2、uxArraySize 列表的大小,根据任务数量动态分配大小,这里用了uxTaskGetNumberOfTasks这条函数获取任务数量,使用pvPortMalloc分配太小,用法和C的malloc相同.
3、pulTotalRunTime 任务总运行时间 u32
今天踩的坑就是在pulTotalRunTime 这个参数踩的,写的时候脑袋不装东西,一时好奇,函数的pulTotalRunTime参数是一个u32类型的指针,应传入一个指针地址,而我定义变量时,将变量定义成了u32类型的指针,在传参数时编译器也没有报错!程序一跑直接飞HardFault_Handler异常。
细细思考一下,原因是我没有对指针进行初始化!写了一个野指针,传参数时因为是指针类型,是一个地址,编译器自然不会报错,但是参数传入,野指针的地址指向不明确,数据错误,非法内存的访问,程序跑飞自然就正常了。
然后再查资料解决错误的时候,找到了很多关于任务调度的知识,记录一下:
首先关于任务中没有while(1)的问题:
首先明确一个点,任务的观点,任务就是一个一直在的跑的程序,要写在while(1)里,如果没有写在while(1)里,总也得有类似while(1)的地方,这里看到一个定时器回调函数,先把坑挖在这里,以后来填。
再说回来,没有while(1)会怎么样。
引用 用户 fbori 的一句话 :
FreeRTOS我在7.x使用的情況是如果你把一個不是死迴圈的任務(task)加入排程(scheduling),你執行程式會進入他們設計的一個debug使用的死迴圈,會跟你說必須要在這個函式最下面呼叫刪除task的api