PSoC 4定义一个存放在固定地址的常类型 (const) 变量 – KBA229222

Version 2

    Author: LinglingG_46           Version: **

    问题:
    针对PSoC® 4, 如何定义一个存放在固定地址的const变量?

    答案:
    Const变量可以分配给闪存中的固定地址。为此,必须修改链接器控制文件 (linker script)

    必须计算应用程序结束地址,然后选择const变量存储(const var storage)的地址,避免存储和应用程序出现内存空间重叠。

    根据下面的这些步骤去更新GCCMDK编译器针对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};