打印

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

[复制链接]
5279|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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】

使用特权

评论回复
5
airwill| | 2012-9-7 18:18 | 只看该作者
其实 RTOS 里, 任务的堆栈会另外分配到内存里, 是任务堆栈, 并不会使用启动文件的那个堆栈.
启动文件的那个堆栈被留给 RTOS 内核, 内核里也称主堆栈.

使用特权

评论回复
6
haibao211|  楼主 | 2012-9-8 16:01 | 只看该作者
感谢4楼和5楼:

启动文件的那个堆栈 留给了RTOS内核,那么外部硬件中断(如以太网、串口、定时器等)需要的堆栈也是主堆栈吗?

使用特权

评论回复
7
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;

使用特权

评论回复
8
haibao211|  楼主 | 2012-9-10 09:36 | 只看该作者
自己顶

使用特权

评论回复
9
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 分配任务堆栈是这段代码。

使用特权

评论回复
10
zsyf0918| | 2013-6-9 15:11 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

283

帖子

0

粉丝