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.

[参考译文] TMS320F28388D:[cm]引导映像错误

Guru**** 2609895 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/990636/tms320f28388d-cm-boot-image-error

器件型号:TMS320F28388D

你(们)好,先生。

我的环境 如下所示

------------------------------------

板:定制板

IDE:CCS 10.1

编译器版本:TI v20.2.2 LTS

优化:-O2 -opt_for_speed=3

调试器:XDS100v3

bootloader loc:SECTOR0,1      cmd 设置->  flash_bootloader  :origin = 0x00200008,length = 0x00007FF8 [align (8)]

应用分配       :SECTOR4~9    cmd 设置-> FLASH_APP           :origin = 0x00210008、length = 0x0005FFF8、[align (8)]

------------------------------------

目前、我在闪存0上有 CM 引导加载程序、并成功更新了 FW。 但是,发现了一些奇怪的东西。

当应用程序的 txt 大小大于一个扇区时、 转换图像的特定块地址不是8字节地址数组。

我检查了引导十六进制文件、发现地址0x21FFFF 值 为空、下一个块地址为0x220007。 据我所知、  在 SCI_Boot 内核程序块地址中、必须以8字节为单位输入、因此我预期为0x220008、但结果为0x220007。 详细信息如下

我不知道我犯了什么错误。

谢谢、此致。

Jude。

 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

[已添加]

