在C语言中,如何将单个字节转换为单词来表示大脑皮层?

在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) &

在不使用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) & 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