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-CC2640R2:片外 OAD 在片上存储器中存储和运行片外映像的什么位置?

Guru**** 2589300 points
Other Parts Discussed in Thread: CC2640R2F, BLE-STACK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/605871/launchxl-cc2640r2-off-chip-oad-where-in-on-chip-memory-the-off-chip-image-is-stored-and-run

器件型号:LAUNCHXL-CC2640R2
Thread 中讨论的其他器件:CC2640R2FBLE-STACK

您好!

  我已经尝试过片外 OAD 演示、它可以正常工作。 但是、我很困惑 CC2640R2F 128KB 片上存储器中的片外图像存储和运行位置。 文档中提到了以下内容。

"每个 OAD 映像、无论是仅应用程序映像还是 App+Stack 映像、都必须支持 OAD 配置文件、以便在将其下载到片外存储器、复制到片上存储器并执行后进一步启用 OAD。"

下面是映射文件中 BIM、App 和 Stack 的闪存使用情况

BIM - 0xe16 3606字节  
APP - 0xa5b8 42424 字节  
STACK - 0xf6f8 63224 字节  

因此、总闪存使用量为109254字节剩余可用闪存空间为128000 - 109254 = 18746字节

在片外 OAD 演示中、生成应用程序 OAD 映像库。 应用程序 OAD 映像库应占用42424字节的闪存空间。 但是、只剩下18746字节的闪存空间。 那么、该应用程序将从何处加载存储在 CC2640R2F 128 KB 片上存储器中并执行或运行的映像?  

已编辑。 。 。

我注意 到、与 SDK v 1.00中的 simple_peripheral_cc2640r2lp_stack 的堆栈大小使用相比、堆栈大小闪存使用量增加了一倍。 我真的很担心 OAD 映像的剩余内部闪存空间。 与片外 OAD 演示相比、我们基于 CC2640R2F 的产品固件肯定会占用更多的闪存空间、我不确定是否可以执行片外 OAD。 但是、片外 OAD 演示可以正常工作、因此必须对 OAD 映像将存储在 CC2640R2F 内部闪存中的位置进行一些说明。

-克尔

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

    您将哪种 BLE-Stack 用于 OAD? 根据您使用的版本、您可能需要使用不同的指南、但以下是最新 BLE-Stack v3.x OAD 指南的链接 :software-dl.ti.com/.../oad.html

    我建议查看 OAD 存储器布局部分: software-dl.ti.com/.../oad.html

    如该段所述、片外图像会复制到适当的片上扇区中、具体取决于它是仅应用映像还是 APP+STACK 映像。 该过程将复制到原始图像上。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 RachelIP:

       我使用的是 SDK v1.35中的 OAD 指南。 下面是 OAD 存储器布局。 该段中明确提到的是、片外 OAD 映像首先在外部闪存上复制。 外部闪存存储器分配在 ext_flash_layout.h 中定义 正如您所说的"复制原始映像的过程"、这是否意味着在执行 OAD 过程时"处理"复制到"应用"CC2640R2F 内部闪存位置?  

    -克尔

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

    [引用 user="Markel Robregado"]这是否意味着在 执行 OAD 过程时"过程"会复制到"应用"CC2640R2F 内部闪存位置?  [/报价]

    措辞错误。 我的意思是、"处理"会复制到"应用"CC2640R2F 内部闪存位置、而它会从外部闪存复制 OAD 映像。

    另一个与片外 OAD 相关的问题。 为什么片外 OAD BIM 代码仅检查外部闪存位置0x78000 - 0x79000处的应用程序元数据? 如果我要替换栈、其元数据外部闪存位置为0x79000-0x7A000、该怎么办?

    void BIM_checkImages (void)
    {
    uint32_t metaDataAddr;
    
    //初始化外部闪存驱动程序。
    if (bls_init ()=-1)
    {
    return;
    }
    
    for (metaDataAddr = EFL_IMAGE_INFO_ADDR_APP;
    metaDataAddr <= EFL_IMAGE_INFO_ADDR_BLE;metaDataAddr += EFL_PAGE_SIZE)
    {
    //检查图像上的元数据信息以查看下载是否为元数据
    //必需。
    BIM_extReadBuf (metaDataAddr、(uint32_t *)&imgInfo、sizeof (ExtImageInfo_t));
    
    //检查外部闪存中是否有有效的映像。
    if (imgInfo.crc[0]!= 0xFFFF && imgInfo.crc[0]!= 0x0000 &&
    imgInfo.crc[0]== imgInfo.crc[1]&& imgInfo.status == 0xFF)
    {
    while (1)
    {
    uint32_t startAddr;
    uint8_t 起始页;
    
    //在外部闪存中查找图像地址。
    if (imgInfo.imgType = EFL_OAD_IMG_TYPE_APP)
    {
    startAddr = EFL_ADDR_IMAGE_APP;
    }
    否则、如果(imgInfo.imgType = EFL_OAD_IMG_TYPE_STACK)
    {
    startAddr = EFL_ADDR_IMAGE_BLE;
    }
    其他
    {
    //这既不是应用程序映像,也不是堆栈映像。 检查下一个。
    中断;
    }
    
    //复制图像。 请注意、无法处理故障。
    BIM_copyImage (startAddr、(uint32_t) imgInfo.len * EFL_OAD_ADDR_Resolution、
    (uint32_t) imgInfo.addr * EFL_OAD_ADDR_Resolution);
    
    startpage =(((uint32_t) imgInfo.addr * EFL_OAD_ADDR_Resolution)/
    HAL_FLASH_PAGE_SIZE;
    
    //检查内部映像的 CRC 是否有效。
    if (crcCheck (startpage、BIM_IMG_E_OSET、imgInfo.CRC))
    {
    //覆盖元数据的状态字段以反映的内容
    //内部闪存。
    imgInfo.status = 0x80;
    
    BIM_extWriteBuf (metaDataAddr、(uint32_t *)&imgInfo、
    sizeof (ExtImageInfo_t));
    
    中断;
    }
    }
    
    }
    
    //关闭外部闪存驱动程序。
    bls_close();
    } 

    -克尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经确认 BIM_checkImages()读取外部闪存上应用程序和堆栈的元数据。 无论如何、我已经确认 BIM 从外部闪存复制应用 OAD 映像、并从地址0x0000开始写入 CC2640R2F 内部闪存。

    -克尔