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.

[参考译文] 使用 CCS 7实现具有堆栈/应用边界的 CC2640字对齐

Guru**** 2551220 points
Other Parts Discussed in Thread: CC2640, CC2640R2F, UNIFLASH, BLE-STACK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/568731/cc2640-word-alignment-with-stack-app-boundary-with-ccs-7

器件型号:CC2640
主题中讨论的其他器件:UNIFLASHBLE-STACK

您好!

我即将结束使用 CC2640开发应用的工作、但我正在快速耗尽闪存。 这是我当前的布局(基于片外 OAD 解决方案):

 -闪存的前68KB (17页)发往应用程序。

-以下56KB 闪存将发往 BLE 堆栈。 大约3KB 未使用。

-引导加载程序使用最后4KB 的闪存。 应用程序的构建过程将引导加载程序的(硬编码)入口点放置在地址0x0000处。

我的 OAD 设置同时更新应用程序和堆栈、我不想单独更新它们。 鉴于此、我看不到强制栈对其闪存页面进行独占访问的原因、特别是我希望能够将其起始地址增加3KB、以便应用可以使用这些3KB (在栈的第一页上)。 我知道这意味着应用程序和堆栈都必须在每次编译后正确合并其二进制文件后下载到器件中、但这不是问题。

这是否有原因? 如果不是、我应该如何更改项目以允许发生这种情况? 我猜我只需要更改堆栈起始地址和应用程序闪存大小、我是否遗漏了任何内容?

谢谢!

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

    如您所知、3KB 是由堆栈映像的页面对齐导致的。 (对于 OAD + CCS 闪存加载程序限制)

    最后、3KB 看起来不是连续的。 您的侧边是否出现了这种情况? 对于您概述的步骤、是的、您必须同时执行这两个步骤。 链接器命令文件中有一条有关如何通过 define 执行此操作的注释。 此处的问题是页面对齐、您需要将该设置更改为字对齐。 之后、您将有更轻松的时间尝试从堆栈中爪回3KB。

    您可以看看如何在 CC2640R2F SDK 上完成该操作、甚至只需使用具有字对齐闪存加载程序的 CCS v7即可。 但我们在这方面几乎不能为您提供支持。

    另一种解决方案可能使用 CC2640R2F 作为您的芯片、因为它基本上可以直接替代 CC2640。

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

    非常好、谢谢!

    我没有检查.map 文件、但我看不到为什么闪存会变得非常碎片化的原因。 我将尝试更改起始地址和长度、并进行一些测试、以检查所有内容是否仍然正常工作、如果遇到任何问题、请返回。 我不担心刷写两个应用程序、因为我已经手动合并了二进制文件(我需要为 OAD 执行此操作)、并且可以使用 Uniflash 刷写合并的映像。

    我只读了一点关于 R2F 芯片的信息、它能带来什么优势? 根据我收集的数据、硬件是相同的(相同的闪存大小)。

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

    是的、在我这边、它尝试从边界开始、碎片化的闪存更接近最后几页。 我不知道转换为字对齐工程所涉及的工作-我想它只是更改链接器命令文件。 如果有机会、请查看 CC2640R2F SDK。

    software-dl.ti.com/.../cc2640-to-cc2640r2.html
    ^了解有关优势和特性的信息。

    是的、它几乎是相同的器件、但在 ROM 中包含 BLE-Stack 的一部分。 这是闪存节省的主要原因。

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

    您好!

    今天,我终于试图解决这一问题,但结果好坏参半。 作为参考、我不使用最新的 SDK、我的 simplelink 文件夹名为'ble_cc26xx_2_01_01_44627'。 我计划切换到 CC2640R2F、但这可能只会在几个月后发生、而且我需要在这之前使用一个有效的(如果功能不完整)版本。

    我最后所做的只是更改 ccsLinkerDefinites.cmd 中的 ICALL_STACK0_ADDR 的值、并禁用调用 Boundary.exe 的编译后处理步骤(以便边界校验器不会将其更改回来)。 原来的内容是:

    --define=ICALL_STACK0_ADDR=0x0001100

    我将其更改为(0xd48为3400十进制):

    --define=ICALL_STACK0_ADDR=0x00011D48

    堆栈和应用程序构建正确、链接器完全没有抱怨、.map 文件中的一切似乎都正常。

    然后、我合并了.hex 文件、为应用设置范围0000:11D47、为堆栈设置11D48:1EFFF (引导加载程序驻留在1F000:1FFFF 中)、并使用 Uniflash 将其刷写到 MCU 中。 但是、调用 BIOS_start 函数后、应用程序会立即崩溃:我猜这与栈末尾不能完全正常运行有关

    我还应该做些什么才能使其正常工作? 我无法想象不与闪存页面对齐可能会对堆栈产生怎样的影响、因此我不知道为什么这不起作用。 堆栈和应用都使用新地址进行链接、因此这似乎是可以的。 任何指示都将非常有帮助!


    谢谢


    编辑:我使它正常工作! 事实证明、还有另一个文件需要修改、ccsCompilerDefines.bcfg、它还包含 ICALL_STACK0_ADDR。 在改变它之后、一切现在都再次正常工作。

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

    做得很好:)

    为希望在较旧 SDK 上进行字对齐的用户提供了良好的参考信息!

    此致、

    反叛分子