【发布时间】:2021-01-12 18:05:14
【问题描述】:
在过去的一次采访中遇到了这个问题,但没有得到任何反馈。
既然它是一个寄存器,我是否需要在访问寄存器之前禁用中断以防止数据损坏?考虑使用两个缓冲区,32 位和 64 位,并将 32 位缓冲区发送到 read32() 并相应地将其转移到 64 位缓冲区。让我们假设这是 little-endian 架构。
我在 repl.it 上写了一个快速示例代码(输出与寄存器值不匹配)
#include <stdio.h>
#include <string.h>
#include <stdint.h>
void read32(uint64_t *reg, uint32_t *buffer){
memcpy(buffer, reg, 4);
}
int main(void) {
//register
uint64_t reg = 0xAAAAAAAAFFFFFFFF;
//buffers
uint32_t buf_32 = 0;
uint64_t buf_64 = 0;
//read LSW
read32(®, &buf_32);
buf_64 |= buf_32; //add LSW
//read MSW
read32(®+4, &buf_32);
buf_64 |= ((uint64_t)buf_32 << 32);
printf("64 bit register value: 0x%lx\n", buf_64);
return 0;
}
输出:
64 bit register value: 0x1ffffffff
【问题讨论】:
-
我认为您应该省略示例代码,因为您有一个问题,并且代码没有达到您的预期。为什么该代码不起作用的问题是另一个问题。也不清楚该代码如何回答这个问题。如果您不知道只提出问题而不提出自己的解决方案,通常最好,以免它只是关于您的建议的讨论而不是问题的答案。
-
寄存器这个词是什么意思?可以看到面试问题会如何问,但您的代码不同。
标签: arm embedded microcontroller low-level-io