这是系统级。

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

    Jude、您好!  

    问题的描述不清楚。 您能否从系统级开始更详细地解释一下。  如何进行编程?

    谢谢、
    Krishna

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

    您好、Krishna、

    感谢您的快速回复。  

    我找不到在注释中发布图像、因此我在此线程中添加图像。

    我问的第一个问题是红色方形虚线的过程。

    我分析了28377d 的 sci 内核程序、并确认映像以 CPU1的16字节单位写入闪存。 因此、在 CM 中、实施了引导加载程序、以使用 CM Flash_API 以8字节为单位写入闪存。 但是、如果映像本身没有8个字节的连续地址、则会出现对同一地址进行冗余写入的问题。 具体而言、当图像的大小超过一个扇区时、会发现此问题。

                //64byte
               for(k = 0; k < (BUFFER_SIZE / 8); k++)
               {
                   miniBuffer[0] = Buffer[k * 8 + 0];
                   miniBuffer[1] = Buffer[k * 8 + 1];
                   miniBuffer[2] = Buffer[k * 8 + 2];
                   miniBuffer[3] = Buffer[k * 8 + 3];
                   miniBuffer[4] = Buffer[k * 8 + 4];
                   miniBuffer[5] = Buffer[k * 8 + 5];
                   miniBuffer[6] = Buffer[k * 8 + 6];
                   miniBuffer[7] = Buffer[k * 8 + 7];
    
                   //
                   //check that miniBuffer is not already all erased data
                   //
                   if(!((miniBuffer[0] == 0xFF) && (miniBuffer[1] == 0xFF) &&
                        (miniBuffer[2] == 0xFF) && (miniBuffer[3] == 0xFF) &&
                        (miniBuffer[4] == 0xFF) && (miniBuffer[5] == 0xFF) &&
                        (miniBuffer[6] == 0xFF) && (miniBuffer[7] == 0xFF) ))
                   {
                        //
                        //clean out flash banks if needed
                        //
                        sectorAddress = FindSector(BlockHeader.DestAddr);
    
                        if(sectorAddress != 0xdeadbeef)
                        {
                            sectorSize = FindSize(sectorAddress);
                            oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
                                    (uint32 *)sectorAddress);
                            while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy);
                            oReturnCheck = Fapi_doBlankCheck((uint32 *)sectorAddress,
                                                             sectorSize,
                                                             &oFlashStatusWord);
                            if(oReturnCheck != Fapi_Status_Success)
                            {
                                if(fail == 0) //first fail
                                {
                                    statusCode.status = BLANK_ERROR;
                                    statusCode.address = oFlashStatusWord.au32StatusWord[0];
                                }
                                fail++;
                            }
                        }
                        //
                        //program 8byte at once, 64-bits
                        //
                        oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)BlockHeader.DestAddr,
                                                           miniBuffer,
                                                           sizeof(miniBuffer),
                                                           0,
                                                           0,
                                                           Fapi_AutoEccGeneration);
                        while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy);
                        if(oReturnCheck != Fapi_Status_Success)
                        {
                            if(fail == 0) //first fail
                            {
                                statusCode.status = PROGRAM_ERROR;
                                statusCode.address = oFlashStatusWord.au32StatusWord[0];
                            }
                           fail++;
                        }
                        //oFlashStatus = Fapi_getFsmStatus();
                        for(j = 0; j < 8; j += 4)
                        {
                           uint32_t toVerify = (miniBuffer[j+3]<<24)|
                                               (miniBuffer[j+2]<<16)|
                                               (miniBuffer[j+1]<<8)|
                                               (miniBuffer[j]);
    
                           oReturnCheck = Fapi_doVerify((uint32 *)(BlockHeader.DestAddr+j),
                                                        1,
                                                        (uint32 *)(&toVerify),
                                                        &oFlashStatusWord);
                           if(oReturnCheck != Fapi_Status_Success)
                           {
                               if(fail == 0) //first fail
                               {
                                    statusCode.status = VERIFY_ERROR;
                                    statusCode.address = oFlashStatusWord.au32StatusWord[0];
                               }
                               fail++;
                           }
                        } //for j; for Fapi_doVerify
                   } //check if miniBuffer does not contain all already erased data
                   BlockHeader.DestAddr = BlockHeader.DestAddr + 0x8;
               } //for(int k); loads miniBuffer with Buffer elements
           }
           //
           //get the size of the next block
           //
           BlockHeader.BlockSize = (*get_word)();
        }

    谢谢。

    Jude。

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

    感谢 Jude 的反馈。  我们将研究您所报告的内容、并需要咨询域专家。  我们将在获得解决方案/说明后立即返回给您。

    此致、

    Krishna  

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

    Jude、

    您可以共享链接器 cmd 文件吗?

    谢谢、此致、

    Vamsi

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

    谢谢你 Krishna!

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

    大家好、Vamsi。

    感谢你的答复。

     

    最后、我通过在不合并扇区的情况下拆分扇区以及在.text 段中使用">>"语法来解决了这个问题。

    当 特定 obj 文件的大小 超过一个扇区时、会发现上述现象。

    上一个命令文件如下所示。

    存储器

    /*闪存扇区*/
    // CMBANK0_RESETISR:origin = 0x00210000,length = 0x00000008 //引导至闪存入口点*/
    // flash_bootloader:origin = 0x00200008,length = 0x00007FF8
    // flash_app:origin = 0x00210008,length = 0x0005FFF8

    CMBANK0_RESETISR:origin = 0x00200000,length = 0x00000008 //引导至闪存入口点*/
    Flash_app:origin = 0x00200008、length = 0x0005FFF8

    /*
    CMBANK0_SECTOR1:origin = 0x00204000、length = 0x00004000
    CMBANK0_SECTOR2:origin = 0x00208000、length = 0x00004000
    CMBANK0_SECTOR3:origin = 0x0020C000、length = 0x00004000
    CMBANK0_SECTOR4:origin = 0x00210000、length = 0x00010000
    CMBANK0_SECTOR5:origin = 0x00220000,length = 0x00010000
    CMBANK0_SECTOR6:origin = 0x00230000,length = 0x00010000
    CMBANK0_SECTOR7:origin = 0x00240000,length = 0x00010000
    CMBANK0_SECTOR8:origin = 0x00250000,length = 0x00010000
    CMBANK0_SECTOR9:origin = 0x00260000,length = 0x00010000
    CMBANK0_SECTOR10:origin = 0x00270000,length = 0x00004000
    CMBANK0_SECTOR11:origin = 0x00274000,length = 0x00004000
    CMBANK0_SECTOR12:origin = 0x00278000、length = 0x00004000
    CMBANK0_SECTOR13:origin = 0x0027C000、length = 0x00004000
    *

    cram:origin = 0x1FFFC000,length = 0x00003FFF
    /*
    C1RAM:origin = 0x1FFFC000、length = 0x00001FFF
    C0RAM:origin = 0x1FFFE000、length = 0x00001FFF
    *
    BOOT_RSVD:origin = 0x20000000、length = 0x00000800 // S0的一部分,引导 ROM 将此用于栈*/

    SRAM:origin = 0x20000800,length = 0x0000F7FF
    /*
    S0RAM:origin = 0x20000800,length = 0x000037FF
    S1RAM:origin = 0x20004000、length = 0x00003FFF
    S2RAM:origin = 0x20008000、length = 0x00003FFF
    S3RAM:origin = 0x2000C000、length = 0x00003FFF
    *
    E0RAM:origin = 0x20010000、length = 0x00003FFF

    CPU1TOCMMSGRAM0:origin = 0x20080000,length = 0x00000400
    CPU1TOCMMSGRAM0_ECAT:origin = 0x20080400,length = 0x00000400
    CPU1TOCMMSGRAM1:origin = 0x20080800,length = 0x00000800

    CMTOCPU1MSGRAM0:origin = 0x20082000,length = 0x00000400
    CMTOCPU1MSGRAM0_ECAT:origin = 0x20082400,length = 0x00000400
    CMTOCPU1MSGRAM1:origin = 0x20082800,length = 0x00000800

    CPU2TOCMMSGRAM0:origin = 0x20084000,length = 0x00000800
    CPU2TOCMMSGRAM1:origin = 0x20084800,length = 0x00000800
    CMTOCPU2MSGRAM0:origin = 0x20086000,length = 0x00000800
    CMTOCPU2MSGRAM1:origin = 0x20086800,length = 0x00000800

    部分

    .resettisr:> CMBANK0_RESETISR
    .vftable:> flash_app,align (8)//应用程序将矢量表放置在 Flash*/中
    .vtable:> SRAM /*应用程序将矢量表放置在 RAM*/中
    .text:> flash_app、align (8)
    .cinit:> flash_app、align (8)
    .pinit:> flash_app、align (8)
    .switch:> flash_app、align (8)
    .sysmem:> SRAM

    .stack:> SRAM
    .ebss:> cram
    econst:> flash_app、align (8)
    .esysmem:>克拉姆
    .data :> SRAM
    .bss:> SRAM
    .const:> flash_app、align (8)

    MSGRAM_CM_TO_CPU1:> CMTOCPU1MSGRAM0,type=NOINIT
    MSGRAM_CM_TO_CPU1_ECAT:> CMTOCPU1MSGRAM0_ECAT,type=NOINIT
    MSGRAM_CM_TO_CPU2:> CMTOCPU2MSGRAM0,type=NOINIT
    MSGRAM_CPU1_TO_CM:>CPU1TOCMMSGRAM0,type=NOINIT
    MSGRAM_CPU1_TO_CM_ECAT:> CPU1TOCMMSGRAM0_ECAT,type=NOINIT
    MSGRAM_CPU2_TO_CM:> CPU2TOCMMSGRAM0,type=NOINIT

    .TI.ramfunc:{} load = flash_app,
    run = SRAM、
    Load_start (RamfuncsLoadStart)、
    load_size (RamfuncsLoadSize)、
    Load_End (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    run_size (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    对齐(8)

    /*
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *

     

     

      

    我按如下方式进行了修改、并完成 了映像下载。

    存储器

    /*闪存扇区*/
    CMBANK0_RESETISR:origin = 0x00210000,length = 0x00000008 //引导至闪存入口点*/
    // flash_bootloader:origin = 0x00200008,length = 0x00007FF8
    FLASH_APP0:origin = 0x00210008、length = 0x0000FFF8
    FLASH_APP1:origin = 0x00220000,length = 0x00010000
    /*
    CMBANK0_SECTOR0:origin = 0x00200008、length = 0x00003FF8
    CMBANK0_SECTOR1:origin = 0x00204000、length = 0x00004000
    CMBANK0_SECTOR2:origin = 0x00208000、length = 0x00004000
    CMBANK0_SECTOR3:origin = 0x0020C000、length = 0x00004000
    CMBANK0_SECTOR4:origin = 0x00210000、length = 0x00010000
    CMBANK0_SECTOR5:origin = 0x00220000,length = 0x00010000
    CMBANK0_SECTOR6:origin = 0x00230000,length = 0x00010000
    CMBANK0_SECTOR7:origin = 0x00240000,length = 0x00010000
    CMBANK0_SECTOR8:origin = 0x00250000,length = 0x00010000
    CMBANK0_SECTOR9:origin = 0x00260000,length = 0x00010000
    CMBANK0_SECTOR10:origin = 0x00270000,length = 0x00004000
    CMBANK0_SECTOR11:origin = 0x00274000,length = 0x00004000
    CMBANK0_SECTOR12:origin = 0x00278000、length = 0x00004000
    CMBANK0_SECTOR13:origin = 0x0027C000、length = 0x00004000
    *

    cram:origin = 0x1FFFC000,length = 0x00003FFF
    /*
    C1RAM:origin = 0x1FFFC000、length = 0x00001FFF
    C0RAM:origin = 0x1FFFE000、length = 0x00001FFF
    *
    BOOT_RSVD:origin = 0x20000000、length = 0x00000800 // S0的一部分,引导 ROM 将此用于栈*/

    SRAM:origin = 0x20000800,length = 0x0000F7FF
    /*
    S0RAM:origin = 0x20000800,length = 0x000037FF
    S1RAM:origin = 0x20004000、length = 0x00003FFF
    S2RAM:origin = 0x20008000、length = 0x00003FFF
    S3RAM:origin = 0x2000C000、length = 0x00003FFF
    *
    E0RAM:origin = 0x20010000、length = 0x00003FFF

    CPU1TOCMMSGRAM0:origin = 0x20080000,length = 0x00000400
    CPU1TOCMMSGRAM0_ECAT:origin = 0x20080400,length = 0x00000400
    CPU1TOCMMSGRAM1:origin = 0x20080800,length = 0x00000800

    CMTOCPU1MSGRAM0:origin = 0x20082000,length = 0x00000400
    CMTOCPU1MSGRAM0_ECAT:origin = 0x20082400,length = 0x00000400
    CMTOCPU1MSGRAM1:origin = 0x20082800,length = 0x00000800

    CPU2TOCMMSGRAM0:origin = 0x20084000,length = 0x00000800
    CPU2TOCMMSGRAM1:origin = 0x20084800,length = 0x00000800
    CMTOCPU2MSGRAM0:origin = 0x20086000,length = 0x00000800
    CMTOCPU2MSGRAM1:origin = 0x20086800,length = 0x00000800

    部分

    .resettisr:> CMBANK0_RESETISR
    .vftable:> flash_app0|flash_app1、align (8)/*应用程序将矢量表放置在 Flash*/中
    .vtable:> SRAM /*应用程序将矢量表放置在 RAM*/中
    .text:>> FLASH_APP0|FLASH_APP1、ALIGN (8)
    .cinit:> FLASH_APP0|FLASH_APP1、ALIGN (8)
    .pinit:> FLASH_APP0|FLASH_APP1、ALIGN (8)
    .switch:> FLASH_APP0|FLASH_APP1、ALIGN (8)
    .sysmem:> SRAM

    .stack:> cram
    .ebss:> cram
    .econst:> FLASH_APP0|FLASH_APP1、ALIGN (8)
    .esysmem:>克拉姆
    .data :> SRAM
    .bss:> SRAM
    .const:> FLASH_APP0|FLASH_APP1、ALIGN (8)

    MSGRAM_CM_TO_CPU1:> CMTOCPU1MSGRAM0,type=NOINIT
    MSGRAM_CM_TO_CPU1_ECAT:> CMTOCPU1MSGRAM0_ECAT,type=NOINIT
    MSGRAM_CM_TO_CPU2:> CMTOCPU2MSGRAM0,type=NOINIT
    MSGRAM_CPU1_TO_CM:>CPU1TOCMMSGRAM0,type=NOINIT
    MSGRAM_CPU1_TO_CM_ECAT:> CPU1TOCMMSGRAM0_ECAT,type=NOINIT
    MSGRAM_CPU2_TO_CM:> CPU2TOCMMSGRAM0,type=NOINIT

    .TI.ramfunc:{}负载= FLASH_APP0|FLASH_APP1、
    run = SRAM、
    Load_start (RamfuncsLoadStart)、
    load_size (RamfuncsLoadSize)、
    Load_End (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    run_size (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    对齐(8)

    /*
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *

    如果我只根据我的理解组合了闪存、它会正常编译和创建映像、而不管 obj 文件的大小如何。

    但我想知道它是否是这样使用它的正确方法。

     

    谢谢你。

    Jude。

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

    Jude、

    很高兴它现在已修复。  

    拆分段并将段映射到它们是可以的-没有问题。

    由于问题已解决、我将关闭此帖子。  如果您有其他问题、可以打开另一个帖子。

    谢谢、此致、

    Vamsi