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.

[参考译文] CC3220:将两个应用包作为固件

Guru**** 2555630 points
Other Parts Discussed in Thread: CC3220S, UNIFLASH, CC3220SF, CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/723058/cc3220-packet-two-applications-as-a-firmware

器件型号:CC3220

您好 TI:

   我使用 CC3220S、通常我们使用 Uniflash 将固件下载到2MB 闪存。

   但在我的案例中、由于工厂测试更简单、我们设计了如下用例:
   我们烧录了一个支持 OTA 的固件(我们称之为 FW-A)、然后使用 OTA 更新到非 OTA 功能固件(称为 FW-B、在 OTA 后、FW-A 仍保存在闪存上为原始版本)、该新固件用于工厂测试(意味着在工厂完成所有测试后、测试仪) 长按按钮、然后触发重置至 FW-A)。

    我的问题是:可能生成的数据包可能包括 FW-A 和 FW-B、并让 FW-B 作为引导固件?

    因此、这可以让我使用 闪存编程器刻录该数据包(FW-B + FW-A)。

 Jon

谢谢

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

    只是简单的评论。 如果您的 sFlash 中有足够的空间、最好的方式是听起来我。
    FW-A ... 您的标准固件映像文件(具有所有功能+功能的生产固件、允许加载和执行其他固件)
    固件 B…… 您的测试映像文件(包括所有测试程序等)
    FW-A + FW-B 将位于一个映像中(通过 Uniflash 或 Gang 编程下载)

    加载启动后、您的 FW-A 触发后(例如按钮)、您的固件暂停并加载并执行测试固件 FW-B

    下面是如何加载和执行固件 e2e.ti.com/.../2662274的示例

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

    您好 Jan:

      感谢您的回复。

      我的问题:

    1.如何将 FW-A 和 FW-B 封装到一个映像中? 我已经尝试过 Uniflash、但此工具不允许我同时将两个 FW 打包在一起。 第一个引导加载程序将自动知道加载 FW-A 并运行它?

    2.如果 FW-B 有一些问题、并且我想使用 OTA 将 FW-B+FW-A 更新为新版本、是否具有此功能?

    Jon

    谢谢  

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

    固件 A 将是标准固件文件/sys/mcuimg.bin. 固件 FW-B 将是 sFlash 文件系统中的任何其他文件。 ROM 引导程序只能执行文件/sys/mcuimg.bin. 在 FW-A 内部、您将能够将 FW-B 加载到 RAM 中并执行它。 所有管理人员都将由您决定。

    2.由于可以通过 OTA 更新 sFlash 中的任何其他文件、因此也可以更新 FW-B。 FW-B 只是文件系统中的一个标准文件。

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

    您好 Jan:

       如何配置有关认证和签名的 FW-B?

    谢谢

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

    因为您自己加载此文件(FW-B)、所以您不会处理此问题。 证书和签名仅对您的 FW-A (由 ROM 引导程序加载)很重要。

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

    您好 Jan:

        RAM 可能不足以加载 FW-A 和 FW-B

    FW-A:

    存储器配置

            名称           源   长度     使用    未使用  的属性   填充
    ------------  ----  ------  ----  ----  --------  
     SRAM2                20000000  00004000 0000070c 000038f4 RW X
     SRAM                 20004000  0003c000 0003baa2 0000055e RW X


    段分配映射

    运行 origin load origin  length  init length atts members
    ------  ------ ------ ------ ---- ----
    20003c00   20003c00   00000400  00000000   rw-
     20003c00   20003c00   00000400  00000000   rw-.stack
    20004000   20004000   00025f3c  00025f3c   r-x
     20004000   20004000   00000040  00000040   r-.Vecresets
     20004040   20004040   00025efc  00025efc   r-x .text
    2002a000   2002a000   00014494  00000000   Rw-
     2002a000   2002a000   00010cec  00000000   rw-.bss
     2003acf0   2003acf0   000037a4  00000000   rw-.data
    2003e494   2003e494   000014ae  000014ae   r--
     2003e494   2003e494   000014ae  000014ae   r--.const
    2003f948   2003f948   00000228  00000228   r--
     2003f948   2003f948   00000228  00000228   r-.cinit

    FW-B:

    存储器配置

            名称           源   长度     使用    未使用  的属性   填充
    ------------  ----  ------  ----  ----  --------  
     SRAM2                20000000  00004000 0000090c 000036f4 RW X
     SRAM                 20004000  0003c000 0003867c 00003984 RW X


    段分配映射

    运行 origin load origin  length  init length atts members
    ------  ------ ------ ------ ---- ----
    20003a00   20003a00   00000600  00000000   rw-
     20003a00   20003a00   00000600  00000000   rw-.stack
    20004000   20004000   00028300  00028300   r-x
     20004000   20004000   00000040  00000040   r-.Vecresets
     20004040   20004040   00028064  00028064   r-x .text
     2002c0a8   2002c0a8   00000258  00000258   r-.cinit
    2002c400   2002c400   0000f190  00000000   rw-
     2002c400   2002c400   000085a2  00000000   rw-.bss
     200349a4   200349a4   00006bec  00000000   rw-.data
    2003b590   2003b590   000011f2  000011f2   r--
     2003b590   2003b590   000011f2  000011f2   r-.const

    谢谢、

    Jon

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

    如果 RAM 不够大、无法包含两个代码、则使用小型引导加载程序是合理的、该引导加载程序将在启动后加载。 根据某些外部条件(引脚状态、sFlash 中的文件)、将确定是加载 FW-A 还是 FW-B 内部 RAM。

    作为引导加载程序的参考、您可以获取上面链接的引导加载程序。 您需要将此引导程序代码链接到0x20004000 (ROM 引导程序中的入口点)。 FW-A 和 FW-B 应连接到另一个 RAM 位置(例如0x20008000或更高版本)。

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

    您好 Jan:

      感谢 您对患者 的解释。

      我下载您的引导加载程序演示、似乎是因为 cc3220sf 而不是 cc3220s。 我更改了链接文件以使其在 cc3220s 上正常工作、但引导加载程序似乎需要25KB RAM、您可以看到我的主应用程序需要 0003baa2 RAM、  

      因此引导加载程序+主应用程序已经超过了 RAM 大小。

      是否可以重新使用 0x20000000 - 0x20004000?

    Jon

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

    使用 S 或 SF 器件并不重要。 两个器件的架构是相同的。 SF 器件仅具有 XIP 闪存。

    是的、您可以重复使用第一个16kB 的 RAM。 第一个16kB 或 RAM 是.stack 段和其他小段的完美位置。 如果 ROM 引导加载程序调用了代码、则不能将代码段放在这里。 如何使用前16KB 或 RAM、请参阅 www.ti.com/.../swru369d.pdf 第6.1.2章(是的、我知道该文档适用于 CC3200、但本章也适用于 CC3220;原因不明、"CC3220编程人员指南" SWRU464在 TI 站点上不可用)。

    BTW... 如果您没有足够的 RAM、可以选择其他选项。 CC3200 SDK 上的示例为"dynamical_lib_loader"。 此示例演示了如何通过将代码的各个部分动态加载到 RAM 中。 它可以为您提供良好的灵感。

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

    您好、Jon、

    您能否从 CCS 的内存分配工具中提供此处的输出(我很懒,想从内存映射中对其进行计数:)?

    (笑声) 我可以为您提供有关如何将您的 RAM 映射到应用的建议。 和 bootlaoder。

    1月

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

    您好 Jan:

     FW-A:

    FW-B (工厂测试):

    引导加载程序:

    Jon

    谢谢

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

    您好 Jan:

     FW-A:

    FW-B (工厂测试):

    引导加载程序:

    Jon

    谢谢

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

    您好、Jon、

    FW-A 和 FW-B 的链接器文件如下所示:

    #define SRAM_base 0x20013000 //您的应用程序从该地址开始*/
    
    MEMORY
    {
    SRAM_DATA (RWX):origin = 0x20000000,length = 0x13000 //对于 RAM 填充*
    SRAM_CODE (rwx):origin = 0x20013000,length = 0x2D000 //对于 RAM 中的代码*/
    }
    
    SECTIONS
    {
    .text :> SRAM_CODE
    .TI.ramfunc:> SRAM_CODE
    .const :> SRAM_CODE
    .cinit :> SRAM_CODE
    .pinit :> SRAM_CODE
    init_array:> SRAM_CODE
    
    .data :> SRAM_DATA
    .bss :> SRAM_DATA
    sysmem :> SRAM_DATA
    堆栈 :> SRAM_DATA (高电平)
    
    /*这些部分由 FreeRTOS 使用*/
    .resetVecs:> SRAM_base
    .ramVecs:> SRAM_DATA,type=NoLoad
    }
    

    用于 BOOLOADER 的链接器文件:

    #define RAM_base 0x20004000
    
    存储
    器{
    SRAM_CODE (rwx):origin = 0x20004000,length = 0x8000
    SRAM_DATA (RWX):origin = 0x20000000,length = 0x4000
    }
    
    //内存
    
    中的段分配*/ SECTIONS
    {
    .intvecs:> RAM_base
    init_array:> SRAM_CODE
    .vtable:> SRAM_CODE
    .text:> SRAM_CODE
    .const:> SRAM_CODE
    .cinit:> SRAM_CODE
    .pinit:> SRAM_CODE
    .data :> SRAM_DATA
    .bss:> SRAM_DATA
    .sysmem:> SRAM_DATA
    .stack:> SRAM_DATA (HIGH)
    } 

    (笑声) Bootlaoder 将读取 sFlash 中的文件内容、并从0x20013000开始将其上载到 RAM 中并执行。 我没有测试此链接器文件、可能遗漏了一些内容。 但它说明了如何将链接器文件更改为与引导加载程序配合使用并节省一些宝贵的 RAM 空间。

    1月

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

    您好 Jan:

    引导加载程序:

    FW-A:

    FW-B (工厂测试):

       此外、还有一个问题、如果我要将 bootmode.bin 文件放在根文件系统数据包下、当引导加载程序找到此'bootmode.bin'文件时、它会将 FW-B 加载到 RAM 中。 出厂测试后、FW-B 将删除'bootmode.bin' 我知道 有一  个初始化映像数据包概念、 当我执行恢复初始状态操作时、'bootmode.bin'文件是否会被恢复?

    Jon

    谢谢

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

    如果'bootmode.bin'将是出厂映像的一部分并且将使用出厂恢复功能、则将恢复文件'bootmode.bin。 如果不打算使用此行为、则应考虑添加功能以在 FW-A 中创建此文件

    BTW... 您是否能够使用上面的链接器文件管理引导加载程序和代码?

    1月