FreeRTOS堆分配(內(nèi)存)如果不夠大是偷,可能引起FreeRTOS運(yùn)行異常焕妙。
對于STM32芯片践剂, 如果使用STM32CubeMX配置FreeRTOS,創(chuàng)建4個任務(wù)時陨瘩,會引起FreeRTOS運(yùn)行異常腕够,原因是cube默認(rèn)是使用heap_4.c文件來動態(tài)分配內(nèi)存,并將堆大小設(shè)置為3072舌劳,見FreeRTOSConfig.c文件中的定義:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #define configTOTAL_HEAP_SIZE ((size_t)3072)
這個堆大小可以滿足創(chuàng)建3個任務(wù)帚湘,但如果創(chuàng)建4個任務(wù),程序?qū)⑦\(yùn)行異常甚淡。經(jīng)過斷點(diǎn)調(diào)試大诸,可以看到一個任務(wù)在創(chuàng)建時需要申請約600個字節(jié)的內(nèi)存(使用默認(rèn)的任務(wù)堆棧深度為128,即128*4=512字節(jié),TCP塊占用84個字節(jié)资柔,共596字節(jié)焙贷;對于不同的FreeRTOS配置,這個數(shù)值略有差異)贿堰。將上述的3072增加為3670辙芍,此時創(chuàng)建4個任務(wù),再次運(yùn)行正常了羹与。