freeRtos虚拟堆栈与内存分配

static void vTaskLED1(void *pvParameters)
{
uint8_t j = 0;
    while(1) {
	j++;
	vTaskDelay(3);
   }
}
StackType_t    user1_puxStackBuffer[24] = {0};
StaticTask_t   user1_pxTaskBuffer[256] = {0};

int main(void)
{	  
    xTaskCreateStatic(vTaskLED1, "vTaskLED1", 24, NULL, 1, user1_puxStackBuffer, user1_pxTaskBuffer);
    vTaskStartScheduler();
}

其中user1_puxStackBuffer的首地址是0x20000068

执行函数xTaskCreateStatic,当执行完pxNewTCB->pxTopOfStack = pxTopOfStack;之后得到:

00x20000068
10x2000006C
20x20000070
30x20000074
40x20000078
50x2000007C
60x20000080R4<==pxTopOfStack
70x20000084R5
80x20000088R6
90x2000008CR7
100x20000090R8
110x20000094R9
120x20000098R10
130x2000009CR11
140x200000A0R0pvParameters
150x200000A4R1
160x200000A8R2
170x200000ACR3
180x200000B0R12
190x200000B4LRprvTaskExitError
200x200000B8PCpxTaskCode
210x200000BCxPSRportINITIAL_XPSR
220x200000C0
230x200000C4

watchlist如下图:


然后执行到图的位置发现watchlist没有任何变化,如下图:


但是上图可以看到 j  的值已经变为 1 了。

然后单步(快捷键F11)进入taskdelay,看到寄存器R0的值变味3,如下图:


然后再单步运行一步(快捷键F11),如下图:


可以看到register界面的R4也变为1,右侧watchlist的虚拟堆栈[18]的值有个1.

然后全速运行(快捷键F5),如下图:


可以看到上图右侧watchlist虚拟堆栈的[17]值是0x61000000,这个位置正是xPSR的位置,在本文的开头xPSR的位置在[21]的位置,可以看出虚拟栈的位置向低地址挪了(21-17)*4=16字节,挪出来给虚拟堆(就是给临时变量)使用了。




另外,非常值得注意的几点:

(1)仔细观察可以发现上图[21]有个0x08000423,。

经过试验发现,如果把临时变量弄多一点,比如把变量j改成个数组,那么类似于0x08000423就没了。说白了就是说这个0x08000423是什么我还是没有搞清楚。

(2)task下的临时内存定义了,即便没有调用,也会占用虚拟堆的资源。因为这个虚拟毕竟是虚拟的,没有真实的编译器那么智能,真实的编译器(就是说非OS情况下)会判断临时变量没有被使用,不将其编译进去(就是不分配内存),即便在优先级是0的情况下。这个ARMCC编译器还是很牛的。


一点心得,长路漫漫,离真正弄懂这个freeRtos还有很长的路要走!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值