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.

TMS320F280049C-Q1: 程序中未调用函数编译连接问题

Part Number: TMS320F280049C-Q1


Hi TI团队:

       我在做软件调试时,注释了一个未被调用的函数代码,软件编译后下载到控制板调试,程序运行到库函数Fapi_setActiveFlashBank(Fapi_FlashBank0)(库版本V1.56)后就进入到interrupt void USER1_ISR(void),报出故障。我恢复注释掉的函数(也没有调用过)代码后,软件调试可以正常运行,也没有进nterrupt void USER1_ISR(void)中断。

      请问有Fapi_setActiveFlashBank()函数的源码或者介绍的文档可以提供查看?我用的编译器版本是CCS8.3,这个版本可以设置未调用函数编译不连接?

  • 您好,TMS320F280049 Flash API Reference Guide (Rev. A)中的第2章有相关描述,您先看一下。

  • 您好,

           这个文档我看过了,里面主要是函数的参数定义。看上去问题是我定义的一个未调用的函数,库函数Fapi_setActiveFlashBank()运行时出现了未知的错误导致进入了Trap中断,还没找到原因。请问F280049C有比V1.56更高的版本的Flash lib?

  • 目前V1.56应该就是最高版本。

    被注释掉的函数是您定义的?

  • 是一个空函数,里面没有代码,只要注释掉,运行Fapi_setActiveFlashBank()就会进trap

  • 方便把您的代码发上来看一下吗?

  • 不好意思,系统加密了,这边只有我这边电脑能看

  • 我帮您咨询一下资深工程师。

  • 不知道您是否可以单独将map文件(正常工作时的和非正常工作时的)上传上来?

    还有您调用Flash API的时候,程序是从RAM中运行的吗?

  • Project_F280049C_FlashTrap.mapProject_F280049C_Norm.map

    您好,附件为正常运行和进Trap的map文件,程序是从flash启动的

  • 好的。有了结果我会及时回复您。

  • 您好,您不应从Flash编程和擦除操作所针对的同一bank执行Flash API。您可以从一个Flash bank执行Flash API针对另一个Flash bank进行flash操作,或者从RAM执行Flash API。

    并且这款设备在ROM中有Flash API,您也可以使用它。无需在Flash或RAM中分配空间给Flash API。

    如果您还有进一步的问题,这篇有关于C2000设备Flash API使用的FAQ或许会帮助到您:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/951668/faq-faq-on-flash-api-usage-for-c2000-devices

  • 很高兴能帮助到您

  • 您好,补充一个问题,望帮助解答一下,请问Flash lib中调用Fapi_setActiveFlashBank(Fapi_FlashBank0)进入interrupt void USER1_ISR(void)中断的路径有哪几个?有关于内存对齐或者程序操作Flash寄存器等待超时进入这个中断的情况?

  • 您好,根据TMS320F280049 Flash API Reference Guide (Rev. A)对于Fapi_setActiveFlashBank的功能描述来看,这个函数应该不会导致进入interrupt void USER1_ISR(void),而是后续的一些操作。

    所以您的意思能否理解为使用Flash API对Flash进行操作时,在哪些情况下会导致程序进入interrupt void USER1_ISR(void)?

  • 是这个意思,我调试下来看,汇编step也可以正常运行,放开就会进中断了

  • 好的,我咨询之后给您答复。

  • 请问如果不使用Flash API的话就正常运行吗?

    您使用的是ROM Flash API?还是将Flash API嵌入到程序中然后从RAM中运行?

  • 您好,不适用flash API程序可以正常运行的,调用flash 在Fapi_setActiveFlashBank()这个设置会进Trap。我是把Flash API嵌入到程序中,copy到RAM中,然后从RAM中运行

  • 好的,有结果我会及时回复您。

  • 您可以提供一下相关的linker command文件和map文件吗?

    您为什么不使用ROM Flash API呢?

  • ROM flash API这个没有用,附件是我现在工程的map文件和linker command 文件,map包含能正常工作和进trap的版本,请帮看一下问题,谢谢

    Project_280049C_Trap.map

    MEMORY
    {
    PAGE 0 :
       /* BEGIN is used for the "boot to SARAM" bootloader mode   */
    
       /*
        0x80000 is also used as the boot address of the Bootloader.
        The address of APP BEGIN is also 0x80000 and the address of the program with bootloader is 0x86002
       */
       BEGIN            : origin = 0x080000, length = 0x000002
       RAMM0            : origin = 0x0000F5, length = 0x00030B
    
       RAMLS0           : origin = 0x008000, length = 0x000C00
       RAMLS3           : origin = 0x009800, length = 0x000800
       RAMLS4           : origin = 0x00A000, length = 0x002000
       RESET            : origin = 0x3FFFC0, length = 0x000002
    
    /* Flash sectors */
       /* BANK 0 Bootloader Firmware*/
       //FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE	/* on-chip Flash */
       //FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC3  : origin = 0x083000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC4  : origin = 0x084000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC5  : origin = 0x085000, length = 0x001000	/* on-chip Flash */
    
       //FLASH_BANK0_SEC6  : origin = 0x086000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC7  : origin = 0x087000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC8  : origin = 0x088000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC9  : origin = 0x089000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000	/* on-chip Flash */
       //FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000	/* on-chip Flash */
    
       FLASH_BANK0_SEC6_SEC613 : origin = 0x086002, length = 0x007FFE
       FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x001000	/* on-chip Flash */
    
       /* BANK 1 */
       FLASH_BANK1_SEC0  : origin = 0x090000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC1  : origin = 0x091000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC2  : origin = 0x092000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC3  : origin = 0x093000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC4  : origin = 0x094000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC5  : origin = 0x095000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC6  : origin = 0x096000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC7  : origin = 0x097000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC8  : origin = 0x098000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC9  : origin = 0x099000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC10 : origin = 0x09A000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC11 : origin = 0x09B000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC12 : origin = 0x09C000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC13 : origin = 0x09D000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC14 : origin = 0x09E000, length = 0x001000	/* on-chip Flash */
       FLASH_BANK1_SEC15 : origin = 0x09F000, length = 0x001000	/* on-chip Flash */
    
    PAGE 1 :
    
       BOOT_RSVD        : origin = 0x000002, length = 0x0000F3     /* Part of M0, BOOT rom will use this for stack */
       RAMM1            : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
    
       //RAMLS1           : origin = 0x008800, length = 0x000800
       RAMLS1           : origin = 0x008C00, length = 0x000400
       RAMLS2           : origin = 0x009000, length = 0x000800
       RAMLS5           : origin = 0x00A800, length = 0x000800
       RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7           : origin = 0x00B800, length = 0x000800
    
       RAMGS0           : origin = 0x00C000, length = 0x002000
       RAMGS1           : origin = 0x00E000, length = 0x002000
       RAMGS2           : origin = 0x010000, length = 0x002000
       RAMGS3           : origin = 0x012000, length = 0x002000
    
       CLA1_MSGRAMLOW   : origin = 0x001480, length = 0x000080
       CLA1_MSGRAMHIGH  : origin = 0x001500, length = 0x000080
    }
    
    
    SECTIONS
    {
       .cinit           : > FLASH_BANK1_SEC0,     PAGE = 0, ALIGN(4)
       .text            : > FLASH_BANK0_SEC6_SEC613,   PAGE = 0, ALIGN(4)
       codestart        : > BEGIN       PAGE = 0, ALIGN(4)
       .stack           : > RAMM1        PAGE = 1
       .switch          : > FLASH_BANK1_SEC1,     PAGE = 0, ALIGN(4)
    
       .pinit           : > FLASH_BANK1_SEC4,       PAGE = 0,       ALIGN(4)
       .ebss            : >>RAMLS1 | RAMLS2 | RAMLS5 | RAMLS6 | RAMLS7 | RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3 ,       PAGE = 1
       .esysmem         : > RAMLS6,       PAGE = 1
       .cio             : > RAMLS5,       PAGE = 1
       .econst          : > FLASH_BANK1_SEC5,    PAGE = 0, ALIGN(4)
    
       ramgs0           : > RAMGS0,    PAGE = 1
       ramgs1           : > RAMGS1,    PAGE = 1
    
       .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */
    
        /* CLA specific sections */
        Cla1Prog        : LOAD = FLASH_BANK0_SEC14,
                          RUN = RAMLS0,
                          LOAD_START(_Cla1ProgLoadStart),
                          RUN_START(_Cla1ProgRunStart),
                          LOAD_SIZE(_Cla1ProgLoadSize),
                          PAGE = 0, ALIGN(4)
    
    #if(1)
        SFRA_F32_Data    : > RAMLS5, ALIGN = 64, PAGE = 1
        FPUmathTables    : > FLASH_BANK1_SEC6,   PAGE =0
    #endif
    
        Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW,   PAGE = 1
        CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH,  PAGE = 1
    
       /* copy F021_API_F28004x_FPU32.lib to RAM, and RAMLS4 add to 0x2000kW  */
       GROUP{
          .TI.ramfunc
          {-l ../CSW_CODE/FlashDriverslib/lib/F021_API_F28004x_FPU32.lib}
       } LOAD = FLASH_BANK0_SEC15,
          RUN = RAMLS4,
          LOAD_START(_RamfuncsLoadStart),
          LOAD_SIZE(_RamfuncsLoadSize),
          LOAD_END(_RamfuncsLoadEnd),
          RUN_START(_RamfuncsRunStart),
          RUN_SIZE(_RamfuncsRunSize),
          RUN_END(_RamfuncsRunEnd),
          PAGE = 0, ALIGN(4)
    
    
       .scratchpad      : > RAMLS1,           PAGE = 1
       .bss_cla         : > RAMLS1,           PAGE = 1
    
       Cla1DataRam      : > RAMLS2,           PAGE = 1
    
       .const_cla      : LOAD = FLASH_BANK1_SEC7,
                          RUN = RAMLS3,
                          RUN_START(_Cla1ConstRunStart),
                          LOAD_START(_Cla1ConstLoadStart),
                          LOAD_SIZE(_Cla1ConstLoadSize),
                          PAGE = 0, ALIGN(4)
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    
    8475.Project_F280049C_Norm.map

  • 好的,收到。

    我们比较好奇您不用ROM Flash API的原因。使用ROM Flash API或许不会出现类似的问题。

  • 好的,谢谢。我这边使用ROM Flash  API看一下,前面因为工程建立就使用的flash API,没问题不会主动去修改

  • 好的,了解了。

  • 和您确认一下,两个map文件都是用这个cmd文件生成的吗?

    您的代码中有擦除Flash API所在的flash sectors吗?

  • 您好,两个MAP都是这个CMD生成的,代码里只是注释了这一个一个函数:InitCan_commom_280049()的区别。没有执行过擦除flash步骤

  • InitCan_commom_280049()

    这个函数是您自己定义的吗?我没有在API中找到这个函数。

    如果是调用的方便指一下路吗?

    如果是您自己定义的,能否简单描述一下该函数做了哪些处理?

  • 您好,这个函数定义了没有调用过,里面没有代码,我换用一个别的名称也试过,结果是一样的:删除或者注释掉一个函数就在激活Blank状态设置中进Trap,不注释或者新加一个函数(无论有无调用)都可以正常运行代码

  • 激活Blank状态设置中

    您的意思是,进Trap的时候,目标Flash还会显示处于Blank状态?也就是被擦除?

  • 不是这个意思,我的程序在运行Fapi_setActiveFlashBank()会进入trap

  • 您在调用任何flash API函数之前有调用memcpy()这个函数吗?

    您有使用CCS flash plugin或其它工具将这些代码装载到flash中吗?

  • 调用flash API函数之前调用过memcpy(),这个会对flash驱动产生什么影响?第二点没有,我是直接用CCS下载的

  • 您可以对程序进行步进调试吗?可以找到是哪个指令导致程序进入Trap的吗?

  • 您好,对Flash驱动汇编我使用步进可以正常运行,我猜测可能是因为延时或者状态反馈超时导致的

  • 您好,我在Flash API手册https://www.ti.com.cn/cn/lit/ug/spnu628a/spnu628a.pdf 看到一个描述:

    请问这个描述的操作频率和等待状态我在什么地方可以查到更多细节?

  • 您好,问题已经解决了,我在工程里面把F021_ROM_API_F28004x_FPU32.lib和F021_API_F28004x_FPU32.lib都编译链接了,保留F021_ROM_API_F28004x_FPU32.lib后,程序正常运行。

    非常感谢您的帮助!

  • 不客气,您的问题解决了就好