在C语言中,如何将单个字节转换为单词来表示大脑皮层?
在不使用typedef union的情况下,是否存在C中Cortex-M0的工作宏,它将字节数据复制到31到23之间的字中 我已收到spi的数据,需要将这些数据复制到word中 SRAM不支持位操作,所以我使用“如何在C中设置、清除和切换单个位?”但是字节呢 谢谢 Riscy试试这个在C语言中,如何将单个字节转换为单词来表示大脑皮层?,c,embedded,byte,arm,C,Embedded,Byte,Arm,在不使用typedef union的情况下,是否存在C中Cortex-M0的工作宏,它将字节数据复制到31到23之间的字中 我已收到spi的数据,需要将这些数据复制到word中 SRAM不支持位操作,所以我使用“如何在C中设置、清除和切换单个位?”但是字节呢 谢谢 Riscy试试这个 word &= ~0xFF800000U; /* clear bits 23 - 31; thanks to Igor Skochinsky */ word |= ((byte << 23) &
word &= ~0xFF800000U; /* clear bits 23 - 31; thanks to Igor Skochinsky */
word |= ((byte << 23) & 0xFF800000U);
word&=~0xFF800000U;/*清除位23-31;多亏了Igor Skochinsky*/
word |=((bytepmg的答案仅在前9位已经为零的情况下有效。如果设置了一些位,您的数据将与它们进行OR运算。因此,为了确保您需要首先清除这些位:
#define POS 23 // position at which to insert data
#define MASK ((1UL<<9)-1) // mask of nine 1s
word = (word & ~(MASK<<POS)) | ((data9 & MASK) << POS));
#定义位置23//插入数据的位置
#定义掩码((1UL特别是对于一个字节,您可以使用汇编说明
- UXTB从寄存器中提取位0-7,后跟
- LSL会把它移到你想要的地方
当然,您也需要执行加载和存储操作。但您已经知道了。Cortex-M0中有9位字节吗?哇!可以是10位、9位或一个字节;-)而我完全支持防御编程(还有幽默——我在问题中高估了您的9位字节评论)-按位左移不会将零带入低位吗?掩码操作是必要的吗?@Dan:问题是“用0进行oring是不可操作的”:X | 0
总是X
。因此,具有相应0
的位不会随着=
操作而改变:只有(9)中的位才会改变位置23到31。掩码是为了防止初始字节有10位或更多位:)编译器应该优化掩码(我刚刚检查了gcc
是否有)。啊!@starblue…但是你的字节是8位长,字是32位长。试着用unsigned short
表示字节,用unsigned long
表示单词:)实际上两者都是uint32\u t
,但出于您的高兴,我再次为uint16\u t
类型的byte
做了这件事,结果基本相同。Shift和or在那里,但程序集中没有和
操作码。或者您可以简单地将掩码编写为0x01FFUL。根据默认int类型的大小,可以使用在这一行代码中,e的隐式转换大约在9到12之间。幸运的是,Cortex是32位的,否则你会用这样的代码对它进行隐式转换。@Lundin:任何现代编译器都会在实际编译之前评估预处理器定义。最简单的优化会评估表达式中的常量移位。无论是预处理器还是编译器,都不允许忽略C的类型提升规则。优化器也不允许。这样的代码执行大量逐位操作可能会因此而危险:尤其是~和>>运算符容易受到意外隐式提升的影响@Lundin((1UL