PSoC 4定义一个存放在固定地址的常类型 (const) 变量 – KBA229222
Author: LinglingG_46 Version: **
问题:
针对PSoC® 4, 如何定义一个存放在固定地址的const变量?
答案:
Const变量可以分配给闪存中的固定地址。为此,必须修改链接器控制文件 (linker script)。
必须计算应用程序结束地址,然后选择const变量存储(const var storage)的地址,避免存储和应用程序出现内存空间重叠。
根据下面的这些步骤去更新GCC和MDK编译器针对PSoC 4生成的链接器控制文件,同时进行变量的定义:
1. 打开一个工程进行编译,这是生成linker script必须的。
2. 从目录\<project_name>.cydsn\Generated_Source\PSoC<4, 5>\ 下找到生成的linker script.
GCC编译器,linker script的命名是cm0gcc.ld\cm0plusgcc.ld。
MDK编译器,linker script的命名是Cm0RealView.scat / Cm0plusRealView.scat。
3. 选择所需的linker script,将其复制到同一目录中,然后重命名脚本。例如,将cm0gcc.ld重命名为custom_cm0gcc.ld (类似地将Cm0RealView.scat重命名为Custom_Cm0RealView.scat)。
4. 打开“Build Settings”对话框,从左侧窗格中,在所选编译器展开节点下面选中Linker,在下一级目录中选择General。然后,单击与Custom Linker Script对应的省略号[…]按钮并选择适当的文件。
GCC编译器,选择文件custom_cm0gcc.ld。
MDK编译器,把文件的类型改成*.scat,然后选择文件Custom_Cm0RealView.scat。
5. 单击OK。
6. 针对GCC编译器,打开自定义脚本链接文件 (custom_cmogcc.ld),搜索下面的声明:
.cy_checksum_exclude : { KEEP(*(.cy_checksum_exclude)) } >rom
a. 复制以下代码并将其粘贴在声明之后:
#define MY_VAR_START_ADDRESS < the absolute address in flash>
.my_emulated_eeprom MY_VAR_START_ADDRESS :
{
KEEP(*(.my_var_fix_addr))
} >rom
b. 保存改动并关闭文件。
针对MDK编译器,打开自定义脚本链接文件 (Custom_CmoRealView.scat),搜索下面的申明:
APPLICATION APPL_START (CY_FLASH_SIZE - APPL_START)
{
...
}
c. 复制以下代码并将其粘贴在声明之后:
#define MY_VAR_START_ADDRESS < the absolute address in flash>
EM_EEPROM ( MY_VAR_START_ADDRESS )
{
. my_var_fix_addr+0
{
*(.my_var_fix_addr)
}
}
d. 保存改动并关闭文件。
7. 在新创建的部分中声明const var。为此,在闪存中声明一个数组。下面是数组声明的示例:
const uint8 Test[512]
CY_SECTION(".my_var_fix_addr") = {0xFFu,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x55};