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.

[参考译文] MSP-EXP432E401Y:#pragma DATA_SECTION (symbol、"section name")使程序执行挂起

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1118243/msp-exp432e401y-pragma-data_section-symbol-section-name-makes-program-execution-hanged

器件型号:MSP-EXP432E401Y
Thread 中讨论的其他器件:SYSBIOS

您好!

我将 uartecho 项目导入 CCS、并 添加一些代码来测试如何将数据保存到闪存区域。

因此、我按如下方式更改了.cmd 文件:

--stack_size=8192   /* C stack is also used for ISR stack */

HEAPSIZE = 0x20000;  /* Size of heap buffer used by HeapMem */

MEMORY
{
    FLASH (RX)  : origin = 0x00000000, length = 0x000FF000
    MYDATA (RW) : origin = 0x000FF000, length = 0x00001000
    SRAM (RWX)  : origin = 0x20000000, length = 0x00040000
}

/* Section allocation in memory */

SECTIONS
{
    .text   :   > FLASH
    .const  :   > FLASH
    .rodata :   > FLASH
    .cinit  :   > FLASH
    .init_array : > FLASH
    myvars      : {} > MYDATA

    .TI.ramfunc : {} load=FLASH, run=SRAM, table(BINIT)
    .data   :   > SRAM
    .bss    :   > SRAM
    .sysmem :   > SRAM

    /* Heap buffer used by HeapMem */
    .priheap   : {
        __primary_heap_start__ = .;
        . += HEAPSIZE;
        __primary_heap_end__ = .;
    } > SRAM align 8

    .stack  :   > SRAM (HIGH)
}

 请注意 MyData 和 myvars。

我将以下代码片段放入 uartecho.c 中:

/* pragmas to define the variables in flash */
#pragma DATA_SECTION(var1, "myvars");
#pragma RETAIN(var1)
uint32_t var1 = 125;
#pragma DATA_SECTION(var2, "myvars");
#pragma RETAIN(var2)
uint32_t var2 = 300;
 

我编译了项目并开始调试。 然后、我立即看到以下调试会话屏幕截图。
程序运行进入退出状态、然后挂起。

出于测试目的、我通过添加 const 修改了变量 var1和 var2的属性。

 const uint32_t var1 = 125;
 const uint32_t var2 = 300;

然后 uartecho 程序运行良好。

这意味着我不能更改/修改闪存中特定位置的内容。

如何动态更改闪存中定义的 var1和 var2的内容?

任何提示/建议都将提前得到认可。

