MCU系统说明
编译系统基本说明
MCU的编译系统基于Scons3.0.0创建(Scons 3.0.0用户手册官网)。
MCU1编译系统
MCU1编译系统位于mcu/Build/FreeRtos_mcu1,具体目录结构,如下图所示:
FreeRtos_mcu1
├── build_freertos.py                   # 编译的入口脚本
├── SConstruct_Lite_FRtos_S100_sip_B    # Scons参与编译文件夹以及输出目录
├── settings_freertos.py                # Scons编译命令参数相关的文件
└── Linker                              # 编译link脚本所在目录
     └── gcc
          └── S100.ld
编译流程介绍

编译中的重点文件关系介绍
build_freertos.py是编译的整体入口,但是实际调度到scons时,能够对scons编译环境/流程产生影响的方式有以下几个:
- SConstruct文件:SConstruct文件是scons编译的定义文件,它和每个模块内的Sconscript组成了Cmake里Cmakefile;Make系统里makefile的作用;
- settings_freertos.py:该文件生效的入口实际上是SConstruct里面的“Variables”类的初始化,核心在于引入一系列静态定义的编译环境变量;环境变量的变量名就是settings_freertos.py里面的变量名,变量值就是settings_freertos.py里面的变量名对应的变量值;“Variables”类实例化后的示例会被Environment类使用,用于scons的编译
- gcc_arm.py:实际定义编译命令的定义文件,真正生效的入口是settings_freertos.py里面定义 的“COMPILER_TOOL”字段,COMPILER_TOOL字段进一步会被Sconscruct文件的Variables添加并最后被env获取到其中的“CC”等配置
MCU1镜像layout
| 区域名称 | 起始地址 | 占用大小 | 作用 | 
|---|---|---|---|
| FLASH_STARTUP | 0x0CAB0000 | 1K | 启动代码位置 | 
| FLASH | 0x0CAB0400 | 2731K | 代码、数据、栈等使用的区域 | 
| FREERTOS_HEAP | 0x0CD5B000 | 512K | 堆空间 | 
| LOG_SHARE_Reserved | 0x0CDDB000 | 8K | MCU1 log存放的空间,log会循环覆盖 | 
| SCMI_IPC_Reserved | 0x0CDDD000 | 12K | SCMI IPC通信需要的空间,用于buffer及关键数据 | 
在上述SRAM的排布中, 强烈不建议客户修改SCMI_IPC_Reserved及其之后的区域。 这些部分大部分都是其他域一定会使用的关键位置,修改可能导致异常。如果要修改,请先咨询地瓜相关支持人员。
下面是地瓜版本中的链接文件,解释了链接脚本中提供的一些变量作用:
MEMORY
{
    FLASH_STARTUP(rx)       : org = 0x0CAB0000, len = 1K
    FLASH(rw)               : org = 0x0CAB0400, len = 2731K
    FREERTOS_HEAP(rw)       : org = 0x0CD5B000, len = 512K
    LOG_SHARE_Reserved(rw)  : org = 0x0CDDB000, len = 8K
    SCMI_IPC_Reserved(rw)   : org = 0x0CDDD000, len = 12K
}
/* Define output sections */
SECTIONS {
     .EL2_core_exceptions_table :
     {
          . = ALIGN(32);
          _start = .;
          *(.EL2_core_exceptions_table)
          . = ALIGN(32);
     } > FLASH_STARTUP
     .EL2_Reset_Handler :
     {
          . = ALIGN(32);
          *(.EL2_Reset_Handler)
          . = ALIGN(32);
     } > FLASH_STARTUP
     .EL1_core_exceptions_table :
     {
          . = ALIGN(32);
          *(.EL1_core_exceptions_table)
          . = ALIGN(32);
     } > FLASH_STARTUP
     .text :
     {
          . = ALIGN(4);
          *(.text)                 /* .text sections (code) */
          . = ALIGN(4);
     } > FLASH
     .shell :
     {
          _shell_command_start = .;
          KEEP (*(shellCommand))
          _shell_command_end = .;
     } > FLASH
     .mcal_text :
     {
          *(.mcal_text)
     } > FLASH
     .mcal_const_cfg :
     {
          *(.mcal_const_cfg)
     } > FLASH
     .mcal_const :
     {
          *(.mcal_const)
     } > FLASH
     .common_text :
     {
          *(.common_text)
          PROVIDE(__TEXT_END = .);
     } > FLASH
     /******************text end******************/
     .const :
     {
          . = ALIGN(32);
          *(.const)
          *(.rodata)
     } > FLASH
     .heap :
     {
          . = ALIGN(64);
          __HEAP_START = .;
          __end__ = .;
          __heap_start__ = .;
          PROVIDE(end = .);
          PROVIDE(_end = .);
          PROVIDE(__end = .);
          __HeapBase = .;
          . += HEAP_SIZE;
          __HeapLimit = .;
          __heap_limit = .;
          __heap_end__ = .;
     } > FLASH
     .u_boot_list :
     {
          . = ALIGN(4);
          *(SORT(.u_boot_list*))
          . = ALIGN(4);
     } > FLASH
     .global_data :
     {
          . = ALIGN(64);
          __DATA_RAM = .;
          __data_start__ = .;      /* Create a global symbol at data start. */
          *(.data)                 /* .data sections */
          . = ALIGN(64);
          __data_end__ = .;        /* Define a global symbol at data end. */
          PROVIDE(__DATA_END = .);
          PROVIDE(__DATA_ROM = .);
     } > FLASH
     .stack (NOLOAD) :
     {
          . = ALIGN(64);
          __STACK_START = .;
          __StackLimit = .;
          __stack_start__ = .;
          . += STACK_SIZE;
          __stack_end__ = .;
          __StackTop = .;
     } > FLASH
     .stack_exc (NOLOAD) :
     {
          . = ALIGN(64);
          __StackLimit_exc = .;
          __stack_start_exc__ = .;
          . += STACK_SIZE_EXC;
          __stack_end_exc__ = .;
          __StackTop_exc = .;
          __STACK_END = .;
     } > FLASH
     .init_table :
     {
          . = ALIGN(64);
          __COPY_TABLE = .;
          KEEP(*(.init_table))
     } > FLASH
     .zero_table :
     {
          . = ALIGN(64);
          __ZERO_TABLE = .;
          KEEP(*(.zero_table))
     } > FLASH
     .interrupts :
     {
          __VECTOR_TABLE = .;
          __interrupts_start__ = .;
          . = ALIGN(4);
          KEEP(*(.isr_vector))     /* Startup code */
          __interrupts_end__ = .;
          . = ALIGN(4);
     } > FLASH
     __VECTOR_RAM = __VECTOR_TABLE;
     __RAM_VECTOR_TABLE_SIZE = 0x0;
     __VECTOR_TABLE_COPY_END = __VECTOR_TABLE + __RAM_VECTOR_TABLE_SIZE;
     .interrupt_drv_shared_memory :
     {
          *(.interrupt_drv_shared_memory)
     } > FLASH
     .handlers :
     {
          . = ALIGN(32);
          *(.handlers)
     } > FLASH
     .mcal_data :
     {
          *(.mcal_data)
     } > FLASH
     .mcal_shared_data :
     {
          *(.mcal_shared_data)
     } > FLASH
     .bss (NOLOAD) :
     {
          . = ALIGN(64);
          __BSS_START = .;
          __bss_start__ = .;
          *(.bss)
     } > FLASH
     .mcal_bss (NOLOAD) :
     {
          . = ALIGN(64);
          *(.mcal_bss)
     } > FLASH
     .mcal_shared_bss (NOLOAD) :
     {
          . = ALIGN(64);
          *(.mcal_shared_bss)
          __DATA_RAM_END = .;
          __m_ram_init_end = .;
          __bss_end__ = .;
          __BSS_END = .;
     } > FLASH
     .ipc_mdma :
     {
          *(.ipc_mdma)
     } > FLASH
     .ucheap_section (NOLOAD) :
     {
          . = ALIGN(64);
          KEEP(*(.ucheap_section))
          . = ALIGN(64);
     } > FREERTOS_HEAP
     .log (NOLOAD) :
     {
          *(.log)
     } > LOG_SHARE_Reserved
     /*-------- LABELS USED IN CODE -------------------------------*/
     SRAM_START_ADDR         = ORIGIN(FLASH_STARTUP);
     MCU_LOG_START_ADDR      = ORIGIN(LOG_SHARE_Reserved);
     __SCMI_IPC_START_ADDR   = ORIGIN(SCMI_IPC_Reserved);
     NON_SECURE_START_ADDR   = ORIGIN(LOG_SHARE_Reserved);
     PROVIDE(SRAM_SIZE = 0x34FFFF);
}