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.

[参考译文] MSP430FR2675:如何在 CCS 10中启用到控制台的 printf 输出?

Guru**** 2513185 points
Other Parts Discussed in Thread: MSP430FR5969, MSP-FET, MSP-TS430PT48A, MSP430FR2633, CAPTIVATE-PGMR, CAPTIVATE-FR2633, MSP430FR2675, MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1021174/msp430fr2675-how-to-enable-printf-output-to-console-in-ccs-10

器件型号:MSP430FR2675
主题中讨论的其他器件:MSP-FETMSP-TS430PT48AMSP430FR2633CAPTIVATE-PGMRCAPTIVATE-FR2633、 MSP430FR5969 MSP430FR2355

我使用的是 CCS 10.3。  我将--print_support 选项更改为 nofloat、并且我的项目构建时不会出现任何错误或警告。  但是、我在 CCS 控制台中看不到 printf 语句的任何输出。  CCS 中的断点功能充其量也很差(即某些断点不会被命中、即使没有优化;断点计数器永远不会停止执行)、因此我真的需要使这个控制台输出正常工作、以便我可以对我的应用程序正在执行的操作有一些了解。

详细说明如何从 printf 语句获取/查看控制台输出。  我使用的是 MSP-FET 和 MSP-TS430PT48A。

