我这里说明的问题,一般会出现在UCOS系统上,如果是裸机应该不怎么会出现,只要程序不是太大,不是无休止的使用内存。
我遇到的现象是,在某个任务运行中进行多层函数调用时在return时无法返回,这种情况一般都是因为堆栈过小的问题。一般涉及工程中两个地方。
一个是任务堆栈设置那里,一个是总堆栈设置那里(stm32平台一般是stm32xxxxx.s文件中),任务堆栈设置的位置每个工程可能都不一样,自行寻找修改即可,总堆栈在stm32平台中在下面代码红色所示的位置:
<span style="color:#ff0000;">Stack_Size EQU 0x00000D00</span>
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
把总堆栈和任务堆栈同时调大或者够用的状态无法返回的问题即可解决。也不要太大,免得浪费内存。
还有一个问题,如果在函数内部使用大的数组,如分配一个4K大小的数组,这样是不行的,当然还是对有操作系统的来说,裸机也有可能会出问题,当然取决于设置的栈大小,这是我的理解,没有做测试。
在操作系统中不要这么使用,如果是大的数组,那么尽量设置为全局的形式,免得程序莫名其妙的崩溃(我花了好长时间来寻找这个问题~~~~(>_<)~~~~)。
在使用UCOS这类操作系统时,对内存的使用以及指针的使用要务必格外小心仔细,要不然出现了莫名其妙的问题,很难去定位寻找,因为是多任务运行,这句话有问题,但是引起这句有问题的地方在哪却是未知。