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.

[参考译文] CC1312R7:CoreSDK 启动文件和 FPU 配置

Guru**** 2482105 points
Other Parts Discussed in Thread: CC1312R7

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1257042/cc1312r7-coresdk-startup-files-and-fpu-configuration

器件型号:CC1312R7

您好!

我正在探索最新的 Simplelink F2 SDK 中 CoreSDK 的 NoRTOS 方法、有三个松散关联的问题:

1.启动文件"kernel/nortos/startup/cc13x2_cc26x2_gcc.c"是否适用于 cc1312r7? 如果是、那么与 "source/ti/devices/cc131x2x7_cc26x2x7/startup_files/startup_gcc.c"相比、该文件的预期用例有何差异?

2.两个启动文件都启用 FPU (仅在使用浮点编译时使用 nortos-1)。 然而、在 CoreSDK 中、只有 cc13x4_cc26x4的文件包含 CMSIS 的配置和__ FPU_PRESENT 的设置(使用 FPU ABI 进行编译时需要使用 CMSIS)。 这种提示是否不应将 cc1312r7与 CMSIS 和/或 FPU 支持配合使用?

3.我们在应用程序代码中没有大量使用浮点计算。 TI 是否建议在使用 CoreSDK NoRTOS 时启用浮点?

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

    Andreas、您好

    很抱歉这么晚才回复、但我必须就这些问题联系研发部门。

    这是他们说的:

    1)

    /kernel 文件夹中的所有启动文件均适用于其中的内核版本。 FreeRTOS 有特殊调整、例如在其启动文件中。

    对于 NoRTOS、数量较少/无。

    /source/ti/devices 中的启动文件全部用于纯裸机应用、实际上仅用于旧应用以及支持测试 FW 等内部客户。

    2)  

    我们仅在 CC13x4x10和 CC26x4x10系列上正式支持 CMSIS。 这不是需要考虑的问题、我们在 CC13x1x3、CC26x1x3、CC13x2x7、CC26x2x7、CC13x2 或 CC26x2的信息。 您应该仍能够使用 FPU。

    3)

    我们完全不使用浮点计算、 我不能真正想到我们所做的事情的地方。

    • 我们不需要浮点计算。 我们根据需要使用定点。
    • 浮点会显著增加最坏情况下每个任务的堆栈使用率、因为在触发中断时所有 FPU 寄存器都转储到任务堆栈中。 我认为每个任务额外需要150-200个字节、或类似的数据。
    • 代码执行速度较慢、因为编译器无法将 FPU 寄存器用作暂存存储、但如果它不适合 R0-R12、则必须将所有内容放入栈中
    • Cortex-M4/33上的 FPU 计算结果极其缓慢

    总的来说、我强烈建议不要使用它、除非您在没有浮点支持的情况下是绝对不能做的。

    Br

    Siri

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

    非常感谢 Siri 和研发团队提供的详尽答案。

    我有一个关于问题3的后续问题:

    从您的回复和我们自己极少/无浮点用法来看、似乎我们可以从-mfloat-abi=soft 中受益、并且不启用 FPU。 不过、根据我可以收集的信息、CoreSDK 中的预构建库- driverlib.lib、nortos_cc13x2x7.a、drivers_cc13x2x7.a 和 rf_multiple_cc13x2.a -都是使用-mfloat-abi=hardfp 构建的。 这与回复中针对浮点的注意事项并不相符、因此可能我遗漏了一些内容? 我基于显示"Tag_ABI_VFP_args:VFP 寄存器"的库的 readelf -H 输出、以及指定"-mfloat-abi=hard"的"source/ti/devices/cc13x2x7_cc26x2x7/driverlib/bin/gcc/makefile"的库。

    假设它们都是使用 FP ABI 编译的:所有二进制链接库都必须使用相同的 ABI、因此我无法使用非 FP ABI 编译自己的应用、也无法将其与开箱即用的 CoreSDK 进行链接。 我假设我可以使用-mfloat-abi=soft 重新构建大多数 CoreSDK 库。 但是、从  早期的 E2E 主题中 、我被告知"目前无法重新构建射频驱动器库"。 因此、如何遵循建议并使用非 FP ABI 构建应用+CoreSDK? 或者我是否误解了这项建议?

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

    Andreas、  

    我会再次将研发的回应转交给大家:

    "在最近的 SDK 版本中、内核 SDK 库和 RFLib 都应该可以通过 CMake 进行重新编译。 如果他们使用的是较早的版本、事情就会复杂一些。 但即使这样、我们也确实提供了在某种程度上重新构建库的路径。

    我们谨慎使用 FPU 并不意味着我们不会让客户按需使用 FPU。

    在 ARM 器件上、FPU 在您发出第一条汇编 FP 指令之后才实际使用。 此时、CPU 中的几项设置发生了更改、诸如在中断上转储 FPU 寄存器之类的设置是开启的。

    如果用户不使用 FPU、只需永不发出浮点指令->切勿在 C 中使用浮点数据类型。

    就这些。

    无需使用软 FP 或类似的设置重新编译。"

    Siri

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

    再次感谢您提供详尽的答案。

    总而言之、似乎有两种选择、

    1) 1) Re -使用软 FP 构建所有 CoreSDK 库并与我们的"软"应用链接、或者

    2)使用预构建的库,并使用 hard-fp 构建我们自己的应用程序。

    如所述、在第二种情况下、如果我们没有任何浮点指令、则可以避免性能下降。 这方面的一些后续问题:

    1) 1)是否有方法可以在编译时检测二进制文件是否会包含浮点指令? 在源文件中搜索"float"/"double"似乎太脆弱了。

    2) 2)当使用硬 FP 编译但没有浮点指令时、我们是否需要启用 FPU? 或者、如果要翻转这个问题、是否有理由避免打开 FPU? 功耗?

    此致、

    安德烈亚斯

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

    Andreas、您好

    来自研发部门:

    1. 最终、我们需要的是浮点指令。 这意味着您可以针对生成的二进制文件运行解汇编器并搜索浮点指令。 如果你真的,真的想确定. 您可以在 ARM 汇编参考文档中找到 FP 指令列表。
    2. 如果您使用我们的启动文件、则无需执行任何操作。

    Siri

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

    谢谢、我尝试了建议的方法、发现在 CoreSDK 中预构建的库中确实存在浮点指令。

    我选择了"arm-none-eabi-objdump -d source/ti/drivers/lib/gcc/m4F/drivers_cc26x2x7.a"、它显示了 UART2_writeTimeOutNonblocking 中使用的指令 vpop、vpush 和 vmov。 从输出中摘录:

    00000000 <UART2_writeTimeoutNonblocking>:
       0:   e92d 4ff0       stmdb   sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
       4:   4615            mov     r5, r2
       6:   ed2d 8b02       vpush   {d8}        <-- Floating point instruction
       a:   e9d0 4200       ldrd    r4, r2, [r0]
       e:   b083            sub     sp, #12
      10:   ee08 2a10       vmov    s16, r2     <-- Floating point instruction
      14:   4682            mov     sl, r0
      16:   4688            mov     r8, r1
    
    (vpop used later at offset 0xf2)

    从源代码中、我无法真正判断为什么 要使用这些指令(没有 浮点数据类型。)

    我们不使用非阻塞 UART、因此理论上不会执行该指令。 但这似乎脆弱和难以维护。  是否有办法可以在运行时检测浮点指令是否已被执行、以及 CPU 中的设置是否发生了您之前提到的更改?

    我可以尝试在没有非阻塞 UART 的情况下重新构建库、但感觉有点古怪、那时我也可以使用软 FP 重新构建 CoreSDK。 话虽如此、我尝试按照"docs/simplelink_mcu_sdk/simplelsdk/CoreSDK.html#rebuilding-the-libraries"中文档的说明重新编译 Users_Guide。 但是、射频库不会作为该过程的一部分重新构建。 是否有任何文档。 描述了如何重新构建 RF_MULTIPLE_cc13x2.a?

    记录如下:我的 arm-none-eabi-objdump 版本是2.36.1.20210621、而且我使用了从 Simplelink F2 SDK 7.10.00.98获取的 CoreSDK v7.10.02.00。 我搜索了 Cortex M4器件通用用户指南中第3.11节指定的浮点指令。

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

    一个小的更正:我看到我编写了"arm-none-eabi-objdump -d source/ti/drivers/lib/gcc/m4F/drivers_cc26x2x7.a"来分解库、但正确的库名称当然是 drivers_cc13x2x7.a、而不是 drivers_cc26x2x7.a。 它们都具有相同的浮点指令。

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

    你好、 、在哪里可以回答我最后的问题?

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

    从源代码中、我无法真正判断为什么 要使用这些指令(没有 浮点数据类型。)

    这 只是一种性能 优化 、因为 FPU 仍然可用、 在 FP 寄存器中保留局部变量比将其放在堆栈中更快。

    但是、射频库不会作为该过程的一部分重新构建。 是否有任何文档。 描述了如何重新构建 RF_MULTIPLE_cc13x2.a?

    您可以使用 arm-none-eabi-nm -a rf_multiple_cc13x2来找出该库包含哪些.o 文件。 .a 文件实际上只是容器。 然后、在 SDK 中与其他驱动程序一起以相同的名称重新编译.c 文件。 尝试一下吧。

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

    不幸的是、我无法找到任何可以帮助解决问题的人。

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

    谢谢 、这看起来是一种很好的方法。 我 打算在生产环境中使用此文件、因此我希望确保使用正确的标志等正确构建文件。 我认为是

    1) 1)操作 cmake-configuration 以同时构建射频文件。 (首选)

    2) 2)找出用于构建其他文件和手动构建射频文件的命令(包括标志)

    很遗憾、我不熟悉 Cmake。 您能给我一些关于 其中一种方法的建议吗? 也许这 也适用于 Siri。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否能够给我一些关于 其中一种方法的指针

    不、抱歉。 但是1听起来足够容易。 我想 SDK 中的某个位置有一些文档。

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

    Andreas、您好

    关于重建重建的文档 rf_multiple_cc13x2.a、我们不提供此内容。 rf_multiple_cc13x2.a 中包含的所有文件都位于 SDK 中(source/ti/drivers/rf/和 source/ti/devices/cc13x2_cc26x2/)、为了能够"重建这些文件"、您需要手动将所有文件添加到您的项目中以覆盖库文件中的内容。

    有计划将 rflib 与 SDK 的其余部分一起使用 Cmake 生成、但不确定具体执行时间(希望是 Q42023或 Q12024)

    Siri

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

    谢谢 Siri、我可能会设法重建(RFCC26X2_MULTIPLE.c 很容易、driverlib 中的 RF-PATCHS 和 RFC.c 似乎有点棘手、但我会弄清楚)

    最后一个问题:

    是否可以在运行时检测浮点指令是否已被执行以及 CPU 中的设置是否已如8月10日的 YOR/R&D 回复中提到的那样发生更改?

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

    Andreas、您好

    研发部参考了此文档:

    Cortex-M4 (F)怠惰堆叠和上下文切换-应用手册298 (arm.com)

    FPCCR.Aspen: 如果将该位置1、则在执行浮点指令时将特殊控制寄存器的位[2]置1 (FPCA)、从而导致在异常进入时自动保留浮点状态

    不过、控制寄存器中的此位似乎是保留的、因此不确定您需要什么是可能的。

    Siri