本帖最后由 raspRun 于 2025-6-26 09:29 编辑
#每日话题# #申请原创# #技术资源#
在《基于Eclipse+Gcc 环境G32A14xx MCAL开发详解(上)》文章中介绍了G32A1445 MCAL在Eclipse+Gcc开发环境下的搭建和配置应用,接下来对其编译和下载进行讲解说明。
1 编译和下载Ø 编译工程 l 如下图选中工程,右键,在弹出的对话框中点击Build Project进行编译链接:
l 在编译的过程中可以通过Console界面查看编译信息,如下图: l 生成的可执行文件的路径在工程目录下的G32A1445目录下: Ø 调试器配置 l 按下图所示选中工程,右键在弹出的框中选择Debug Configuration,进入调试器设置界面: l 进入调试器配置界面,如下图配置Main界面下的内容 l 进入Debug配置界面,按如下图进行配置 l 进入Startup配置界面,按下图进行配置 l svd文件路径选择,完成后点击标号1对应的Apply将配置应用保存,然后点击标号2对应的Debug按键可以进行调试: l 调试器配置完成后,若要再次进入调试模式,可以点击工具栏中的如下图红色框所以的图标: Ø 烧录调试工程 l 烧录器配置完成后,直接点击标号1对应的图标进行烧录调试 l 点击图标后,进入调试界面 l 点击单步调试程序会单步执行,同时可以查看变量值: 2 链接文件说明 根据使用芯片平台,需在工程中配置对应的链接脚本。
G32A1445存储资源分配:
Ø 512KB Flash和64KB SRAM根据需求可将其分为以下段资源,根据项目开发需求可做动态调整,以下是部分链接脚本配置代码。
MEMORY {
// 定义不同存储区域的起始地址和长度
flash_rsvd1_region (rx) : ORIGIN = 0x00000000, LENGTH = 0x08
// 保留区1,常用于启动配置
flash_rsvd2_region (rx) : ORIGIN = 0x00000400, LENGTH = 0x10
// 保留区2,存放闪存配置
flash_rsvd_fls_region (rx) : ORIGIN = 0x00000410, LENGTH = 0x60
// FLS相关存储区域
flash_rsvd_eep_region (rx) : ORIGIN = 0x00000470, LENGTH = 0xC0
// EEPROM相关存储区域
flash_memory_region (rx) : ORIGIN = 0x00000530, LENGTH = 0x7FFFF - 0x530
// 主闪存存储区,从0x530开始,长度为剩余空间
iram_intvec_region (rwx) : ORIGIN = 0x1FFF8000, LENGTH = 0x1FFF8388 - 0x1FFF8000
// IRAM中的中断向量表存储区(只读可写)
iram_main_region (rwx) : ORIGIN = 0x1FFF8390, LENGTH = 0x20006A0F - 0x1FFF8390
// IRAM中的主要代码和数据存储区(可读写)
iram_stack_region (rw) : ORIGIN = 0x20006A10, LENGTH = 0x400
// IRAM中的堆栈区
iram_rsvd_fls_region (rw) : ORIGIN = 0x20006E10, LENGTH = 0x60
// IRAM中的FLS保留区(未用)
iram_rsvd_eep_region (rw) : ORIGIN = 0x20006E70, LENGTH = 0x20006F2F - 0x20006E70
// IRAM中的EEPROM保留区(未用)
iram_results_region (rw) : ORIGIN = 0x20006F30, LENGTH = 0x20006FFF - 0x20006F30
// IRAM中的结果存储区(未定义用途)
}
ENTRY(Reset_Handler) // 系统复位入口点
__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 1K; // 栈大小,未定义则为1K
SECTIONS {
// 定义各段在内存中的分配位置
AppRCW : {
KEEP(*(.rcw));
} > flash_rsvd1_region
// 启动配置区,存放rcw段
AppFlashConfig : {
KEEP(*(.flash_config));
} > flash_rsvd2_region
// 存放闪存配置
AppACFLSCode : {
KEEP(*(.acfls_code_rom));
} > flash_rsvd_fls_region
// FLS代码区
AppACEEPCode : {
KEEP(*(.aceep_code_rom));
} > flash_rsvd_eep_region
// EEPROM代码区
AppCode : {
*(.mcal_text*);
*(.text*);
. = ALIGN(4);
} > flash_memory_region
// 应用主要代码段,存放在flash存储区
AppROData : {
*(.mcal_const_cfg*);
*(.mcal_const*);
*(.rodata*);
. = ALIGN(4);
} > flash_memory_region
// 只读数据区,包括常量和配置
AppIntVec_Init : {
KEEP(*(.intc_vector_init))
} > flash_memory_region
// 中断向量表初始化数据存放在flash
_flashivectors = LOADADDR(AppIntVec_Init); // 中断表在flash中的地址
_endivectors = _flashivectors + SIZEOF(AppIntVec); // 中断表结束地址
AppIntVec : {
_svectors = .; // 中断向量表在RAM中的起始地址
KEEP(*(.intc_vector));
_evectors = .; // 中断向量表在RAM中的结束地址
} > iram_intvec_region AT > flash_memory_region
_ramivectors = ADDR(AppIntVec); // 中断向量表在RAM中的地址
AppStartup : {
KEEP(*(.startup));
KEEP(*(.systeminit));
KEEP(*(.text.Reset_Handler));
} > flash_memory_region
// 启动和系统初始化代码存放在flash
AppData_Init : {
_sidata = .; // 初始化数据起始地址
KEEP(*(.mcal_data_init));
KEEP(*(.data_init));
} > flash_memory_region
_flashappdata = LOADADDR(AppData_Init); // 初始化数据在flash中的地址
_endappdata = _flashappdata + SIZEOF(AppData); // 初始化数据结束地址
AppData : {
_sdata = .; // 数据段起始
*(.mcal_data*);
*(.data*);
_edata = .; // 数据段结束
} > iram_main_region AT > flash_memory_region
_ramappdata = ADDR(AppData); // 数据在RAM中的地址
AppRAMCode_Init : {
KEEP(*(.ramcode_init))
} > flash_memory_region
_flashramcode = LOADADDR(AppRAMCode_Init); // RAM代码初始化区地址
_endramcode = _flashramcode + SIZEOF(AppRAMCode);
AppRAMCode : {
_sramcode = .; // RAM代码起始
*(.ramcode*);
. = ALIGN(4);
_eramcode = .; // RAM代码结束
} > iram_main_region AT > flash_memory_region
_ramcode = ADDR(AppRAMCode); // RAM代码地址
AppBSS_NO_CACHE (NOLOAD) : {
_sbss_nc = .; // BSS段起始(未初始化全局变量)
*(.mcal_bss_no_cacheable*);
. = ALIGN(4);
_ebss_nc = .; // BSS段结束
} > iram_main_region
AppData_NO_CACHE_Init : {
_sidata_nc = .; // 非缓存数据初始化起始
KEEP(*(.mcal_data_no_cacheable_init));
} > flash_memory_region
_flashappdatanocache = LOADADDR(AppData_NO_CACHE_Init); // 非缓存数据初始化地址
_endappdatanocache = _flashappdatanocache + SIZEOF(AppData_NO_CACHE);
AppData_NO_CACHE : {
_sdata_nc = .; // 非缓存数据起始
*(.mcal_data_no_cacheable*);
. = ALIGN(4);
_edata_nc = .; // 非缓存数据结束
} > iram_main_region
AppBSS (NOLOAD) : {
_sbss = .; // BSS未初始化全局变量起始
__bss_start__ = .;
*(.mcal_bss*);
*(.bss*);
*(COMMON);
. = ALIGN(4);
_ebss = .; // BSS未初始化全局变量结束
__bss_end__ = .;
} > iram_main_region
AppSTACK (NOLOAD) : {
. = ALIGN(16);
. += __STACK_SIZE; // 栈大小
*(.stack_main*);
. = ALIGN(16);
_estack = .; // 栈顶指针
} > iram_stack_region
.heap (NOLOAD) : {
. = ALIGN(8);
end = .; // 堆区结束
_end = .; // 堆区结束符号
} > iram_main_region
}
// 定义一些地址常量,用于硬件配置和调试
_Stack_end = ORIGIN(iram_stack_region);
_Stack_start = ORIGIN(iram_stack_region) + LENGTH(iram_stack_region);
INT_SRAM_START = ORIGIN(iram_main_region);
INT_SRAM_SIZE = (LENGTH(iram_main_region) +
LENGTH(iram_stack_region) +
LENGTH(iram_results_region) +
LENGTH(iram_rsvd_fls_region) +
LENGTH(iram_rsvd_eep_region) + 3) / 4; // 计算总的内部SRAM大小(以字为单位)
INT_SRAM_END = ORIGIN(iram_main_region) +
LENGTH(iram_main_region) +
LENGTH(iram_stack_region) +
LENGTH(iram_results_region) +
LENGTH(iram_rsvd_fls_region) +
LENGTH(iram_rsvd_eep_region);
// FLS和EEPROM相关区域的起止地址与大小
Fls_ACEraseRomStart = ORIGIN(flash_rsvd_fls_region);
Fls_ACEraseRomEnd = ORIGIN(flash_rsvd_fls_region) + LENGTH(flash_rsvd_fls_region);
Fls_ACEraseSize = (LENGTH(flash_rsvd_fls_region) + 3) / 4;
Fls_ACWriteRomStart = ORIGIN(flash_rsvd_fls_region);
Fls_ACWriteRomEnd = ORIGIN(flash_rsvd_fls_region) + LENGTH(flash_rsvd_fls_region);
Fls_ACWriteSize = (LENGTH(flash_rsvd_fls_region) + 3) / 4;
_ERASE_FUNC_ADDRESS_ = ORIGIN(iram_rsvd_fls_region); // FLS擦除函数地址
_WRITE_FUNC_ADDRESS_ = ORIGIN(iram_rsvd_fls_region); // FLS写入函数地址
EEPROM_ACWRITEROMSTART = ORIGIN(flash_rsvd_eep_region);
Eep_ACWriteRomEnd = ORIGIN(flash_rsvd_eep_region) + LENGTH(flash_rsvd_eep_region);
EEPROM_ACWRITESIZE = (LENGTH(flash_rsvd_eep_region) + 3) / 4;
_WRITE_FUNC_ADDRESS_EEP_ = ORIGIN(iram_rsvd_eep_region);
// BSS段和数据段的符号定义
PROVIDE(_sbss_no_cache = _sbss_nc);
PROVIDE(_ebss_no_cache = _ebss_nc);
PROVIDE(_sdata_no_cache = _sdata_nc);
PROVIDE(_edata_no_cache = _edata_nc);
PROVIDE(__bss_start__ = _sbss);
PROVIDE(__bss_end__ = _ebss);
// 断言:确保非缓存BSS不超过RAM空间
ASSERT(SIZEOF(AppBSS_NO_CACHE) <= (LENGTH(iram_main_region) - (_ebss - _sbss)),
"Error: AppBSS_NO_CACHE exceeds available RAM");
|