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.

[参考译文] LAUNCHXL2-RM46:使用 Project_1方法、ARM-none-eabi-gcc 不会生成控制台输出

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/847600/launchxl2-rm46-arm-none-eabi-gcc-does-not-produce-console-output-using-project_1-approach

器件型号:LAUNCHXL2-RM46
主题中讨论的其他器件:UNIFLASHRM46L852HALCOGEN

在 Linux 上、我安装了 UniFlash 和 ARM-none-eabi-gcc。 我一直在努力、但没有成功地提供一种使用 sci 在串行终端上提示输入的方法、这与 Launchpad Project_1示例的工作方式类似:

void sciDisplayText (sciBASE-t * sci、uint8 *文本、uint32长度);

请参阅  :/Launchpad/RM/RM46L8/Project_1中的 git.ti.com/.../master 我使用的是 ARM-none-eabi-gcc --version:

arm-none-eabi-gcc (用于 Arm 嵌入式处理器8-2019-Q3-update 的 GNU 工具) 8.3.1 20190703 (版本)[gcc-8分支版本273027]

(我在另一个方框上还有 arm-none-eabi-gcc (Arch Repository) 9.2.0 -相同的结果)

我正在使用以下源代码,并为...Init()函数构建所有必需的源代码:

#include

#include "Application_Types.h"
#include "sys_selftest.h"
#include "sci.h"
#include "Gio.h"
#include "rti.h"
#include "het.h"
#include "adc.h"

extern void sciDisplayText (sciBASE-t * sci、uint8 *文本、uint32长度);

Button User1 =无、User2 =无;
uint32 g_PotReading = 468750;

int main (void){
   
   char *s ="Hello World!\r\n";
   gioInit();
   hetInit();
   adcInit();
   adcCalibration (adcREG1);
   rtiInit();
   sciInit();
   mibspiInit();
   
   mibspiREG3->PC0 &= 0xFFE;//CS0为 GIO
   mibspiREG3->PC1 &= 0x6FE;//CS0为输入
   mibspiREG3->PC8 |= 0x1;  //上拉 CS0

   sciDisplayText (scilinREG,(uint8*)s, 105);
   sciDisplayText (scilinREG、(uint8*)"全部完成...\r\n"、105);
   
   返回0;


(我一开始只使用 sciInit(),然后添加了额外的...Init()函数,以防包含必要的定义以阻止打印,而编译器或链接器不会标记这些定义)

我使用以下编译字符串:

arm-none-eabi-gcc -March =armv7-r --specs=nosys.specs --specs=nan.specs -o hello.out hello.c sci.c mibspi.c rti.c sys_vim.c ESM.c sys_phantome.c support_functions.c notification.c sys_dma.c gc.c gio -c gc.c rc.c rc.c rma.c rc.c

代码已成功编译为可执行文件:

$文件 hello.out
hello.out:ELF 32位 LSB 可执行文件、ARM、EABI 版本1 (SYSV)、静态链接、未剥离

闪存成功而不会出现问题:

$./dslite.sh -c ~/doc/arm/ti_rm46x/RM46L852.ccxml -e /home/david/dev/src-c/tmp/arm/prj01/hello.out
执行以下命令:
>/opt/ti/uniflash_5.1.0/deskdb/content/TICloudAgent/linux/ccs_base/DebugServer/bin/DSLite flash -c /home/david/doc/arm/ti_rm46x/RM46L852.ccxml -e /home/david/dev/src-c/tmp/arm/prj01/hello.out

有关更多详细信息和示例、请参阅《UniFlash 快速入门指南》。

DSLite 版本9.2.0.1723
正在配置调试器(首次启动可能需要几分钟时间)...
       正在初始化寄存器数据库...
       正在初始化:IcePick
       执行启动脚本:IcePick
       正在初始化:DAP
       执行启动脚本:DAP
       正在初始化:CortexR4
       执行启动脚本:CortexR4
正在连接...
CortexR4:GEL 输出:  闪存的存储器映射设置@地址0x0Loading 程序:/home/david/dev/src-c/tmp/arm/prj01/hello.out
       正在准备...
CortexR4:GEL 输出:  由于系统复位、闪存@地址0x0的存储器映射设置
       .text:0x94处66556的0
正在擦除闪存
       擦除组0、扇区0
       擦除组0、扇区1:4%
       擦除组0、扇区2:9%
       擦除组0、扇区3:13%
       擦除组0、扇区4:18%
       擦除组0、扇区5:22%
       擦除组0、扇区6:27%
       擦除组0、扇区7:31%
       擦除组0、扇区8:36%
       擦除组0、扇区9:40%
       擦除组0、扇区10:45%
       擦除组0、扇区11:50%
       擦除组0、扇区12:54%
       擦除组0、扇区13:59%
       擦除组0、扇区14:63%
       擦除组0、扇区15:68%
       擦除组7、扇区0:77%
       擦除组7、扇区1:81%
       擦除组7、扇区2:86%
       擦除组7、扇区3:90%
       .text:32748 of 66556 at 0x94:48%
       .text:65500 of 66556 at 0x94:96%
       .data:0 of 1052 at 0x20490:98%
       完成:98%
CortexR4:GEL 输出:  由于系统复位、闪存@地址0x0的存储器映射设置
       将 PC 设置为入口点:98%
正在运行...
成功

但是、当通过串行控制台(使用通信参数19200 N82连接到/dev/ttyACM0)连接时、不会产生输出。 刷写 project1_RM46x.out 可执行文件、立即恢复控制台输出)。 所以我被骗了。 我已经查看了源文件和头文件,以确保我的示例以相同的方式接近控制台输出-- 实际上、使用相同的代码、但我必须在编译或链接过程中缺少一些基本内容、这样生成的可执行文件不会提供与 Project_1示例相同的串行输出。

