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.

[参考译文] CC2650STK:OAD_Buffer_OFL 错误的 OAD 更新恢复

Guru**** 2563830 points
Other Parts Discussed in Thread: CC2640, CC2640R2F

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/565179/cc2650stk-oad-update-recovery-from-oad_buffer_ofl-error

器件型号:CC2650STK
主题中讨论的其他器件:CC2640CC2640R2F

我正在处理一个在固件和硬件中都高度基于 Sensortag 的项目。  我当前的任务是提高 OAD 更新的可靠性。  我正在使用 BLE Device Monitor 程序来表征故障、并已将我们最常出现的问题缩小为 OAD_Buffer_OFL 错误。  在固件中、我发现这是导致错误的代码部分(下面以红色显示)

在 oadService.c 中, OADService_ImgBlockWrite():

(笑声)

if (oadBlkNum== blkNum)

  //计算要作为写入的地址(OAD 范围的开始)+(偏移到范围)
  uint32_t addr = imageAddress +(oadBlkNum * OAD_BLOCK_SIZE);

  //如果地址启动一个新的页,请先擦除该页。
  如果((addr % HAL_FLASH_PAGE_SIZE)= 0)
  {
    if (!OADTarget_eraseFlash (addr / HAL_FLASH_PAGE_SIZE))
    OADTarget_systemReset();
  }

  //将一个16字节块写入闪存。
  OADTarget_writeFlash (imagePage、(blkNum * OAD_BLOCK_SIZE)、pValue+2、OAD_BLOCK_SIZE);

  //递增接收到的块计数。
  oadBlkNum++;

其他

  //溢出,中止 OAD
  oadBlkNum = 0;

  标志记录= 0;

  //关闭目标器件
  OADTarget_Close();

  //发送状态
  OAD_sendStatus (connHandle、OAD_buffer_OFL);

  delay_ms (1000);
  OADTarget_systemReset();

因此 、oadBlkNum 和 blkNum 可以用作序列计数器-如果它们不匹配、我想再次请求当前的 oadBlkNum、但 BLE Device Monitor 似乎没有响应:

//请求下一个 OAD 映像块。
OAD_getNextBlockReq (connHandle、oadBlkNum);

如果该 oadBlkNum 块已发送。  本质上、这是下载程序应用程序重新传输块的请求。  BLE Device Monitor 下行加载程序似乎跟踪其自身的块序列、并且不愿意重新发送数据包、而不是响应 OAD_getNextBlockReq。  是否有人尝试实现此目标?  

谢谢、

