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.

[参考译文] TMS320F28388S:闪存初始化函数进入错误处理以发生置位违例。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1500133/tms320f28388s-flash-initialization-function-going-into-error-handling-for-assert-violation

器件型号:TMS320F28388S
主题:C2000WARE 中讨论的其他器件

工具/软件:

尊敬的团队:

随着代码大小的增加、即存储体 .sysmem : > RAMLS5精疲力尽。 因此、我将初始设置从更改为 .data : > RAMLS5至。 .data : > RAMLS6

完成此更改后、函数会调用:

Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);

开始点击__error__()处理程序:

void __error__(const char *filename, uint32_t line) { // ASSERT condition failed. Use filename and line to debug. ESTOP0; }

此问题的根本原因可能是什么?如何解决?
在下面添加了初始错误代码。

更改.data 之后  




另一个奇怪的点是我也尝试增加长度 RAMLS5 、来自  长度= 0x000800 最终目的  长度= 0x001800、  它开始工作。 但当我根据应用需要添加更多缓冲器时、它又开始进入  

 __error__() 处理程序:


我做了更多调试工作、可从中找到 设备初始化() 的函数调用 driverlib 初始化  目标  FLASH_initModule (FLASH0CTRL_BASE、FLASH0ECC_BASE、DEVICE_FLASH_WAITSTAT )呼叫。
然后、它应该进入内部的函数定义 flash.c  但它是去一些评论行 //限于,暗示的保证,适销性和适用性的第31行在 flash.c
连续时钟 单步进入调试器 我再次发现它正在进入 两种方法 中导出  断言(EPWM_isBaseValid (base)); 从函数调用中提取
EPWM_setCounterCompareValue (uint32_t base、EPWM_CounterCompareModule 比较模块、
uint16_t CompCount)。
但当我使用单相单缓冲器[256]时、同样的功能也能起作用。 我真的是什么错了。

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

    您好、

    您是否已将数据缓冲区设置与 align 指令对齐?

    此致、

    Rajeshwary

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

    嗨、Rajeshwary、

    感谢您的回答。
    但 C2000 SDK  2838x_flash_lnk_cpu1.cmd 文件没有这种类型的命令。
    我提供了完整的链接器文件供您参考。

    此致、
    Ramakrishna

    MEMORY
    {
       /* BEGIN is used for the "boot to Flash" bootloader mode   */
       BEGIN            : origin = 0x080000, length = 0x000002
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AF     /* Part of M0, BOOT rom will use this for stack */
       RAMM0            : origin = 0x0001B1, length = 0x00024F
       RAMM1            : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
    //   RAMM1_RSVD       : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       RAMD0            : origin = 0x00C000, length = 0x000800
       RAMD1            : origin = 0x00C800, length = 0x000800
       RAMLS0           : origin = 0x008000, length = 0x000800
       RAMLS1           : origin = 0x008800, length = 0x000800
       RAMLS2           : origin = 0x009000, length = 0x000800
       RAMLS3           : origin = 0x009800, length = 0x000800
       RAMLS4           : origin = 0x00A000, length = 0x000800
       RAMLS5           : origin = 0x00A800, length = 0x001800
       //RAMLS6           : origin = 0x00B000, length = 0x000800
       //RAMLS7           : origin = 0x00B800, length = 0x000800
       RAMGS0           : origin = 0x00D000, length = 0x001000
       RAMGS1           : origin = 0x00E000, length = 0x001000
       RAMGS2           : origin = 0x00F000, length = 0x001000
       RAMGS3           : origin = 0x010000, length = 0x001000
       RAMGS4           : origin = 0x011000, length = 0x001000
       RAMGS5           : origin = 0x012000, length = 0x001000
       RAMGS6           : origin = 0x013000, length = 0x001000
       RAMGS7           : origin = 0x014000, length = 0x001000
       RAMGS8           : origin = 0x015000, length = 0x001000
       RAMGS9           : origin = 0x016000, length = 0x001000
       RAMGS10          : origin = 0x017000, length = 0x001000
       RAMGS11          : origin = 0x018000, length = 0x001000
       RAMGS12          : origin = 0x019000, length = 0x001000
       RAMGS13          : origin = 0x01A000, length = 0x001000
       RAMGS14          : origin = 0x01B000, length = 0x001000
       RAMGS15          : origin = 0x01C000, length = 0x000FF8
    //   RAMGS15_RSVD     : origin = 0x01CFF8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       /* Flash sectors */
       FLASH0           : origin = 0x080002, length = 0x001FFE  /* on-chip Flash */
       FLASH1           : origin = 0x082000, length = 0x002000  /* on-chip Flash */
       FLASH2           : origin = 0x084000, length = 0x002000  /* on-chip Flash */
       FLASH3           : origin = 0x086000, length = 0x002000  /* on-chip Flash */
       FLASH4           : origin = 0x088000, length = 0x008000  /* on-chip Flash */
       FLASH5           : origin = 0x090000, length = 0x008000  /* on-chip Flash */
       FLASH6           : origin = 0x098000, length = 0x008000  /* on-chip Flash */
       FLASH7           : origin = 0x0A0000, length = 0x008000  /* on-chip Flash */
       FLASH8           : origin = 0x0A8000, length = 0x008000  /* on-chip Flash */
       FLASH9           : origin = 0x0B0000, length = 0x008000  /* on-chip Flash */
       FLASH10          : origin = 0x0B8000, length = 0x002000  /* on-chip Flash */
       FLASH11          : origin = 0x0BA000, length = 0x002000  /* on-chip Flash */
       FLASH12          : origin = 0x0BC000, length = 0x002000  /* on-chip Flash */
       FLASH13          : origin = 0x0BE000, length = 0x001FF0  /* on-chip Flash */
    //   FLASH13_RSVD     : origin = 0x0BFFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       CPU1TOCPU2RAM   : origin = 0x03A000, length = 0x000800
       CPU2TOCPU1RAM   : origin = 0x03B000, length = 0x000800
       CPUTOCMRAM      : origin = 0x039000, length = 0x000800
       CMTOCPURAM      : origin = 0x038000, length = 0x000800
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
    
       RESET            : origin = 0x3FFFC0, length = 0x000002
    }
    
    SECTIONS
    {
       codestart           : > BEGIN, ALIGN(8)
       .text               : >> FLASH1 | FLASH2 | FLASH3 | FLASH4, ALIGN(8)
       .cinit              : > FLASH4, ALIGN(8)
       .switch             : > FLASH1, ALIGN(8)
       .reset              : > RESET, TYPE = DSECT /* not used, */
       .stack              : > RAMM1
       isrcodefuncs :
    	{
    	    . = ALIGN(8);
    	    *(isrcodefuncs)
    	    . = ALIGN(8);
    	} > FLASH0
    
    #if defined(__TI_EABI__)
       .init_array      : > FLASH1, ALIGN(8)
       .bss             : > RAMLS5
       .bss:output      : > RAMLS3
       .bss:cio         : > RAMLS5
       .data            : > RAMLS5
       .sysmem          : > RAMLS5
       /* Initalized sections go in Flash */
       .const           : > FLASH5, ALIGN(8)
    #else
       .pinit           : > FLASH1, ALIGN(8)
       .ebss            : > RAMLS5
       .esysmem         : > RAMLS5
       .cio             : > RAMLS5
       /* Initalized sections go in Flash */
       .econst          : >> FLASH4 | FLASH5, ALIGN(8)
    #endif
    
       ramgs0 : > RAMGS0, type=NOINIT
       ramgs1 : > RAMGS1, type=NOINIT
       
       MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT
       MSGRAM_CPU_TO_CM    : > CPUTOCMRAM, type=NOINIT
       MSGRAM_CM_TO_CPU    : > CMTOCPURAM, type=NOINIT
    
       /* The following section definition are for SDFM examples */
       Filter_RegsFile  : > RAMGS0
       Filter1_RegsFile : > RAMGS1, fill=0x1111
       Filter2_RegsFile : > RAMGS2, fill=0x2222
       Filter3_RegsFile : > RAMGS3, fill=0x3333
       Filter4_RegsFile : > RAMGS4, fill=0x4444
       Difference_RegsFile : >RAMGS5, fill=0x3333
    
       #if defined(__TI_EABI__)
           .TI.ramfunc : {} LOAD = FLASH3,
                            RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
                            LOAD_START(RamfuncsLoadStart),
                            LOAD_SIZE(RamfuncsLoadSize),
                            LOAD_END(RamfuncsLoadEnd),
                            RUN_START(RamfuncsRunStart),
                            RUN_SIZE(RamfuncsRunSize),
                            RUN_END(RamfuncsRunEnd),
                            ALIGN(8)
       #else
           .TI.ramfunc : {} LOAD = FLASH3,
                            RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
                            LOAD_START(_RamfuncsLoadStart),
                            LOAD_SIZE(_RamfuncsLoadSize),
                            LOAD_END(_RamfuncsLoadEnd),
                            RUN_START(_RamfuncsRunStart),
                            RUN_SIZE(_RamfuncsRunSize),
                            RUN_END(_RamfuncsRunEnd),
                            ALIGN(8)
       #endif
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    



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

    道歉、 如果您不使用闪存 API 库、那么这不是必需的。

    [引述 userid="644102" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1500133/tms320f28388s-flash-initialization-function-going-into-error-handling-for-assert-violation

    完成此更改后、函数会调用:

    Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);

    开始点击__error__()处理程序:

    void __error__(const char *filename, uint32_t line) { // ASSERT condition failed. Use filename and line to debug. ESTOP0; }
    [/报价]

    能否从_ERROR_()的位置检查文件名和行号?

    此致、

    Rajeshwary

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

    嗨、Rajeshwary、

    感谢您的回答。

    C2000 SDK  设备初始化()  函数调用具有 FLASH_initModule (FLASH0CTRL_BASE、FLASH0ECC_BASE、DEVICE_FLASH_WAITSTAT)  它里面.
    你建议评论它?? 但当缓冲区大小不太相同时、呼叫工作正常。

    注释掉 FLASH_initModule (FLASH0CTRL_BASE、FLASH0ECC_BASE、DEVICE_FLASH_WAITSTAT) 也返回相同的错误。

    您能否检查文件名和行号、从其转至_error_()?

    是的、  

    "文件名字符* 0x00090196"/home/ubnu... 寄存器 XAR4

    行无符号长整型33寄存器 AL
    "
    但这是非常不清楚.

    如果你想我可以提供以前的版本,我的代码的当前版本.其中我只添加了更多的大小为256的缓冲区.
    最初、我使用256的单缓冲器作为单相测试、那时同一个程序可以正常运行。
    然后,当我的应用程序需要3相,我只是增加了2个256大小的缓冲区。 在同一问题开始之后。

    我 发现 通过从 device.c 函数调用时对工作程序进行更深入的调试 FLASH_initModule (FLASH0CTRL_BASE、FLASH0ECC_BASE、DEVICE_FLASH_WAITSTAT) 传递.h 文件中定义的 ctrlbase 和 ECC base 的值、如下所示。
    #define FLASH0CTRL_BASE 0x0005F800U
    #define FLASH0ECC_BASE 0x0005FB00U

    但在新程序中、ctrlBase 和 eccBase 作为传递 0x0000F800 0x00000000  。
    中存储器和外设的大多数基地址  HW_MEMMAP_H 在的函数调用后在运行时受到影响  memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    此致、
    Ramakrishna   

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

    你(们)好

    是的、 FLASH0CTRL_BASE 、如所示  0x0005F800U 是正确的值、在您正在测试的 C200ware 示例中是相同的。 您使用的 C2000ware 版本中的值显示为 0x0000F800  和  0x00000000

    此致、

    Rajeshwary

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

    嗨、Rajeshwary、

    在这两种情况下、C2000Ware 版本为5.4.0.0、因为代码库是相同的。
    唯一的区别是代码大小增加-没有对设置或后台库进行任何更改。

    顺便说一句、我已经确定了根本原因—原因是 栈溢出

    此致、
    Ramakrishna