Vitis:将 16 字节变量存储到 4 个 32 位寄存器中
Vitis: Store 16 byte variable into 4 32-bit registers
我有一个 const unsigned char 输入,16 字节。我需要将它存储到 4 个 32 位寄存器中。 Vitis 允许使用 Xil_Out32 将 32 位变量存储到 32 位寄存器。但是我不知道如何将一个 16 字节的输入分成 4 个。
#define MY_REGISTER XPAR_AES_ENCDEC_0_S00_AXI_BASEADDR /*Get the register address*/
#define MY_REGISTER_1 MY_REGISTER + 0
#define MY_REGISTER_2 MY_REGISTER + 4
#define MY_REGISTER_3 MY_REGISTER + 8
#define MY_REGISTER_4 MY_REGISTER + 12
void key_init(const unsigned char key[]);
Xil_Out32(MY_REGISTER, /*4 byte key*/);
这是我将收到的钥匙。从 VHDL 代码输入测试平台:
键 <= x"00112233445566778899aabbccddeeff";
我想把它放入4寄存器。我已经得到了注册基地址:
00112233 至 MY_REGISTER_1,
44556677 至 MY_REGISTER_2,
8899aabb 至 MY_REGISTER_3,
ccddeeff 至 MY_REGISTER_4.
您可以将指向字节的指针转换为指向 32 位值的指针,并使用它来读取寄存器的值。
void key_init(const unsigned char key[]) {
const u32* pointer = (const u32*)key;
Xil_Out32(MY_REGISTER_1, pointer[0]);
Xil_Out32(MY_REGISTER_2, pointer[1]);
Xil_Out32(MY_REGISTER_3, pointer[2]);
Xil_Out32(MY_REGISTER_4, pointer[3]);
}
备注:
作为函数参数给出的数组被转换为指针。
访问pointer[index]
等同于*(pointer + index)
。
请考虑字节顺序,您可能需要使用 Xil_Out32BE()
或 Xil_Out32LE()
或将索引顺序更改为 pointer
。
如果您的处理器需要,您的字节数组需要在 u32
边界上对齐。无论如何,如果字节地址由于对齐而不能转换为 u32
指针,这就是未定义行为。它可能有效,但仅适用于您的特定目标。
我有一个 const unsigned char 输入,16 字节。我需要将它存储到 4 个 32 位寄存器中。 Vitis 允许使用 Xil_Out32 将 32 位变量存储到 32 位寄存器。但是我不知道如何将一个 16 字节的输入分成 4 个。
#define MY_REGISTER XPAR_AES_ENCDEC_0_S00_AXI_BASEADDR /*Get the register address*/
#define MY_REGISTER_1 MY_REGISTER + 0
#define MY_REGISTER_2 MY_REGISTER + 4
#define MY_REGISTER_3 MY_REGISTER + 8
#define MY_REGISTER_4 MY_REGISTER + 12
void key_init(const unsigned char key[]);
Xil_Out32(MY_REGISTER, /*4 byte key*/);
这是我将收到的钥匙。从 VHDL 代码输入测试平台:
键 <= x"00112233445566778899aabbccddeeff";
我想把它放入4寄存器。我已经得到了注册基地址: 00112233 至 MY_REGISTER_1, 44556677 至 MY_REGISTER_2, 8899aabb 至 MY_REGISTER_3, ccddeeff 至 MY_REGISTER_4.
您可以将指向字节的指针转换为指向 32 位值的指针,并使用它来读取寄存器的值。
void key_init(const unsigned char key[]) {
const u32* pointer = (const u32*)key;
Xil_Out32(MY_REGISTER_1, pointer[0]);
Xil_Out32(MY_REGISTER_2, pointer[1]);
Xil_Out32(MY_REGISTER_3, pointer[2]);
Xil_Out32(MY_REGISTER_4, pointer[3]);
}
备注:
作为函数参数给出的数组被转换为指针。
访问pointer[index]
等同于*(pointer + index)
。
请考虑字节顺序,您可能需要使用 Xil_Out32BE()
或 Xil_Out32LE()
或将索引顺序更改为 pointer
。
如果您的处理器需要,您的字节数组需要在 u32
边界上对齐。无论如何,如果字节地址由于对齐而不能转换为 u32
指针,这就是未定义行为。它可能有效,但仅适用于您的特定目标。