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);
}