This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 在上传固件期间写入特定的闪存地址

Guru**** 2351680 points
Other Parts Discussed in Thread: SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1212133/writing-to-a-specific-flash-address-during-uploading-a-fw

"Thread:SysConfig"中讨论的其他器件

您好!

我使用 NVS 函数将参数写入闪存。 它工作的很好。 我想检查所有参数是否成功写入(我执行多次写入/擦除)。 我知道(并且我使用它)在写后有检查。 但是、如果在写入期间发生电源中断、将丢失一些数据。 我认为检查它的最容易的方法是使用闪存中的另一个变量,我在所有写入后重置(设置为零),我设置了不同的值。 那么我可以随时检查该变量的值、如果变量不是所选值、则存在闪存问题。 我已经实现了这一点。 但问题是上传固件后的第一个启动。 我能否告诉编译器在我的 NVS 段中写入一个特定地址的值? 我尝试了#pragma location 和#pragma DATA_SECTION、但它不起作用。 我使用 CCS 和 CC1312 (在此处填写 MCU 的器件型号后、我无法选择 CCS 论坛)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    我尝试了#pragma location 和#pragma DATA_SECTION、但它不起作用。

    绝缘材料 #pragma 位置 "你看到了什么让你知道它不起作用?  您具体是如何看到它的?

    谢谢。此致、

    -George.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我使用它时、我看到"程序将无法放入可用内存中、或者该段包含的调用站点需要无法为此段生成的 trampoline。 对齐后运行对齐失败的段".TI.bound:checkFlashVar"大小0x2、与".TI.bound:flashBuf0"、大小0x4000 (第0页)"重叠。 我认为发生这种情况是因为此 pragma 不仅会写入特定的地址、还会增加写入位置的段。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想您使用 #pragma 位置 执行该操作 CheckFlashVar flashBuf0 它们在内存中重叠。  您必须更改其中之一的地址、或者不使用 #pragma 位置 或类似的东西来执行该过程。

    谢谢。此致、

    -George.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    flashBuf0不是变量、它可能是闪存段的内部名称。 我不在任何地方使用 flashBuf0变量。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我唯一知道的方法是创建一个名为...的输出段

    .TI.bound:flashBuf0

    ... 是写 C 代码类似于...

    #pragma LOCATION(flashBuf0, 0x1000)
    unsigned char flashBuf0[0x4000];

    您必须采用其他方式创建此输出段。  你怎么做?

    此外、您使用哪个编译器、以及版本是什么?

    谢谢。此致、

    -George.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不幸的是使用指针类型 NVS 没有帮助。 我可以在特定地址创建变量、而不会出现任何错误。 但当我开始调试时、程序无法启动。 它最终跳到了错误的 ISR。 我还检查了闪存地址、除了0xFF 之外没有所需的值。

    我使用编译器 TI v20.2.5.LTS

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 IGI:  

    我可以使用 pragma 位置将字符数组放置在特定位置。  

    我选择了不等于0x10000的任意位置0x4000、这是我的 NVS 驱动程序的保留区域。(名为 flashbuf0)

    在这种情况下、错误消息提示您的字符串所使用的内存位置与 NVS 驱动程序所在的区域相同(位于 regionBase 和 regionBase+regionSize 之间)。    

    当我使用它时,我看到"程序将无法装入可用内存,或者该节包含一个调用站点,该调用站点需要一个 trampoline 而无法为该节生成。 对齐段".TI.bound:checkFlashVar"大小0x2的运行定位失败、与".TI.bound:flashBuf0"、大小0x4000 (PAGE 0)"重叠。

    NVS 区域和字符串位置重叠会导致您看到错误消息。  

    您可以在 SysConfig 上将指针用作 RegionType。 这样、SysConfig 就不会创建放置在该区域中的变量 flashbuf0、从而允许您与要放置的变量和此 NVS 区域重叠。  


    此致、

    SID