我愿意接受所有建议、但我看不到 CCS 将会执行什么操作、从而导致一个输出为 arm-none-eabi-gcc 和 ld 的正常 Project _1。 如果有任何帮助,将不胜感激。 我已在 TI.com 上浏览过示例和文档、但未找到缺失的部分。

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

    您好!

    从纯工具的角度来看、最好的技巧是仔细比较演示项目和新项目的编译器和链接器选项-可能有一个开关导致代码无法正确地从复位状态中退出、或者可能错过了代码。 此外、比较链接器脚本、尤其是阻止删除代码的中断服务例程上的 retain 修饰符。  

    这将是我的主要关注点、因为所有其他辅助组件(终端、调试探针、CCS)似乎都已正确配置、 否则问题将在您的设置中的其他位置发生。  

    很明显、从器件/串行端口配置来看、我需要比我在器件本身更有经验的其他人的帮助。 我会通知他们。  

    希望这对您有所帮助、

    拉斐尔

    P.S. 我无法从 Git 树下载演示代码-不知怎么说、tarball 永远不会生成-否则我会在这里进行比较。   

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

    David、

    您是否有可连接到此设置并检查 MCU 程序计数器所在位置的仿真器? 什么是波特率设置? 我们建议您使用基于仿真器的方法来查看代码执行情况、而不是使用 uniflash。 由于编译器资质审核套件的可用性、我们通常使用这些器件支持 TI ARM 编译器、该套件使用户能够使用合格的编译器开发功能安全应用。我们的 Halcogen/CCS 工具除了支持 TI 工具之外、还支持 GCC 和 IAR 工具链。

    我n`t 了您的构建、我没有看到任何引脚多路复用(IO 多路复用器设置)、PMM (电源域)、MPU 和系统启动 ASM 文件、这些文件配置 MCU 初始状态、包括引导/中断矢量、MPU 中的存储器区域、高速缓存配置 等 您能解释一下在何处执行此初始化吗?  我在 CCS 中随附了 Project 1编译器的完整日志、因此您可以了解编译中使用的所有文件。

    e2e.ti.com/.../0121.project_5F00_1_5F00_build_5F00_log.txt

    在开始创建基于 SCI 的串行工程之前、它可能有助于获取具有标准 IO printf 的基准 Hello World 工程、以确认内核设置正确、并且您能够按预期初始化器件。

    请查看其他一些 E2E 文章、这些文章介绍了在 Hercules MCU 平台上使用 GCC 工具链的过程:

    此致、

    Rahul

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

    Rahul、

    感谢你的答复。 我需要注意的一点是、在 MCU 上、Project_1代码从0x0开始、当我使用 ARM-none-eabi-gcc 和 UniFlash 进行编译/加载时、代码从0x94开始。 我对独立式 ARM 器件的经验不是很丰富、但在 x86 (以及之前的8086)方面拥有30年的经验。 我认为您的钱是对的、因为有一个链接器/加载器选项在场景优化后的某个地方或某些地方被错过、删除了相关代码。 我确实在 Windows 上安装了 CCS、但我实际上从未使用 Windows (自 Mandrake 以来、SUSE 7.0以及过去十年的 Archlinux 和 openSUSE)。 我可以在那里工作、了解更多正在发生的情况。

    为了实际学习电路板(而不是学习在电路板上运行的工具)、我尝试将调用串行 I/O 逐件所需的代码组合在一起、并将其归结为所需的最小值。 至少在我的工程师中、这似乎是让学习最快发生的原因(一个好例子、ABI 开启)

    我将返回并进一步深入研究项目文件、链接器脚本和启动汇编文件、以查看错过的内容。 我的印象(也许是错误的)是,如果上面编译的代码没有错误,它将包含 MCU 所需的启动文件,或者我希望编译/链接失败。 我的项目目录中有系统启动 asm 文件文件、但我没有在编译字符串中明确包含这些文件。 让我启动窗口并打开 CCS,看看我是否能找到差异--我会报告。  再次感谢你能抽出时间。