HaeSeung

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

    您好 HasSeung、

    如果您想要写入闪存、我认为您需要启用闪存操作功能。

    您将一些变量推入闪存、因此必须在更改这些变量之前启用闪存写入函数。

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:

    我想提出 3个问题:
     1.如果我使用#pragma DATA_SECTION (var1、"myvars")定义变量、如 var1;
       那么,我是否 必须将 var1定义为常量变量,例如  const uint32_t var1 = 100;?
       如果是真的,那么为什么呢?

     2.如果我想在闪存存储器区域中写入一些数据,我是否必须使用 FlashProgram()函数?
       我想在闪存中写入一些数据、只需为变量 var1分配值即可。  

     3.或以下方案为非法模式?:
        #pragma DATA_SECTION (var1、"myvars");
        uint32_t var1 = 100;

        然后我使用 FlashProgram()函数更改 var1的内容。
        如果允许、我只需使用变量名称 var1来访问闪存的内容。  
        不允许执行此过程吗?

    提前非常感谢、感谢您的任何提示。

    HaeSeung


        

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

    HaeSeung、您好!

    [引用 userid="397173" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1118243/MSP-exp432e401y-pragma -data_section-symbol-section-name-ges-program-execution-hanged/4688、 pragma (if)、pragma #1461"、如"var1、pragma 1、pragma 1、pragma 1、pragma、pragma、var1、pragma、pragma 1、pragma、var1、pragma、pragma、pragma
       那么,我是否 必须将 var1定义为常量变量,例如  const uint32_t var1 = 100;?
       如果为 true,则为什么?

    对于 Q1、您可以在闪存中将 var1定义为正常变量、例如 uint32_t var1 = 100;这是可以的、如果您将此变量定义到闪存中、即使在下电上电后也可以保留此值。

    [~ userid="397173" URL"μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1118243/MSP-exp432e401y-pragma DATA_SECTION section-name-gest-program-execution-hanged/4688  i 写入闪存区数据(如果我想在闪存区中写入某些数据)。]
       我想在闪存中写入一些数据、只需为变量 var1分配值即可。  [/报价]

    对于 Q2,是的,如果此变量在闪存中定义,则必须使用 FlashProgram()函数来写入某些变量,否则闪存写入默认值为禁用。

    [~引语 userid="397173" URL"μ C/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forum/1118243/MSP-exp432e401y-pragma DATA_SECTION -section-name-gence-program-execution-hanged/4146688"

    3.或以下方案为非法模式?:
        #pragma DATA_SECTION (var1、"myvars");
        uint32_t var1 = 100;

        然后我使用 FlashProgram()函数更改 var1的内容。
        如果允许、我只需使用变量名称 var1来访问闪存的内容。  
        不允许执行此过程吗?

    [/报价]

    对于 Q3、不能更改 contants 变量。

    谢谢!

    此致

    Johnson

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

    尊敬的 Johnson:

    感谢您对第二季度和第三季度的回答。 现在我了解了。

    关于 Q1、我听从了您的建议、但仍然有问题。 我的设置如下:

    在  MSP_EXP432E401Y_TIRTOS.cmd 中
      --stack_size=8192 /* C stack 也用于 ISR 堆栈*/

     HEAPSIZE = 0x20000;HeapMem 使用的堆缓冲区的大小*/

      存储器
     {
       闪存(RX):origin = 0x00000000,length = 0x000FF000
       MyData (rwx):origin = 0x000FF000,length = 0x00001000
       SRAM (rwx):origin = 0x20000000,length = 0x00040000
     }

     /*内存中的段分配*/

     部分
     {
       .text:> FLASH
       .const:> FLASH
       .rodata:> FLASH
       .cinit:>闪存
       .pinit : > FLASH

       init_array:> FLASH
       myvars :{}> MyData

       .TI.ramfunc:{} load=flash,run=SRAM,table (BINIT)
       .data :> SRAM
       .bss:> SRAM
       .sysmem:> SRAM

       /* HeapMem 使用的堆缓冲区*/
       .priheap:{
         _primary_heap_start__=.;
         。 += HEAPSIZE;
         __primary_heap_end__=.;
     }> SRAM 对齐8

       .stack:> SRAM (高)
     }

     在 uartecho.c 中、我将以下代码放在 #include file 语句下方
     #pragma DATA_SECTION (var1、"myvars");
     uint32_t var1 = 100;
     #pragma DATA_SECTION (var2、"myvars");
     uint32_t var2 = 200;  

    编译正常。

    开始调试,然后立即执行程序进入 exit()。  

    我附上其屏幕截图:

    "Debug"视图:

    "Console"视图:
      

    源视图:


    它的运行是非常不可预料的。

    Console 视图中的错误消息显示:  
       TI.SYSBIOS.family.ARM.m3/Hwi:第1259行:E_BUSFault:PRECISERR:立即总线故障、确切的已知地址、地址:000ff000
       在 PC = 0x00007ab6的后台线程中发生异常。

    在设置配置或 C 程序时是否有任何遗漏?

    非常感谢

    HaeSeung

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

    您可能希望查看 nvsinternal_MSP_EXP432E401Y 示例项目。

    配置文件中的 NVS 部分可让您定义闪存上用作 mon 易失性存储的块的地址和大小、然后代码会显示如何使用访问函数来读取和写入该块。 它负责 cmd 文件/链接器设置。

    我将我的所有配置打包在一个结构中、并用校验和将其放入另一个结构中(请参阅 CRC 示例)。 然后、我在闪存存储和本地 RAM 副本之间读取或写入我的配置副本。 编辑 RAM 副本并在需要时通过访问 fn 保存到闪存中。

    NVS_WRITE (nvsHandle、0、(void *)&ProtectedConfigData、sizeof (protectedConfigData)、NVS_WRITE_ERASE | NVS_WRITE_POST_VERIFY); 
    Display_printf (display、0、0、"使用 CRC %x 写入的默认配置数据"、TheProtectedConfigData.TheChecksum);