一,硬件:DSP-TMS320F28377,操作系统:freeRTOS
二,cmd中配置
系统栈:0x9000,大小=2k;
系统堆:0x13000,大小=8k;
全局内存:0xd000,24k;
三,freeRTOS的os堆总大小=2k [#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 2 * 1024 ) )]
os的堆空间:ucHeap[ configTOTAL_HEAP_SIZE ],地址=0xd000
任务2创建时,任务栈给512字节空间,任务2的实现如下:看注释
void Task2(void * pvParameters)
{
Uint8 chTest[20] = {0}; //局部变量地址=0xd908
UBaseType_t more = uxTaskGetStackHighWaterMark(NULL);//more=414
Uint16 heapsize = xPortGetFreeHeapSize(); //heapsize=1432
Uint16 *pS = (Uint16*)pvPortMalloc(10); //pS指针指向地址空间0xD268
Uint16 *pS1 = (Uint16*)malloc(100);//pS1指针指向地址空间0x13012
Uint16 *PS2 = new Uint16[10];//pS2指针指向地址空间0x13078
for(;;)
{
pS[0] = chTest[1];
printf("Task2-%d-%d\n",more,heapsize); //测试发现sprintf或 printf占用大量任务栈空间,大约588字节
UBaseType_t more1 = uxTaskGetStackHighWaterMark(NULL);
Uint16 heapsize1 = xPortGetFreeHeapSize();
char *taskName = pcTaskGetName(NULL);
SendString(taskName);
vTaskDelay(500);
}
四,测试数据显示:
1,任务中局部变量属于os堆,而os堆属于系统全局内存,并不属于系统堆;
2,malloc和new的空间属于系统堆,和os堆没关系;
3,pvPortMalloc的空间属于os堆;
4,more1 = 414表示任务栈还剩414字节(总大小=512字节)
5,heapsize1 = 1432表示os堆还剩1432字节 (总大小=2k)
6,测试时发现问题1:malloc空间为1k时pS1为空,原因是,虽然cmd中系统堆给出了8k,但是工程默认只使用0x400,也就是1k,所以报错,修改位置为:
7,测试发现问题2:任务中使用printf或是sprintf,那么上述配置(任务栈给512)运行时报错,当任务栈给到1k=》
加printf语句时,more1 = 350[总大小=1k] heapsize1 = 904[总大小=2k],
去掉printf语句时,more1 = 902[总大小=1k] heapsize1 = 904[总大小=2k];
结论是printf或sprintf的使用会导致任务额外开销550字节空间;