问题:在STM32F103VET6平台上移植的FreeRTOS,一开始跑得好好的,添加了一个小任务,然后程序无法正常运行
调试过程:
1.断点调试,程序死在了调度上面,if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
调试过程:
1.断点调试,程序死在了调度上面,if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
2.分析可能是分配的堆栈空间不够,加了堆栈空间之后还是不行,
4.把其中几个任务的堆栈空间改小了
5.调试OK
6.提出疑问,那到底一个任务分配多少堆栈空间呢,那么总大小不能超过多少呢,后来看到两篇文章
得出几点:
1启动任务中的Stack_Size和任务堆栈没关系,它是提供给普通函数用来存放临时变量用的,比如中断处理函数
2任务堆栈是从TOTAL_HEAP_SIZE这个值中分配来的,虽然我的任务总堆栈空间还是小于这个值,但是还是崩溃了,这点还需要进一步研究
3如果任务堆栈无法再缩小,那就把这个值增大
4任务的堆栈空间是4字节的,所以一般不需要很大的空间,一般任务控制块需要70-80个字节,再加上临时变量就差不多了,
注意:static修饰的临时变量是放在静态存储区的,一般栈区就存临时变量,堆区主要存放分配的内存,静态存储区存放静态变量,全局变量,常量等一般编译的时候就分配好了