freeRTOS的堆和栈---基于DSP

一,硬件: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字节空间;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值