如果您只想让我看到一个文档、请至少让我找到正确的部分。  我需要一个解决这一问题的答案、而不是像我在这里的另一个 TT 那样、在没有解决问题的情况下持续数周的时间。

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

    您好,

    您应首先在项目中包含 stdio.h 头文件。 然后您可以在代码中调用 printf()函数。

    此致、

    现金 Hao

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

    我已经包含 stdio.h  正如我说过的、我的代码编译时不会出现任何错误或警告。  我需要有关如何使 printf 输出显示在 CCS 控制台视图中的帮助。

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

    您好!

    您可以在此处分享您的代码吗? 您说"一些断点不会被命中"。 我认为代码可能会导致问题。

    此致、

    现金 Hao

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

    您是否尝试过 fflum()?

    然后耐心等待。

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

    奇怪的是、当我在调试器中运行 Hello World 启动项目时、我能够看到"Hellow World" 输出到控制台。  尽管它在`_TI_writemsg ()`的第114行上意外中断。  如果我恢复程序执行、那是我看到控制台输出的时候。   

    但是,当我从空项目开始,并添加两行代码以匹配 hello world 项目中的`main()`的实现时,控制台输出将不起作用。

    这让我相信需要在项目设置中配置一些内容。

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

    我`运行`fflush (stdio)`、再次调用`printf、甚至在打印字符串的末尾添加额外的(多个)换行符('\n')。  没有乐趣。

    然后我尝试切换 使用`assert()`来执行我的单元测试。  调试器在与 Hello World 项目相同的奇数位置停止、就像它将正常工作一样、但在继续执行程序后、此错误会打印到控制台:

    无法识别地址(0x8000)处 CIO 缓冲器中的无效 CIO 命令(255)。 请检查器件和程序存储器映射。

    将堆从160字节增加到1024字节没有任何效果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="395234" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1021174/msp430fr2675-how-to-enable-printf-output-to-console-in-ccs-10/3778293 #3778293]Oddly 时、当我在调试器中运行 Hello World 启动项目时、我能够看到"Hellow World"! 输出到控制台。  尽管它在`_TI_writemsg ()`的第114行上意外中断。  [/报价]

    我可以在 CAPTIVATE-FR2633中的 MSP430FR2633中使用 CAPTIVATE-PGMR 作为调试器重复该行为。

    在项目中配置为:

    • CCS 10.4.0.00006
    • TI 编译器 v21.6.0.LTS
    • --printf_support=nofloat
    • --heap_size=300
    • --stack_size=300

    当启动调试会话并在 main()的开始处停止时,FRCTL0寄存器会将 NWAITS 显示为一个等待状态:

    如果尝试单步执行 printf()调用,则以 trgmsg.c 结束:

    printf()与 TI 编译器配合使用的方式是,调试器在 mgmt.c 中的__TI_writmsg 函数内的 C$$IO$$符号上设置断点, 断点到达后、调试器应从 CIO 缓冲器中读取 printf()输出、在控制台上显示该输出、然后自动继续目标。

    在上面的中、注意到断点在地址0x00E39C 处报告、其中 、在上面的示例程序中、C$IO$$符号的实际地址为0x00E3AC。

    查看 《MSP430FR2633器件勘误表》(修订版 S) 可以看到以下内容:

    在主程序开始时停止后、在"Registers"视图中手动将 FRCTL0寄存器设置为0xA500、将 NWAITS 设置为零。 现在,当单步执行 printf()调用时,会在控制台上获取输出,并且 trgms.c 中不会出现伪中止:

    由于行为发生了变化、而只是将 NWAITS 从1更改为0、即没有对编译的程序和 CCS 项目设置进行更改、因此它只是建议使用 errara EEM23是问题的原因。

    我没有 MSP430FR2675需要重复该测试、但该器件具有列出的相同 EEM23勘误表。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91588" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1021174/msp430fr2675-how-to-enable-printf-output-to-console-in-ccs-10/3783240 #3783240"]我没有 MSP430FR2675来重复此测试,但该器件具有列出的相同 EEM23勘误表。

    我为 MSP430FR5969提供了相同的代码和项目选项、虽然  MSP430FR5969也列出了 EM23、但最初未显示问题。 注意到器件复位状态的差异:

    • 在 MSP430FR2633中、NWAITS 的初始状态为1。
    •  在 MSP430FR5969中、NWAITS 的初始状态为0。

    对于 MSP430FR5969、如果使用调试器在 main 开始时将 NWAITS 设置为1、然后尝试设置 printf()调用、则可能会重复同样的问题: trgms.c 中意外停止; 在 PC 处于0x0064A8时停止、其中 C$$IO$$符号的地址为0x0064B8。

    如果 MSP430FR2675只需在 处理器频率(MCLK 频率)<= 8MHz 的情况下运行、则可以将 NWAITS 设置为零、以避免在调试时使用 EM23。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="395234" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1021174/msp430fr2675-how-to-enable-printf-output-to-console-in-ccs-10/3778293 #3778293"]这让我相信需要在项目设置中配置某些内容。

    过去发现堆空间不足会导致 printf()在 CCS 控制台上无提示地生成任何输出,此时当 printf 尝试生成输出时调用 setvbuf()函数内部的 malloc()函数无法为输出缓冲区分配空间(BUFSIZ 设置为256字节)。

    根据测试、300字节的堆应该足以使 printf 正常工作。

    在 MSP430FR2355和 MSP430FR2675上、默认链接器命令文件将.sysmem (用于 malloc)和 .cio 段放在 FRAM 中:

            GROUP(READ_WRITE_MEMORY)
            {
                .TI.persistent : {}              /* For #pragma persistent            */
                .cio           : {}              /* C I/O Buffer                      */
                .sysmem        : {}              /* Dynamic memory allocation area    */
            } PALIGN(0x0400), RUN_START(fram_rw_start) RUN_END(fram_rx_start)

    我在  MSP430FR2355上的 printf 测试中发现、创建工程时、默认情况是勾选了 CCS 工程属性下的"Enable FRAM Write Protection (FRWP)":

     勾选"Enable FRAM Write Protection (FRWP)"后、 MSP430FR2355的 printf 输出正常工作。

    当 "Enable FRAM Write Protection (FRWP)"被取消勾选时、printf 输出不起作用;单步执行显示 malloc()返回 NULL、即使在链接器选项中设置的300字节堆应该已经足够了。 在 未勾选"Enable FRAM Write Protection (FRWP)"的情况 下、SYSCFG0寄存器被置位、这样所有 FRAM 程序存储器都受到写保护、导致 printf 不产生输出。

    在 勾选了"启用 FRAM 写保护(FRWP)"的情况下、SYSCFG0被置位、这样包含.cio 和.sysmem 段的程序 FRAM 的低1K 字节是可写的、而程序 FRAM 的其余部分是受写保护的。

    虽然我没有 MSP430FR2675可用于测试、但我认为该器件也是如此。 即、在"Project Properties"下检查 "Enable FRAM Write Protection (FRWP)"设置为什么。

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

    Chester、感谢您提供的大量信息。  通过将 FRCTL0设置为0xA500 (NWAITS = 0)并将堆大小增加到300、我能够让我的控制台演示应用工作并模拟"Hello World!" 输出到 HelloWorld 演示生成的控制台。  

    遗憾的是、我的工作项目应用程序仍然存在问题。  我 尝试以 8MHz、然后以1MHz 的频率运行 DCO、并将堆增加到1024字节、但没有乐趣。  我还启用了 Enable FRM Write Protection (FRWP)设置、但这会导致大量链接器错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="395234" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1021174/msp430fr2675-how-to-enable-printf-output-to-console-in-ccs-10/3784397 #3784397"]也启用了 Enable FRM Write Protection (FRWP)的设置,但这会导致一组链接器错误。

    在 CCS Build -> MSP430 Linker -> File Search Path -> Include library file or command file as input (--library、-l)下的项目属性中、您能否检查 列表中是否存在 frwp_init.a:

    如果我为 已启用 FRWP 的 MSP430FR2675获取一个项目、并 列表中删除 frwp_init.a 文件、则获取链接器错误。

     frwp_init.a 库是 安装了 CCS 10.4的 CCS/CCS_base/MSP430/lib/FR2xx/frwp_init.a、即不是编译器运行时间库的一部分。

    在未 指定 frwp_init.a 的情况   下、链接器会返回到尝试为与 MSP430FR2675不兼容的_MPU_init 函数链接不同的库、因为会尝试访问 MSP430FR2675中不存在的 FRAM MPU 寄存器。