Vitis:将 16 字节变量存储到 4 个 32 位寄存器中

问题描述

我有一个 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 代码输入测试平台:

key

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...