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/TMS570LC4357:代码停止工作(sprintf)

Guru**** 2539500 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/958803/ccs-tms570lc4357-code-stopped-working-sprintf

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

工具/软件:Code Composer Studio

  你使用 FreeRTOS 创建一个 HalCoGen 项目时、这个代码停止工作(崩溃、在"b DataEntry"停止)(你不必为此使用 FreeRTOS):

uint32_t id = 0x14FF01EF;
float internalVoltage = 22750.0;
int8_t intTempC = 25;

char buffer[150];
int len = sprintf (buffer、"(0x%08x)内部电压:%4.2f 内部温度:%d\r\n"、(int) bufferid、internalVoltage、intc
(temp);intc);puts (temp) 

我将其跟踪到"HL_SYS_CORE.asm"。 第162-167行的部分从以下位置进行切换(无 FreeRTOS):

userSp .word 0x080000+0x00001000
svcSp .word 0x080000+0x00001000+0x00000100
fiqSp .word 0x080000+0x00001000+0x00000100+0x00000100
irqSp .word 0x080000+0x0000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100+0x0000+0x000100+0x000100+0x000100+0x000100+0x000100+0x0000000100+0x000100+0x000000000100+0x000100+0x000000100+0x0000+0x000100+0x000800000100+0x000100+0x000080000000100+0x000100+0x000100+0x000100+0x000100+0x000100+0x

为此(使用 FreeRTOS):

userSp .word 0x080000+0x00000300
svcSp .word 0x080000+0x00000300+0x00000100
fiqSp .word 0x080000+0x00000300+0x00000100+0x00000100
irqSp .word 0x080000+0x00000300+0x00000300+0x00000100+0x00000100+0x00000100+0x00000100+0x00000100+0x000100+0x000000000000100+0x000000000300+0x00000300+0x00000000100+0x000000000100+0x000000000000080000000100+0x000100+0x000100+0x000000300+0x000000000300+0x000000000000100+0x000000000000080000000300+0x000300+0x000

我在任何 PDF 或论坛中都找不到这些价值观或提及这些价值观的任何地方。 函数是“初始化堆栈指针”--这就说明了它影响 sprintf 的原因。

如何设置这些值、以便 sprintf 和 FreeRTOS 能够正常工作?

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

    如果堆栈溢出、将生成数据中止。  

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

    如何检测堆栈溢出? 如何设置这些值、或者您是否只需设置堆栈大小?

    我找到 了使用 printf 的提示

    它说:"确保堆栈足够大。 调用其中一个* printf 函数需要400字节以上的栈、具体取决于编译器的版本。 确保堆栈处于有效的读/写数据存储器中。" -- FreeRTOS 正在将堆栈设置为300,您需要400... 但我不知道如何在系统内核更改后将其升高。

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

      Code Composer Studio 中的"Stack Usage"视图(CCS 6.2及更高版本中提供)提供了应用程序堆栈使用情况的静态视图。 该信息在工程编译时生成、并显示为函数调用树、其中包含水平条形图中每个函数的栈使用情况。  

    在 CCS 工程链接器配置中、您可以设置堆栈大小。 CCS 工程属性--> CCS 编译--> ARM 链接器-->基本选项

    映射文件中的栈大小是您在链接器 cmd 文件中定义的内容:staring address、and length。 它定义了堆栈的位置。

     sys_core.asm 中的_coreInitStackPointer_()定义了每种模式(用户、SVC、IRQ、...)的堆栈大小。

    CCS 链接器选项中的--stack_size 应与 _coreInitStackPointer_()函数中定义的总大小匹配。

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

    [引用 user="Chris Dickerson "]但我不知道如何在系统内核更改后将其提升。[/quot]如果从 FreeRTOS 任务调用 sprintf 函数、则在创建任务时指定堆栈大小-查看 堆栈应该有多大? 来自 FreeRTOS 常见问题解答。

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

    我知道在任务中运行、问题是在 CAN 的通知中使用 sprintf。。。 这不在任务范围内。