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.

[参考译文] RM46L852:无法运行 GCC 编译的代码

Guru**** 2386980 points
Other Parts Discussed in Thread: HALCOGEN, RM46L852
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1269789/rm46l852-gcc-compiled-code-will-not-run

器件型号:RM46L852
主题中讨论的其他器件:HALCOGEN

我对 RM46 Hercules 开发板有一个奇怪的问题。

使用 Linux 上的 Code Composer Studio 11.1.0和在 VirtualBox 中运行的 HALCoGen 4.7.1、我可以使用 TI 工具集(v20.2.7.LTS)创建一个平凡示例程序(打开一些 LED)。  这工作正常。

如果我使用同样的示例程序、但为 GCC 生成 HAL、并将 CCS 设置为使用我已安装的 ARM 交叉编译器(GCC 10.3.1、 通常错误地将哪个 CCS 误认为是 GCC 11.0、将/usr/bin 添加到工具搜索目录并将 CG_TOOL_GCC 设置为/usr/bin/arm-none-eabi-gcc)则编译正常但不会运行。  我可以将代码刷写到电路板上、但当它尝试执行第一条指令时、会立即收到预取中止信号。

显然,我违反了一些不成文的规则-- CCS 甚至在属性对话框中报告说"所选设备目前不提供 GNU 工具链的初始化细节"。  我应该怎么做?

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

    Hi Rhodri、

    我们已开始处理您的问题、并将尝试尽快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    Hi Rhodri

    很抱歉耽误了我们的时间

    被重新分配给该模块的专家。 请等待他的答复。

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

    在将项目加载到闪存中时、您是否启用了 ECC 生成功能? 您能否共享您的编译器选项或示例 CCS 项目?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    加载项目到闪存时是否启用 ECC 生成?

    我没有更改 CCS 默认项目中的任何内容。  我甚至不确定能在哪里找到 ECC 生成选项。

    我必须重新生成示例 CCS 工程、我似乎已按原样删除了该工程。

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

    附件应该是我发生故障的 CCS 工程的存档。  我已经安装了 gcc-arm-none-eabi 和 binutils-arm-none-eabi 软件包、并且正在通过/usr/bin.获取该项目

    e2e.ti.com/.../halcogen_5F00_gcc_5F00_ex.tar.gz

    "我什么都没有改变"是一个非常低调的表述;当然、我必须添加一些变量和编译器标志、但这就是我对其他完全不使用 CCS 的项目非常熟悉的东西。

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

    我在编译您的项目时遇到了很多错误。 我使用 GNU 9.2.1 (Linaro)。

    我甚至不知道在哪里可以找到生成 ECC 的选项。

    这是将 OUT 文件下载到闪存时的选项。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我编译项目时遇到很多错误。 我使用 GNU 9.2.1 (Linaro)。

    这是令人不安的。  我不知道它来自哪里;根据 grep 的信息、整个项目目录中没有对"cs1210"的引用。

    我正在使用当前 Linux 提示附带的 GCC ARM 交叉编译器包:

    rhodri@scrote:~$ /usr/bin/arm-none-eabi-gcc --version
    arm-none-eabi-gcc (15:10.3-2021.07-4) 10.3.1 20210621 (release)
    Copyright (C) 2020 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    我甚至不确定能在哪里找到 ECC 生成选项。

    这是将 OUT 文件下载到闪存时的选项。

    [/报价]

    这来自哪个对话?  我无法在项目属性中找到它。  (如果此情况有所不同、我将使用 CCS 11.1.0。)  我有一点担心、当 RM46L852是一种 Cortex-R4F 器件时、标题指的是 Cortex_R5、但是这可能不是问题。

    编辑:我找到了对话框。  CCS 11.1不提供"片上闪存"选项。

    编辑:Ah、CCS 可能会被混淆。  它假定(错误的) GNU 编译器始终是gcc这样的、因此它正在识别我希望从非交叉编译器获取的编译器。  它仍然以某种方式将它解析成了错误。

    rhodri@scrote:~$ gcc --version
    gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
    Copyright (C) 2021 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    CG_TOOL_GCC 的设置可确保它选择正确的编译器、但我需要更努力地手动覆盖包含目录。

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

    工具 include 目录上的戳记似乎没有任何变化。

    背景:我继承了使用 HalCoGen 设置但使用 Simple Makefile 的项目、这些文件对于具有 RM46L852PGE 的电路板非常有效。  我不能简单地克隆它们以用于 Hercules 开发板上的新项目、因为它具有 RM46L852ZWT (我想不同的封装)。  当我试图通过生成新的 HalCoGen 文件来创建一个新项目时、我遇到了上面描述的预取中止问题。  我一直不愿意基于我的旧 HalCoGen 文件来刷写代码、因为芯片封装存在差异、而且用于将代码刷写到电路板上的脚本会因这种不匹配情况而有明显的陷阱。  我没有理由认为他们会碰到同样的问题。  现在、我只是为了配合 TI 的常规工具而使用 CCS。

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

    我在 Windows 10下使用 CCS 1210。

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

    我不是 Windows 用户、我不必下载另外一个版本的 CCS。

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

    Hi Rhodri、

    很抱歉回复晚了、我刚从度假回来办公室。

    这两个封装之间的唯一区别是 NHET 引脚的数量、SPI 模块的数量、和支持 EMIF 的 ZWT 封装。 启用 或禁用这些模块不应生成预取中止。 您的项目中未启用闪存 ECC、因此预取中止不是由指令读取时的 ECC 错误引起的。

    预取中止是由错误的返回地址或分支地址引起的。 请检查 IFSR 和 IFAR 的状态、以确定故障类型和导致中止的地址。

    IFAR 和 IFSR 是两个 ARM Cortex-R4 CP15寄存器。  

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

    问题、事实证明、RM46在执行复位矢量时处于 ARM 模式而不是 Thumb 模式、但复位例程_c_int00像其他一切一样在 Thumb 模式下编译。  由于_c_int00没有4字节对齐(在0x1cea 处)、这没什么用处、因此神只知道芯片认为它正在执行什么指令。

    将以下用户代码片段添加到 sys_startup.c 可以解决该问题:

    /*用户代码开始(4)*/ 
    /*在 ARM 模式下从复位向量调用_c_int00 */
    void _c_int00 (void)__attribute__((target ("arm"));
    /*用户代码结束*/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    sys_vim.h 中的中断例程声明也需要 target ("arm")属性。

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

    谢谢