主题中讨论的其他器件:CC2640、 CC2640R2F
我正在处理一个在固件和硬件中都高度基于 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