如何解决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
指针,则这是未定义行为。它可能有效,但仅适用于您的特定目标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。