【问题标题】:Reserve flash memory space in TI cc26xx在 TI cc26xx 中预留闪存空间
【发布时间】:2017-10-27 10:28:27
【问题描述】:

我目前正在尝试在链接器文件中保留闪存的一个扇区,以将一些数据保存到其中(使用 driverlib API)。我首先将脚本写入特定的内存地址,然后运行我的应用程序来读取保存的数据。

不幸的是,每当我刷机时,数据都会丢失。因此,我正在尝试更改链接器文件并保留一些空间,但我不确定我是否正确执行此操作。我将不胜感激任何帮助或提示。

MEMORY
{
    /* Flash Size 128 KB minus the CCA area below (88 bytes) */
    /* OLD: FLASH (RX) : ORIGIN = 0x00000000, LENGTH = 0x0001FFA8 */
    FLASH (RX) : ORIGIN = 0x00000000, LENGTH = 0x0001FF88

    /*
     * Custom reserved memory space with size of 32 bytes
     */
    CNVM (RX)  : ORIGIN = 0x0001FF88, LENGTH = 32

    /*
     * Customer Configuration Area and Bootloader Backdoor configuration
     * in flash, up to 88 bytes
     */
    FLASH_CCFG (RX) : ORIGIN = 0x0001FFA8, LENGTH = 88

    /* RAM Size 20KB */
    SRAM (RWX) : ORIGIN = 0x20000000, LENGTH = 0x00005000

    /* Application can use GPRAM region as RAM if cache is disabled in CCFG */
    GPRAM (RWX) : ORIGIN = 0x11000000, LENGTH = 0x00002000
}

/*. Highest address of the stack. Used in startup file .*/
_estack = ORIGIN(SRAM) + LENGTH(SRAM); /* End of SRAM */

/*. Generate a link error if heap and stack don’t fit into RAM .*/
_Min_Heap_Size = 0;
_Min_Stack_Size = 0x100;

SECTIONS
{
    .text :
    {
        _text = .;
        KEEP(*(.vectors))
        *(.text*)
        *(.rodata*)
        _etext = .;
    } > FLASH = 0

    .text:
    {
        *(.rodata*)
    } > CNVM

    .data :
    {
        _data = .;
        *(vtable)
        *(.data*)
        _edata = .;
    } > SRAM AT > FLASH

    .ARM.exidx :
    {
        *(.ARM.exidx*)
    } > FLASH

    .bss :
    {
        _bss = .;
        *(.bss*)
        *(COMMON)
        _ebss = .;
    } > SRAM

    .ccfg :
    {
        KEEP(*(.ccfg))
    } > FLASH_CCFG

    /* User_heap_stack section, used to check that there is enough RAM left */
    ._user_heap_stack :
    {
      . = ALIGN(4);
      . = . + _Min_Heap_Size;
      . = . + _Min_Stack_Size;
      . = ALIGN(4);
    } > SRAM

    .gpram :
    { 
    } > GPRAM

}

【问题讨论】:

  • 如何刷板?
  • 我猜你正试图在闪存上的空间应用程序之间保留空间,CNVM (RX) : ORIGIN = 0x0001FF88, LENGTH = 32。我建议将自定义保留空间移动到闪存的末尾,当您擦除和闪存固件时,只需擦除应用程序的大小,然后再闪存应用程序。
  • @GauravPathak 他已经在使用尽可能接近“闪存结束”的区域。
  • @kfx 我明白了! FLASH (RX) : ORIGIN = 0x00000000, LENGTH = 0x0001FF88。谢谢!
  • @kfx 我正在使用 TI UniFlash 工具。

标签: c linker contiki flash-memory


【解决方案1】:

在我的情况下,使用链接器方法并没有提供所需的结果。我最终做的是在刷新传感器标签之前从我的代码中编辑生成的二进制文件。

在 linux 上使用 hexdump 命令如下hexdump generated_binary_file.bin 可以注意到每一行都包括起始内存地址(对于特定范围的地址),然后是写入该范围的数据。

因此,使用一个小的 python 脚本可以更改某一行中的值并生成自己修改过的二进制文件,该文件稍后将被刷新到 sensortag。内存地址内容可以使用您在初始代码中包含的特定功能(在 bin 生成和编辑之前)读取,例如 memcpy()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多