Tom

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

    这可能是由于 BLE Device Monitor 的限制。 尝试将墨黑色/连接变为1。

    此外、要更好地实现该功能、请参阅 CC2640R2F SDK 随附的最新 BTool 版本。 这可能会帮助您找到所需的实现方案。 有关使用 BTool 进行 OAD 的更多信息、请参阅 CC2640 BLE OAD 用户指南、该指南位于 :processors.wiki.ti.com/.../CC2640_OAD_User's_Guide。

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

    您好、Nathan、

    我尝试了 BTool、虽然 OAD 可以正常工作、但它非常慢。  我知道我可以在 BLE Device Monitor 中更改链接/连接、我选择了4、因为它更新速度相对较快、如果发送更多块、工作速度会更快。

    我想继续关注我之前关于从目标同步中恢复的问题。  我希望您是 BLE OAD 专家、或者您可以与我联系。

    从我的第一篇帖子中:

    因此 、oadBlkNum 和 blkNum 可以用作序列计数器-如果它们不匹配、我想再次请求当前的 oadBlkNum、但 BLE Device Monitor 似乎没有响应:

    //请求下一个 OAD 映像块。
    OAD_getNextBlockReq (connHandle、oadBlkNum);

    如果该 oadBlkNum 块已发送。  本质上、这是下载程序应用程序重新传输块的请求。  BLE Device Monitor 下行加载程序似乎跟踪其自身的块序列、并且不愿意重新发送数据包、而不是响应 OAD_getNextBlockReq。  是否有人尝试实现此目标?

    我还考虑了自第一个帖子以来这种方法面临的另一个挑战:

    如果 blks/connection 大于1、请说4 -目标可能会在 BLE 队列或堆栈中接收多个块消息。  如果块计数器不同步、所有等待处理的其他块/消息也不同步。  是否有方法在特性上刷新缓冲器(正确的术语?) 目标值?

    感谢您的帮助、

    Tom  

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

    这是 BLE Device Monitor 的限制。 如果您使用的是自己的下行加载程序、则可以允许这种情况发生。 此外、清除缓冲器到底意味着什么?

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

    Nathan、

    我明白了、BLE 器件监控器存在限制。

    请关注我之前未回答的帖子中的问题。

    当我说"刷新缓冲区"时、我意味着如果 OAD 上载程序在客户端上不同步、并且块/连接大于一个、则 BLE 堆栈缓冲区中可能会有更多不按顺序的块。  我想将其从堆栈中清除、以便 OAD 应用程序不必处理这些块。

    谢谢、

    Tom

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

    OAD 服务的当前设置方式是一个顺序操作、它只处理当前块、然后根据块编号请求下一个块。 BLE 器件监控器等待其所需的下一个块、因此要求它重新传输块将是一个问题。 您可以通过允许来自任何块编号的块请求(即使已经发送)在代码中更改此设置。 这不违反蓝牙规范中的任何内容、也不应导致栈出现任何问题。

    在 OAD 目标端、您可以请求仅重新发送在错误时间接收的块(块编号与预期的不匹配)。 这一切都可以通过使用嵌入在块中的块编号来实现。 当块被正确接收时、目标器件将把它写入指定的位置、这应该是可以的、因为它不是第一次被写入。

    我希望这能解答您的问题、
    -弥敦
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nathan、

    感谢您的回复-这正是我想的、请使用块 ID 作为序列计数器、如果收到的块不是预期的、则可以重新发送。

    现在、对于我有关 flush 命令的另一个问题:

    以下是一个示例:

    假设更新程序应用程序正在发送4个块/连接。  这意味着客户端接收到四个块、每次处理一个块。  下面是我正在处理的用例:

    块5、6、7、8由更新程序应用程序发送。

    块5丢失。

    6、7、8块位于客户端的 BLE 堆栈中。

    客户端进程块6.  7、8块仍在 BLE 堆栈中、等待处理。

    客户端需要块5、但正在处理块6。  序列外错误。

    为块5发送另一个请求。

    Updater 接收块5的请求并发送块5、6、7、8 (因为每个连接设置为4个块)

    客户端在堆栈中仍然有6、7、8个块、现在从更新程序接收5、6、7、8个块。

    客户端现在堆栈中有6、7、8、5、6、7、8个块。

    我要做的(如果客户端脱离序列) 是能够清除堆栈中仍然存在的任何块、因为它们也不符合序列。

    在 OAD 实现方面、是否有 BLE 堆栈操作可以实现这一点?

    有道理?

    谢谢、

    Tom

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

    与传统 BT 不同、BLE 的控制器没有刷新命令。 这是从 BT 5.0开始的电流。 一旦在堆栈中排队一个数据包、即通过 GATT_Notification、该数据包将被传输、除非连接终止。

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nathan、
    感谢您的快速响应。

    我不是要在更新程序端传输前清除、我是要清除客户端接收缓冲区中的内容。 是否有办法做到这一点?

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

    我建议您在 OAD Downloader 方面处理此问题。 在您的示例中、仅仅因为目标要求重新发送块5、并不意味着也必须有6、7和8。 您可以重新发送块5、然后继续您离开的位置、再次使用块中的块编号保持所有这一切直线。

    -弥敦
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nathan、
    是的、这是更新程序应用程序的一个选项、但请记住、客户端的堆栈中仍有其他块可供处理、它们都不符合顺序、并且都将触发重新发送块请求。 除非我能够清除、否则缓冲器将会有很大的问题。

    客户端上是否有 BLE 堆栈缓冲区清空命令?

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

    不幸的是,没有。 这需要由接收块的 OAD 目标来处理、可能是通过递增或递减块计数来处理、具体取决于需要重新发送的块的数量。 然后、当块计数达到该块编号时、可以处理目标侧的块。

    -弥敦
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nathan、
    好的、我希望有一个很好的刷新函数我可以调用-但我可以在更高层处理它。

    感谢你的帮助。

    谢谢、
    Tom