如何让 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()
}
}
我不知道如何将 sp
和 ksp
(都是 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()
}
}
我正在用 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()
}
}
我不知道如何将 sp
和 ksp
(都是 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()
}
}