如何 printk() s32 内核数据类型

如何 printk() s32 内核数据类型

使用无线驱动模块时,无线介质中的噪声会以 s32 数据类型报告给模块,该数据类型定义在 中linux/types.h

我想使用 printk() 将此值打印到 syslog,但是当我这样做时,我得到了难以理解的结果。目前的尝试包括:

printk("%d", val);  
printk("%d", (int) val);  
printk("%3i", (int)val);  
printk("%3i", val);  
printk("%lx", val);  
printk("%lx", long val);  

我不明白如何格式化这个以进行打印。到目前为止,我还没有找到任何有关如何进行格式化的信息。

由于它涉及内核数据类型,所以我认为在 askubuntu 中发布可能是合适的。

答案1

因为您知道它是一个 32 位 int,所以在将其传递给 printk 之前尝试对其进行转换:

printk("%d", (int32_t) val);

答案2

typedef         __s32           int32_t;

所以你应该把它当作简单的整数值。

答案3

事实证明,符号扩展很重要:

sign_extend32(AR5K_REG_MS(值,AR5K_PHY_NF_MINCCA_PWR),8)

在哪里:

AR5K_PHY_NF_MINCCA_PWR 0x0ff80000 /* 测量到的最小噪声水平,以 1 dBm 为单位从硬件读取 */

AR5K_REG_MS 函数根据测量到的最小噪声水平屏蔽并移动从硬件寄存器读取的值。

sign_extend32 /* 使用指定位作为符号位对 32 位值进行符号扩展 */

完成后,可以使用‘%d’格式化该数字并将其写入系统日志。

相关内容