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.

[参考译文] TMS570LS0432:sprintf 函数的 FreeRTOS 端口稳定性

Guru**** 2528590 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/997120/tms570ls0432-freertos-port-stability-for-sprintf-functions

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

我正在评估 Hercules Launchpad 评估板的 FreeRTOS 端口、以查看它是否可用于与 Cubesat 类似的项目。当从默认的非 FreeRTOS HalCoGen 代码转换到默认的 FreeRTOS HalCoGen 代码时、我发现很难诊断各种症状的问题 (我很乐意提供我迄今为止观察到的症状的描述。)

最简单的问题包含在使用 sprintf 系列字符串格式函数时遇到的以下主程序代码中。 我已`此程序在非 FreeRTOS HalCoGen 上运行、但我可以通过切换 FreeRTOS HalCoGen 第22行中的`#if 1 μ s 来解决此问题。 由于问题表现为第19行的系统复位、取决于第22行之后执行的代码、 我只能得出这样的结论:问题源于 ELF 文件的编译、或者可能是由于存储器位置或与 FreeRTOS 端口相关的存储器访问限制。

如果您想获得有关此问题的任何提示、我们将不胜感激!

此外、您可以提供有关 FreeRTOS 端口历史记录和 TI 当前此操作系统维护计划的任何信息、这将大大有助于我确保 Hercules + FreeRTOS 是我的应用系列的理想选择。

#include "string.h"
#include "stdio.h"

int main(void) {

  char buffer[36];

  // Fixed Length sprintf
  sprintf(buffer, "abcdef");
  snprintf(buffer, 36, "abcdef");

  // strlen
  size_t string_length = strlen(buffer); // assert == 6

  // default int type
  {
  int number = -123;
  sprintf(buffer, "int: %d\n", number);      // Works
  snprintf(buffer, 36, "int: %d\n", number); // Does not work if following code block is enabled
  }

#if 0 // Toggle this to 1 to recreate the issue
  // default unsigned int type
  {
  unsigned int number = 123;
  sprintf(buffer, "unsigned: %u\n", number);
  snprintf(buffer, 36, "unsigned: %u\n", number);
  snprintf(buffer, 36, "unsigned: %4u\n", number);
  }

  // double precision
  {
  double number = 123.456;
  sprintf(buffer, "double: %lf\n", number);
  snprintf(buffer, 36, "double: %lf\n", number);
  snprintf(buffer, 36, "double: %4.4lf\n", number);
  }
#endif

  while(true){;}
}

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

    增大堆栈大小是否会使问题消失?

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

    Alex、您好!

    对于用户、HAL 生成的代码的堆栈大小为0x300。 您可以从 HALCOGEN GUI -> RAM 中调整堆栈大小

    我将堆栈大小增加到0x600、但未看到错误。

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

    是的、这适用于此示例。 谢谢!

    我将详细介绍 FreeRTOS 存储器配置、看看堆栈空间不足是否会导致我观察到的平台不稳定。

    对于 HalCoGen 和 FreeRTOSConfig.h 之间的存储器配置、是否有任何种类的文档或入门资料-对于终端用户而言、我何时可以更改 FreeRTOS 设置以及何时必须重新生成 HalCoGen 设置尚不清楚。