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 指针,这就是未定义行为。它可能有效,但仅适用于您的特定目标。