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.

[参考译文] CC2640:在映像中找不到有效的 OAD 报头

Guru**** 2584355 points
Other Parts Discussed in Thread: CC2640, CC2640R2F, CC2540, CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/568661/cc2640-a-valid-oad-header-was-not-found-in-the-image

器件型号:CC2640
Thread 中讨论的其他部件:CC2540CC2650

我正在尝试使用 CC2640实现片上 OAD。 我遵循了 cc2640 BLE OAD 用户指南、当我将 SimpleBLEPeripheral 图像添加到 BLE Device Monitor 时、我收到一条消息"在图像中找不到有效的 OAD 标头。 使用生成的标头"。

当我 对项目不做任何更改时、为什么会获得此结果?

谢谢

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

    听起来在 hexfile 中没有有效的元数据矢量-尝试使用 oad_image_tool 生成矢量并插入图像。

    请参阅 software-dl.ti.com/.../oad.html

    此致、
    反叛分子
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看起来是另一个部分、我使用的是 cc2640、这些指令用于 cc2640r2f。 我将查看它是否适用于我的。

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

    该工具可生成与我们定义的 OAD 配置文件兼容的元数据矢量(可在任何器件上使用)

    此致、
    反叛分子
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Rebel,
    当我使用 BLE 监控器并加载.bin 文件时、OAD 头文件看起来不错、但当我加载.hex 文件时、找不到 OAD 头文件。 为什么会这样呢?

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

    实际上、我强烈建议改用 BTool 作为 OAD。 虽然现在速度较慢、但它的稳健性要高得多。

    我将下载 CC2640R2F SDK 并使用其中包含的 btool。 (请参阅 processors.wiki.ti.com/.../CC2640_OAD_User's_Guide)

    它仅使用容器、因此该十六进制文件不会产生任何烦恼。

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

    你好,Rebel,

    我现在切换到使用 BTool、并按照说明操作、当我转到 OAD 选项卡并加载图像时、图像元数据具有无效字段。 你为什么这么认为? 我正在使用 IAR 顺便说一下。

    谢谢

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

    您是否可以在此处附加十六进制和二进制文件?


    默认示例是否适合您? (没有任何修改?)


    此致、

    反叛分子

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

    是的、我可以附加文件。  我只需要弄清楚如何实现它。 我尝试连接、但它不允许我附加 bin 文件。 因此、我将扩展名更改为.txt。

    默认示例不起作用、这是我看到 bin 文件图像元数据有问题的地方。

    谢谢

    e2e.ti.com/.../1205.cc2650lp_5F00_app.txt

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

    e2e.ti.com/.../cc2650lp_5F00_app.txt

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

    您好 Mario、通过查看前16个字节可以看到:

    4ff6 0000 0100 0028 4242 4242 FFFF FFFF

    基本上、由于错误放置元数据的原因、应用程序起始地址以及图像类型。 (FF 状态良好)

    例如、 在我的计算机上构建 onchip img_b 会导致:

    5768 FFFF 0100 001e 4242 4242 001C 01ff

    我的最佳猜测是、使用 OAD_IMAGE_TOOL (或忘记添加标记)的编译后步骤不正确。

    您也可以在 BTool 中修改标题、单击"删除元数据"按钮、然后单击"添加元数据"、然后填写所需的数据。 (将会出现一条警告、指出存在现有的元数据。 覆盖它。) 然后单击 Write image file (写入映像文件)以输出新的 bin。


    无论如何、请注意指向程序启动的正确位置:按照 SDK 中的命令操作、您的操作是什么?

    "$TOOLS_BLE$\OAD_IMAGE_TOOL.exe""$PROJ_DIR$\FlashOnly"-simple_peripheral_cc2640r2lp_app.hex"-t onchip-i 应用程序--imgVer 0-usrbb-peripheral "$PROJ_DIR_0x7000-simple_cc67000-ine_inb-imgVer--imbb-inb-inb-inb-inb-inb-inb-0x7000-0x7000-inb-inb-inb-inb-inb-inb-inb

    我强烈建议先让示例工作、如果需要、请重新安装 SDK。 开箱即用的片上负载示例应该起作用。


    此致、

    反叛分子

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

    我正在使用 cc2640、您使用的项目用于 cc2640r 部件。 这两个器件是否兼容? 看起来 cc2640r 具有更大的内存。
    我使用的示例 simple_peripheral 项目用于 cc2640处理器、编译后命令行为空。 我不知道为什么、默认情况下是这样的。
    我构建了 cc2640r 项目、元数据似乎有效。 我尝试下载映像、但失败了。 我假设这是因为该图像应该用于 cc2640r 器件。 你怎么想?

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

    您好、Mario、

    它们是引脚对引脚兼容的-通常代码兼容、它实际上只是告诉 cc2640使用 ROM 而不是闪存堆栈功能。

    是的、完全正确-代码可能尝试调用 CC2640中不存在的 ROM 函数。

    2.2.1 SDK 没有 OAD 构建配置我感到惊讶-尝试重新安装 OAD 或使用 CC2640R2F 项目或 OAD 指南手动编写编译后处理步骤

    此致、

    反叛分子

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

    我无法使脚本正常工作。 是否有一个有关标志含义的良好示例?

    我为 cc2640项目尝试了以下脚本:

    $TOOLS_BLE$\OAD_IMAGE_TOOL.exe""$PROJ_DIR$\FlashOnly" OAD_ImgB\EXE\simple_peripheral_cc2650lp_app.hex"-t onchip -i 应用程序--imgVer 0 --usrBBBB -OAD_ImgId\0x7000 simple_app_imple_ine_app.b -0x7000 peripheral_in_imb_in_in_in_cc7000


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

    如果尝试从命令行界面运行该工具、您将能够传递'-h'、您将看到所有标志及其说明。

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

    你好,Rebel,

    因此、我在命令行界面中使用了以下命令:

    \ oad_image_tool simple_peripheral_cc2650lp_app.hex -ob app_oad.bin -t onchip -m 0x9000 -r 0x12000

    我遇到错误"没有足够的数据读取16个连续字节"。 这是什么意思?

    我要附上屏幕截图。

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

    这是 IAR 工具链生成的 hex 文件的起始部分。 我认为我遇到的错误是因为第一行(地址0x9000)只有2个字节、OAD 映像工具需要16个字节。 我认为我无法改变这是如何产生的。 CRC 存储在前2个字节中、但 OAD 工具似乎需要16个字节。
    我在这里缺少什么吗?

    02900000B400BA
    0C90040001000028424242FFFFFFFF33
    :109010005844002025130100A50B0100A50B0100F9
    :10902000A50B0100A50B0100A50B0100A50B0100A50B01007C
    :10903000A50B0100A50B0100A50B0100A50B0100A50B01006C
    :0C904000A50B0100A50B0100710B010045
    :04904C00FFFFFFFF24
    :10905000FEE7DFF87408007D7047DFF86C28117DAB
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mario、

    这似乎是您看到的问题-这两个字节是由您的代码还是由 IAR 生成?

    OAD 的一个核心要求是为元数据矢量保留16字节的空间。 您需要调整链接器文件以允许此空间。

    如果 IAR 正在生成 CRC、那么您应该从十六进制生成中删除它。 您将在 IAR Linker catagory 下看到校验和选项、请禁用这些选项。

    此致、

    反叛分子

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

    你好,Rebel,

    它看起来是代码和 IAR。

    我在 IAR 中未检查校验和、并注释掉了"oad_target_internal_flash.c"中图像头文件的代码。

    之后、我的十六进制文件开始如下所示:

    :109010005844002025130100A50B0100A50B0100F9

    :10902000A50B0100A50B0100A50B0100A50B0100A50B01007C

    :10903000A50B0100A50B0100A50B0100A50B0100A50B01006C

    :0C904000A50B0100A50B0100710B010045

    :10905000FEE7DFF87408007D7047DFF86C28117DAB

    那么、我使用此命令来运行 OAD 映像工具:

     OAD_IMAGE_TOOL simple_peripheral_cc2650lp_app.hex -t onchip -i app--imgVer 0 --usrId BBBB -ob app_oad.bin -t onchip -m 0x9000 -r 0x13000

    显然、OAD 映像创建成功。 因此、我启动了 BTool 并下载了映像、但失败了。  

    BTool 中的图像标题如下所示:

    为什么此更新现在不起作用?  

    我还将附加由 OAD 映像工具创建的.bin 文件。 *我将扩展名更改为.txt,以便上传。

    e2e.ti.com/.../app_5F00_oad.txt

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

    是否可以附加监听器日志? 那么、我们可以看到 OAD 为什么失败呢?

    此致、
    反叛分子
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这听起来可能很愚蠢、但在哪里可以找到嗅探器日志?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    别担心 Mario、

    任何 BLE 空中监听器都将起作用。 一个快速 Google www.google.com/search
    将向您展示一些销售这些产品的公司。

    进行 BLE 开发是绝对必要的。 我们有许多客户使用一线监听器、还有其他客户使用 ellisys、仅举几个品牌。

    如果您也想尝试一下、还可以使用 TI 监听器。 它依赖于 CC2540 USB 软件狗。

    基本上、您将能够看到在器件之间发送了哪些 BLE 数据包、这对于查看导致 OAD 配置文件取消的原因非常有用。 您还可以尝试在所有故障状态下设置断点、并查看触发哪个断点。

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

    你好,Rebel,

    我有监听器。 我将附上 BLE 数据包的屏幕截图。 看起来只有前16个字节被传输。 我不知道什么是"主连接参数请求"。 我假设主器件提出的问题是什么。

    你有什么想法?

    谢谢、

    Mario

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

    您好、Mario、

    实际上、整个连接参数请求内容/更新内容是可以的。 这可能是因为您的器件不支持该功能。

    更重要的是、您的图片看起来被拒绝了-请查看 http://software-dl.ti.com/lprf/simplelink_cc2640r2_sdk/1.00.00.22/exports/docs/blestack/html/oad/oad.html#oad-image-identify-0xffc1

    并将其与您的日志进行比较。

    看起来 BTool 正确启动-它执行 ATT_WRITE、如指南中所示。

    但是、当您的设备获得该图像时、它不喜欢该图像并拒绝该图像、然后发回包含驻留图像信息的通知数据包。 在 OAD 配置文件中设置一些断点、并尝试对此进行调试-并找出拒绝映像的原因。

    希望这对您有所帮助、

    反叛分子

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

    你好,Rebel,

    是、图像被拒绝。 尝试进行 OAD 更新时、我在 A 映像上运行了调试器。  看起来它未通过图像标题版本测试。

    (OAD_IMG_ID (ImgHdr->ver)!= OAD_IMG_ID (rxHdr.ver)

    首先,让我询问在运行 OAD_IMAGE_TOOLT 时应该输入什么"imgVer"?

    --imgVer 0和--imgVer 1有何不同?

    OAD_IMAGE_TOOL simple_peripheral_cc2650lp_app.hex -t onchip -i app --imgVer 0 --usrId BBBB -ob app_oad.bin -t onchip -m 0x9000 -r 0x13000

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

    我忘记提到的另一点是、在"图像识别"过程中、我注意到当前图像标题的内容全部为"0xFF"。  

    这是正常的吗?

    因此,当我转到此行代码: (OAD_IMG_ID(ImgHdr->ver)!= OAD_IMG_ID(rxHdr.ver)时 ,我看到:

    imgHdr->ver = 0xFFFF。

    因此、为了传递这一点、我需要让我的元数据 imgVer 成为一个没有 LSB = 1的数字、否则图像将被拒绝。

    谢谢、

    Mario

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

    下面是一些更多信息

    当我想使用不同的图像版本创建元数据矢量时、似乎无法生成我想要的每个版本。 每个映像版本都必须以 LSB=1结尾、OAD 映像工具会自动将其转换为 LSB=1的数字。

    例如、假设我希望 imgVer = 2 (此实例中的 LSB 将为0)。
    命令如下:

    OAD_IMAGE_TOOL simple_peripheral_cc2650lp_app.hex -t onchip -i app --imgVer 2 -usrId BBBB -ob app_oad.bin -t onchip -m 0x9000 -r 0x13000


    运行后、OAD 映像工具会自动将 imgVer 转换为3。
    图像版本检查代码

    OAD_IMG_ID (ImgHdr->ver)!= OAD_IMG_ID (rxHdr.ver)

    由于 OAD_IMG_ID (ImgHdr->ver)始终为0x01、因此始终会导致 false、因为默认情况下、ImgHdr->ver = 0xff (我之前的文章提到了这一点)。

    因此、这就是我的图像始终被拒绝的原因。

    我有2个问题:
    1.工具为何更改图像版本的 LSB?
    2.为什么默认(OAD 目标映像)映像头全为0xff?


    谢谢、
    Mario

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

    1.我将复制并粘贴代码中的内容作为注释:

    /*开始 OAD 的要求:
    * 1)镜像版本的 LSB 不能相同、这意味着代码重叠
    当前正在运行的映像和新映像之间的*。
    * 2)新图像的总块数不得超过支持的最大块数、否则
    *新图像无法适应。
    * 3)块总计必须大于0。
    * 4)可选:在此处添加启动 OAD 的附加条件。
    *

    基本上只是为了确保发送的图像是递增的图像。

    关于该工具、我将让工具团队了解这一点、谢谢! 我不知道这是否是有意的。

    2.要自动接受传入的图像以进行 Offchip 传输-请参阅 OADTarget_validateNewImage。 对于默认的片上配置来说没有那么有趣。 最终由用户来执行额外的检查或修改现有的检查

    请记住 、您可以在 software-dl.ti.com/.../oad.html 部分中查看有关元数据矢量/的大量信息
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Rebel,

    我更改了代码并通过了图像标题版本。 现在、我遇到另一个问题。 当请求图像的第一个块时、我的 BLE 连接断开。 我发现该函数不返回:


    void * GATT_BM_alloc (uint16 connHandle、uint8操作码、uint16大小、uint16 * pSizeAlloc)

    if (pfnBMAlloc!=空)

    返回(* pfnBMAlloc)(BM_MSG_GATT、Size、connHandle、opcode、pSizeAlloc);


    返回((void *) NULL);



    有什么想法为什么?

    谢谢、
    Mario
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想知道原因。 闪存擦除函数正在擦除 BLE 堆栈的一部分。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是不是因为图像太大?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我的图像标头、我放置了范围0x9000-0x13000、我不知道代码会包含第13页、因此它擦除了 BLE 堆栈。
    我修复了范围、现在映像已下载并执行复位、但从未从该范围恢复。
    如果我正确理解它何时启动、则应进入 BIM、BIM 将确定要运行的映像。 如果正确、则不运行 BIM 或映像。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看起来 BIM 正在运行且 CRC 已验证、但由于某种原因、新映像从未运行。
    当我尝试单步执行代码时、堆栈指针看起来会超出范围。 这很奇怪。

    谢谢、
    Mario
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    IAR 还告诉我、当我尝试调试 BIM 时、它缺少 IAR.Mac 文件。
    我是否需要 IAR.Mac?

    谢谢、
    Mario
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊、我认为是在工具中自动设置图像大小。

    入口点可能不正确、并且尝试跳转到错误的值、请确保在分支进入新映像之前加载正确的地址。

    关于 IAR.Mac -我不知道这是什么! 如果您能够顺利进行调试、我可能会忽略此错误、或者在该问题导致问题时尝试重新安装 IAR。 (或在 IAR 论坛上提问)

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

    在通过 BIM 后、图像 A 看起来也没有运行。 当我单步执行代码时、地址跳转到指令中间位置。

    下面是跳转到图像 A 的代码:

    //从固定位置加载标签__IAR_program_start 的地址
    //图像的复位矢量、
    asm (" MOV R0、#0x0610 ");
    asm (" LDR R1、[R0、#0x4]"); //将0x7D59载入 R1

    //重置堆栈指针,
    asm (" LDR SP、[R0、#0x0]");

    //和 Jump。
    asm (" BX r1 "); //跳转至0x7D59


    地址0x0610是矢量表地址、您可以看到、我们加载位于4字节偏移的地址、该位置的值为0x7D59。
    首先、该地址是一个奇数、这是一个奇怪的数字、因此我们实际上跳转到0x7D58。
    第二、它位于另一条指令的中间。
    基本上、在跳转到该地址处理器后、处理器会丢失。

    是否有办法知道如何将该地址(0x7D59)确定为跳转点? 或者更好的情况下、我想跳转到哪里来运行映像 A?
    看起来我对映像 B 有相同的问题、因为代码是相同的。

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

    BTool 如何知道映像是否已成功下载? 我始终会收到"OAD Download Not Successful"消息、这是准确的、因为我没有看到图像 B 正在运行。 但我也看不到图像 A 正在运行、所以我猜是图像 B 开始运行、但有些东西会损坏。

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

    当 OAD 映像已传输到目标器件、并且目标器件已执行 CRC 检查以确保其未损坏时、会发生 OAD 成功。 这是您获得 OAD 成功的唯一情况、此时、ImgA 将使自身失效、并通过 BIM 将控制权移交给 ImgB。

    BTool 只报告它看到的内容、如果它看到 OAD 下载失败、则 ImgB 将永远不会运行、因为目标设备在 CRC 期间确定它是无效映像-或另一个阻止 OAD 成功发生的问题。

    检查监听器捕获以查看导致其失败的原因-或者 BTool 日志可能显示原因。 (OAD 不是一件简单的事情! 保留)

    此致、

    反叛分子

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CRC 和 CRC 影子是相同的、因此我不认为是这样。 当我单步执行 BIM 时、它通过了 CRC 校验、然后跳转到图像 B、因此 BIM 认为图像良好。

    我查看了 BLE 监听器、在传输完所有块后、一切都没有发生。 状态特征永远不会从器件中获取任何内容。 实际上、这是有道理的、因为 OAD 目标上的代码传输所有块、然后复位器件。 BLE 连接丢失、没有任何报告。 我认为 BTool 有错误、或者 OAD 目标有错误、它应该等待 BTool 继续。

    在任一种情况下、映像 B 都会被下载、CRC 是正确的、但 BIM 似乎没有跳转到正确的位置以开始执行它。
    我想知道我要跳转到的地址是什么? 它当前正在从0x9014读取地址、并从该位置跳转到该地址。 我们是如何找到该地址的? 我认为这就是问题所在。

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

    您好、Mario、

    您能否连接监听器捕获?

    如 http://software-dl.ti.com/lprf/simplelink_cc2640r2_sdk/1.30.00.25/exports/docs/blestack/ble_sw_dev_guide/html/oad/oad.html#oad-process 中所述

    如果 IMAGE_STATUS 不成功-因为 BTool 正在报告、并且它在监听器上显示、则这里还有另一个问题。

    它的读数是0x9014? 您可以在此处粘贴代码吗?

    如果代码有效、则应跳转到 IMGB 的复位矢量

    此致、

    反叛分子

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

    你好,Rebel,

    这是监听器捕获。 您会看到最后一个字节正在发送、之后什么也不会发生、原因是从器件复位。

    以下是执行系统复位的代码部分:

    //检查 OAD 映像是否已完成。
    if (oadBlkNum=oadBlkTot)(如果(oadBlkNum =oadBlkTot))

     #if FITY_OAD_ONCHIP
    //在 BIM 中处理 CRC 校验。
    OADTarget_systemReset();
    #else //!feature_OAD_ONCHIP

    因此、一旦最后一个块被传输、BTOOL 就会失去连接。  

    下面是跳转到 IMG B 的代码:

    if (((CRC[0]!= 0xFFFF)&&(CRC[0]!= 0x0000))

      if (CRC[0]== CRC[1]|| crcCheck (BIM_IMG_B_PAGE、BIM_IMG_B_OSET、CRC))
      {
       //从固定位置加载标签__IAR_program_start 的地址
       //图像的复位矢量、
       asm (" MOV R0、#0x9010 ");
       asm (" LDR R1、[R0、#0x4]");

       //重置堆栈指针,
       asm (" LDR SP、[R0、#0x0]");

       //和 Jump。
       asm (" BX r1 ");

       OADTarget_systemReset();//不应在此处获取。
      }

    谢谢、

    Mario

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

    这很奇怪、在 OAD_sendStatus (connHandle、OAD_Success);@ OAD.c 处粘贴断点、看看会发生什么。

    您至少应该通过无线方式看到通知。

    关于0x9014作为跳转至的地址:请参阅中断表的技术参考手册、如下所示:
    4.1.4矢量表。 您将看到、对于复位矢量、它的偏移量为4、前4个字节用于堆栈指针的初始值。

    此致、
    反叛分子
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在 OAD_sendStatus (connHandle、OAD_Success)放置一个断点、但它不会被执行。 一旦执行 systemReset(),我就会失去调试器。

    我将查看有关矢量表的技术参考手册。

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

    你好,Rebel,

    我查看了技术参考手册、现在0x9014是合理的。 那么、现在的问题是、它为什么在跳转到该地址后不运行映像?

    这是跳转到复位矢量后的调试屏幕截图。 复位矢量地址为0x1132D、跳转到0x1132C。

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

    您好、Mario、

    我认为我对您尝试做的事情没有很好的理解。

    您如何实现 OAD? 它是从 IMG_B 到 IMG_B 吗? 还是 IMG_A (OAD_TARGET_APP)到 IMG_B?

    请注意、我之前的建议是针对您在 OAD 事务期间作为目标运行的任何固件。 NOT BIM - BIM 永远不会运行 OAD 代码。

    无论采用哪种方式、如果您在传输后未达到 OAD_sendStatus (connHandle、OAD_Success);在 OAD.c 中、都存在实际问题。 这最终称为复位。

    您之前提到过、您看到 BTool 提示 OAD 失败的问题、这是否仍然存在?

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

    你好,Rebel,

    我将 IMG_A (OAD_TARGET_APP)实现为 IMG_B

    如果我理解正确、BIM 将确定复位后 IMG_A 还是 IMG_B 将运行。 是这样吗?

    我不确定如果 systemReset()前面有 OAD_sendStatus (connHandle、OAD_Success)如何执行。
    这里是代码。 这似乎是不可能的。


    //检查 OAD 映像是否已完成。
    if (oadBlkNum=oadBlkTot)(如果(oadBlkNum =oadBlkTot))

    #if FITY_OAD_ONCHIP
    //在 BIM 中处理 CRC 校验。
    OADTarget_systemReset ();<------ 复位
    #else //!feature_OAD_ONCHIP
    //对新映像运行 CRC 校验。
    if (checkDL())

    //在重新启动之前指示下载成功和 CRC
    OAD_sendStatus (connHandle、OAD_Success);<------------ 它永远不会达到这一点

    //存储已下载映像的标志。
    flagRecord |= getImageFlag();

    //存储图像信息。
    saveImageInfo();
    .



    是 BTool 仍显示"OAD Download not successful (OAD 下载不成功)"。

    谢谢、

    Mario

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

    OAD_sendStatus (connHandle、OAD_Success);发送通知以指示成功。 也许可以在复位前添加此代码。

    (* oadTargetWriteCB)(OAD_IMAGE_COMPLETE、connHandle、NULL);最终将应用程序复位。

    正确的 BIM 决定了复位后运行哪个程序。

    那么、当前的问题是 IMG_B 的复位矢量不正确? 0x9014没有指向正确的点?

    我使用较新的代码作为参考(如下所示)

    /*********
    *@fn OAD_imgBlockWrite
    *
    *@简要处理映像块写入。
    *
    **@param connHandle -在
    *@param pValue -指向要写入的数据的指针
    *
    *@返回无
    */
    void OAD_imgBlockWrite (uint16_t connHandle、uint8_t * pValue)
    {
    // N.B.这必须保持易失性。
    volatile uint16_t blkNum = build_uint16 (pValue[0]、pValue[1]);
    
    //检查这是否为预期的块编号。
    if (oadBlkNum = blkNum)
    {
    //将一个16字节块写入闪存。
    OADTarget_writeFlash (imagePage、(blkNum * OAD_BLOCK_SIZE)、pValue+2、
    OAD_BLOCK_SIZE);
    
    //递增接收到的块计数。
    oadBlkNum++;
    }
    否则
    {
    //溢出,中止 OAD
    oadBlkNum = 0;
    #ifndef feature_OAD_ONCHIP
    标志记录= 0;
    #endif
    //关闭目标器件
    OADTarget_Close();
    
    //发送状态
    OAD_sendStatus (connHandle、OAD_buffer_OFL);
    
    return;
    }
    
    //检查 OAD 映像是否已完成。
    if (oadBlkNum = oadBlkTot)
    {
    #if feature_OAD_ONCHIP
    //表示下载成功
    OAD_sendStatus (connHandle、OAD_Success);
    
    //通知应用程序,应用程序处理重新启动
    if (oadTargetWriteCB!=空)
    {
    (* oadTargetWriteCB)(OAD_IMAGE_COMPLETE、connHandle、NULL);
    }
    #else //!feature_OAD_ONCHIP
    //对新映像运行 CRC 校验。
    if (checkDL())
    {
    //在重新启动之前指示下载成功和 CRC
    OAD_sendStatus (connHandle、OAD_Success);
    
    //存储已下载映像的标志。
    flagRecord |= getImageFlag();
    
    //存储图像信息。
    saveImageInfo();
    
    //检查是否已下载所有预期的图像。
    if (CheckImageDownloadCount())
    {
    //如果一个映像是网络处理器映像,请立即通知应用程序
    //以便它可以对该图像执行操作。
    //注意:此回调不是从的上下文发送的
    //中断。 可以在此处执行任何操作。
    IF (标志记录和 OAD_IMG_NP_FLAG)
    {
    (* oadTargetWriteCB)(OAD_IMAGE_COMPLETE、connHandle、NULL);
    }
    
    //如果一个映像是应用程序映像或堆栈映像,则执行重置
    //此处。
    IF (标志记录和(OAD_IMG_APP_FLAG|OAD_IMG_STACK_FLAG))
    {
    OADTarget_systemReset();
    }
    
    标志记录= 0;
    }
    }
    其他
    {
    // CRC 错误
    OAD_sendStatus (connHandle、OAD_CRC_ERR);
    }
    标志记录= 0;
    #endif //feature_OAD_ONCHIP
    
    OADTarget_Close();
    oadBlkNum = 0;
    }
    否则
    {
    //请求下一个 OAD 映像块。
    OAD_getNextBlockReq (connHandle、oadBlkNum);
    }
    
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    参考原始帖子、我遇到类似/相同的问题。

    我正在关注针对片上 OAD 的 CC2640 BLE OAD UG 示例。 当我选择 simple_peripheral_cc2650lp_app.hex (使用 IAR 构建)作为 OAD 闪存映像时、BLE Device Monitor 会给出原始文章"固件版本:未知"图像中找不到有效的 OAD 标头"中引用的错误。 使用生成的标头"。

    Mario 似乎比我更胜任调试技能。 我现在不能介绍所有这些内容。
    是否有任何关于修复示例项目的见解?

    谢谢、
    韦恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    错误消息可能不明确、因为它建议使用生成的标头。 但是、如果我"开始"下载、则不会发生任何情况。 它只是在0%完成时停止。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我添加了 OAD_sendStatus (connHandle、OAD_SUCCESS);复位之前和工作期间、BTool 就绪前发生复位。 如果我在复位调用上放置一个断点、那么 BTool 将有足够的时间来处理"OAD_SUCCES"、如果我继续执行复位、BTool 会报告传输成功。 现在、我尝试添加代码以接受 BTool 重置命令、因为我认为这就是它应该起作用的方式。

    要回答您的问题、是的、在 IMG_B 的复位矢量不正确后、它指向错误的点。 这现在仍然是一个问题。

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

    我认为您应该使用 BTool 而不是 BLE 器件监控器。 TI 现在推荐它。 我遇到了与未找到 OAD 标头相同的问题。 该示例不会生成报头。 我必须单独使用 OAD 映像工具来创建自己的头文件。

    Mario