如何让 Debug 在 no_std 代码中发出十六进制值?

How to make Debug emit hex values in no_std code?

我正在用 Rust 制作一个裸机应用程序。我可以轻松地让任何给定的结构打印其调试信息,但我希望它们中的一些以十六进制打印它们的一些值。

例如:

impl core::fmt::Debug for Task {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        fmt.debug_struct("Task")
            // ...
            .field("SP", &self.context.sp)
            .field("KSP", &self.context.ksp)
            // ...
            .finish()
    }
}

我不知道如何将 spksp(都是 i64)打印为十六进制数。我的第一个想法是以某种方式使用 format! 宏,但由于我使用的是 #![no_std],所以我无法访问它。

如何使调试输出以十六进制形式打印这些值?

您可以使用 format_args!() 宏。它是所有格式化机制的来源,但不分配,因此在 core:

中可用
impl core::fmt::Debug for Task {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        fmt.debug_struct("Task")
            // ...
            .field("SP", &format_args!("{:X}", self.context.sp))
            .field("KSP", &format_args!("{:X}", self.context.ksp))
            // ...
            .finish()
    }
}