rt-thead 多片内存加入堆管理

以stm32f429为例,将ccm高速的64ksram加入堆管理

  1. board.h
 board.h
/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-11-5      SummerGift   first version
 */

#ifndef __BOARD_H__
#define __BOARD_H__

#include <rtthread.h>
#include <stm32f4xx.h>
#include "drv_common.h"
#include "drv_gpio.h"
#include <stm32f4xx_hal_flash_ex.h>

#ifdef __cplusplus
extern "C" {
#endif

#define STM32_FLASH_START_ADRESS     ((uint32_t)0x08000000)
#define STM32_FLASH_SIZE             (1024 * 1024)
#define STM32_FLASH_END_ADDRESS      ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))

#define STM32_SRAM_SIZE           192
#define STM32_SRAM_END            (0x20000000 + STM32_SRAM_SIZE * 1024)


#define STM32_SRAM2_SIZE            64
#define STM32_SRAM2_END            (0x10000000 + STM32_SRAM2_SIZE * 1024)
#define HEAP2_END                   STM32_SRAM2_END

#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HEAP_BEGIN      (&Image$$RW_IRAM1$$ZI$$Limit)

extern int Image$$RW_IRAM2$$ZI$$Limit;
#define HEAP2_BEGIN      (&Image$$RW_IRAM2$$ZI$$Limit)


#elif __ICCARM__
#pragma section="CSTACK"
#define HEAP_BEGIN      (__segment_end("CSTACK"))
#else
extern int __bss_end;
#define HEAP_BEGIN      (&__bss_end)
#endif

#define HEAP_END        STM32_SRAM_END

void SystemClock_Config(void);

#ifdef __cplusplus
}
#endif

#endif

  1. drv_common.c

/**
 * This function will initial STM32 board.
 */
RT_WEAK void rt_hw_board_init()
{
#ifdef SCB_EnableICache
    /* Enable I-Cache---------------------------------------------------------*/
    SCB_EnableICache();
#endif

#ifdef SCB_EnableDCache
    /* Enable D-Cache---------------------------------------------------------*/
    SCB_EnableDCache();
#endif

    /* HAL_Init() function is called at the beginning of the program */
    HAL_Init();

    /* enable interrupt */
    __set_PRIMASK(0);
    /* System clock initialization */
    SystemClock_Config();
    /* disable interrupt */
    __set_PRIMASK(1);

    rt_hw_systick_init();

    /* Heap initialization */
#if defined(RT_USING_HEAP)
    static struct rt_memheap _heap2;
    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
	rt_memheap_init(&_heap2, "sram2", (void *)HEAP2_BEGIN, (rt_uint32_t)HEAP2_END - (rt_uint32_t)HEAP2_BEGIN);  // 重点在这里
#endif

    /* Pin driver initialization is open by default */
#ifdef RT_USING_PIN
    rt_hw_pin_init();
#endif

    /* USART driver initialization is open by default */
#ifdef RT_USING_SERIAL
    rt_hw_usart_init();
#endif

    /* Set the shell console output device */
#ifdef RT_USING_CONSOLE
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

    /* Board underlying hardware initialization */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
}
  1. 分散加载文件配置
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
  
	RW_IRAM2 0x10000000 0x00010000  {  ; RW data
	.ANY (+RW +ZI)
  }
}


  1. 这样就好了,用free命令可以看到两个内存堆,建议将堆放在ccm中
上一篇:Windows Phone APP中禁用截图


下一篇:OCP 071【中文】考试题库(cuug整理)第39题