使用无线驱动模块时,无线介质中的噪声会以 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’格式化该数字并将其写入系统日志。