请教:SRAM 是如何分配使用的?

[复制链接]
 楼主| haibao211 发表于 2012-9-6 21:43 | 显示全部楼层 |阅读模式
本帖最后由 haibao211 于 2012-9-6 21:44 编辑

stm32的启动文件有如下:

GBLL   FreeRTOS
FreeRTOS        SETL {TRUE}   

Stack_Size      EQU     0x00000400
                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

我使用的片子是stm32f207, SRAM的大小为 128 + 4    Kbytes

问题1:
这是分配了一个堆栈, 大小为0x400和0x200, 如果我裸奔,局部变量是不是都存在这里啊,那剩下的SRAM干什么啊?

问题2:
如果我跑FREERTOS,那我创建了一个任务,比如说
  xTaskCreate(ToggleLed4, "LED4", configMINIMAL_STACK_SIZE, NULL, LED_TASK_PRIO  , NULL);
其中 #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
那么这个任务使用的内存还是  启动文件的那个堆栈吗 即 大小为0x400和0x200的?
还是除了这个堆栈 剩下的那些SRAM?


问题3: 在问题2的基础上,为什么我最多只能分配十个任务?再开任务就开不了了
figo20042005 发表于 2012-9-6 22:36 | 显示全部楼层
这个还是等大牛来解决吧
hechnology 发表于 2012-9-6 23:30 | 显示全部楼层
我也不是很清楚,想想大概是rw、zi。栈、堆了
IJK 发表于 2012-9-7 10:52 | 显示全部楼层
个人觉得FreeRTOS 写得很晦涩,不如uCOS那么直观。

问题1:
裸奔的情况下,局部变量一般是存在堆栈里。剩下的SRAM放外部变量、静态变量。

问题2:
如果跑FREERTOS,
那么这个任务使用的内存放在 剩下的那些SRAM,确切来说放在 xHeap里

问题3:
支持多少个任务,取决于xHeap的大小,其实取决于configTOTAL_HEAP_SIZE 【定义在FreeRTOSConfig.h】
airwill 发表于 2012-9-7 18:18 | 显示全部楼层
其实 RTOS 里, 任务的堆栈会另外分配到内存里, 是任务堆栈, 并不会使用启动文件的那个堆栈.
启动文件的那个堆栈被留给 RTOS 内核, 内核里也称主堆栈.
 楼主| haibao211 发表于 2012-9-8 16:01 | 显示全部楼层
感谢4楼和5楼:

启动文件的那个堆栈 留给了RTOS内核,那么外部硬件中断(如以太网、串口、定时器等)需要的堆栈也是主堆栈吗?
 楼主| haibao211 发表于 2012-9-8 16:09 | 显示全部楼层
另外,分配堆栈的时候,给MAIN分配堆栈是用 汇编写的,那FREERTOS 分配堆栈是不是下面一段代码啊?
/* Allocate the memory for the heap.  The struct is used to force byte
alignment without using any non-portable code. */
static union xRTOS_HEAP
{
        #if portBYTE_ALIGNMENT == 8
                volatile portDOUBLE dDummy;
        #else
                volatile unsigned long ulDummy;
        #endif       
        unsigned char ucHeap[ configTOTAL_HEAP_SIZE ];
} xHeap;
 楼主| haibao211 发表于 2012-9-10 09:36 | 显示全部楼层
自己顶
IJK 发表于 2012-9-10 11:17 | 显示全部楼层
另外,分配堆栈的时候,给MAIN分配堆栈是用 汇编写的,那FREERTOS 分配堆栈是不是下面一段代码啊?
/* Allocate the memory for the heap.  The struct is used to force byte
alignment without using any non-port ...
haibao211 发表于 2012-9-8 16:09


FREERTOS 分配任务堆栈是这段代码。
zsyf0918 发表于 2013-6-9 15:11 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

283

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部