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.

[参考译文] LAUNCHXL-F280039C:F28003x 引导加载程序 to App Jump 问题

Guru**** 2442090 points
Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1530710/launchxl-f280039c-f28003x-bootloader-to-app-jump-issue

器件型号:LAUNCHXL-F280039C
Thread 中讨论的其他器件:UNIFLASH

工具/软件:

尊敬的 TI 专家:

我正在开发 F28003x 引导加载程序和 App1。 以下是我的设置:

 我迄今所做的工作

  • 引导加载程序位于 0x80000

  • App1 的起始位置为 0x88000

  • 引导加载程序.bin通过 CAN 接收数据并从开始将其写入闪存 0x88000

  • 写入后、我会计算并验证的 CRC32.bin(它匹配)、确认数据已正确刷写。

问题

我尽力了 从引导加载程序跳转 _c_int00使用 App1.map0x000896BA () 中的地址到达 App1 入口点 ()、但我得到一个 非法中断处理程序

下面是我用于跳转的代码:

#define APP1_ENTRY_ADDR  0x000896BAUL  // From App1 .map (_c_int00)

void jump_to_application(void)
{
    DEVICE_DELAY_US(100);

    CPUTimer_stopTimer(CPUTIMER0_BASE);
    CPUTimer_reloadTimerCounter(CPUTIMER0_BASE);
    CPUTimer_setEmulationMode(CPUTIMER0_BASE, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);

    DINT;
    IER = 0x0000;
    IFR = 0x0000;

    asm(" NOP"); asm(" NOP"); asm(" NOP"); asm(" NOP");
    DEVICE_DELAY_US(5000);

    void (*app_entry)(void) = (void (*)(void))APP1_ENTRY_ADDR;

    app_entry();

    // Never returns
}

我很困惑

  • .map为生成.out、其符号如_c_int00

  • 但是、我仅将.bin(原始数据)下载到的闪存中 0x88000 。 因此:

    • 我应该_c_int00从跳转到地址.map吗?

    • 我是否需要找到.codestart或其他任何入口点?

  • 什么是 正确方法 使用.bin文件时、如何从引导加载程序跳转到为 F28003x 构建的应用?

 是我想要的

  • 说明了.map Vs.bin 地址之间的关系。

  • 关于.bin基于 App1 的正确入口点的建议。

  • 我的跳转方法是否正确、或者我是否需要调整它(例如,设置 SP,使用).codestart

提前感谢您!

如果需要、我还可以附加.cmd.map这两个工程的文件。

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

    您好:

    是、您需要跳转到 codestart 符号在链接器 cmd 文件中映射到的地址。 我建议将入口点存储在辅助寄存器中、并使用 LB 命令跳转到应用入口点。 您可以参考 本文档中的 Long 间接分支

    如何生成 BIN 文件? 如果使用 该线程中的相同方法、则 bin 文件似乎将包含程序的第一个初始化数据并填充所有间隙、直到它到达最后一个初始化字。

    此致、

    Skyler

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

    尊敬的 Skyler Baumer

    感谢您的答复—非常感谢您的帮助!

    我想更新一下: 现在、使用地址 0x88000 (codestart) 的相同跳转序列、跳转到应用程序可以正常工作。 问题在于.bin文件生成。 目前、我正在使用以下命令:

    echo "========= Generating .bin firmware image ============="
    "${CG_TOOL_ROOT}/bin/hex2000" "${BuildArtifactFileName}" --binary -o="${BuildArtifactFileBaseName}.bin"
    

    .bin仅包含原始数据(约 14,302 字节)、并且不包括0xFF实际闪存范围中的填充 ()。 在内存浏览器中、0xFF当图像从放置0x88000到时、我观察到实际数据之间的数据块0x90000

    对我有用的是.bin从实际闪存范围(–)中使用 Uniflash 提取文件0x880000x90000,生成 .bin. 当我加载此文件时.bin0x88000、可以从开始、应用程序会成功跳转。

    我现在要找的是: 是否有方法生成.bin0xFF包含填充 () 的文件—即在调用时指定地址范围hex2000? 换句话说、是否有生成.bin应用分区映像的选项或命令、包括0xFF实际段之间的“Gap"填“填充符 ()、因此我不必依赖使用 Uniflash 进行提取?

    提前感谢您的指导!

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

    尊敬的 Prashanth:

    请参阅 此主题中突出显示的 George 解决方案

    此致、

    Skyler

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

    尊敬的 Skyler Baumer

    非常感谢您的答复!  
    引导加载程序到应用程序的跳转问题现已解决。

    我还想提及这一点,通过引用此 主题 —我能够 清楚地理解.hex 转换过程,它帮助修复了.bin我的应用程序的生成。

    • 这是用于.bin 文件生成的 Commad 行

    “c:/ti/ccs1281/ccs/tools/compiler/ti-cgt-c2000_22.6.1.LTS/bin/hex2000 --image --memwidth=16 --quiet --romwidth=16 --diag_swrap=off --binary -o “flashapi_ex1_programming_1.bin""flashapi_ex1_programming_1.out"“"flashapi_ex1_programming_1.out"  hexcmd.txt“ hexcmd.txt</s>“


    此外、我还在此处提到了 CCS Hex Utility 官方文档: 博客
    这让我深入了解了 ROM 设置如何.bin生成。

    再次感谢您的支持!