【问题标题】:What can I use instead of sprintf?我可以用什么代替 sprintf?
【发布时间】:2018-02-22 07:39:27
【问题描述】:

我正在研究 TI-TM4C129X ARM 板并尝试编写 LOG 机制。当我从任务中调用它时效果很好,尽管我在使用计时器调用它时遇到了问题。据我所知,printf 喜欢函数适用于 Hwi,这会导致错误。我的目标是将字符串与 sprintf()、vsprintf()、memcpy() 和 memset() 等操作一起格式化。我怎么解决这个问题 ?是否有任何等效的方法可以成功 sprintf() 操作? 谢谢你的回答, 最好的问候。

【问题讨论】:

  • 请粗略解释一下 Hwi 是什么以及您认为这会导致问题的原因。就对 C 标准库函数的一般理解而言,理论上需要注意的是,它们都不需要是线程或中断安全的,尽管在实际使用中,至少 sprintf 应该没有问题。
  • 一般来说使用 stdio.h 总是一个坏主意,尤其是在微控制器应用程序中。只需推出自己的字符串转换例程,您一生中只需这样做一次,然后就可以设置了。编程是一件小事。
  • “当我用计时器调用它时。”这是否意味着您还尝试从中断服务例程中执行日志记录功能?如果是这样,这是一个可怕的想法。中断服务程序通常应尽可能小。

标签: embedded printf interrupt string-concatenation texas-instruments


【解决方案1】:

这听起来像是 printf 的问题,而不是 sprintf。假设您的日志消息使用中断(UART 使用),并且您的计时器是从中断中调用的,那么您的选择是有限的。

一旦在定时器的上下文之外,我会在定时器中设置一个你的任务代码可以检查的标志。此标志可以指示要打印的几条消息之一,甚至包括一个时间戳,如果这有助于事后解决问题,因为您打印的消息将不按顺序排列。

或者,使用 SWO 输出(如 Segger j-link),您应该能够只发送数据。但是为了避免乱句,你需要在发送调试消息时暂停中断,这显然会影响实时行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多