如何在设备驱动程序或寄存器上的特定位置/地址上写入?
我认为我们应该使用无符号指针指向给定寄存器的地址,以便访问寄存器的内容。
#define REG *(unsigned int *)&0xABCBBABA
任何人都能告诉我一些关于硬件级编程的基本知识/先决条件吗?
如果有人对Qualcom的软件配置文件工作有所了解。请告诉我
答案 0 :(得分:2)
是的,除了你的例子中无关的&
运算符之外,基本上就是这样。您只需创建一个指向特定地址的指针,然后您就可以通过该指针进行读取或写入。
当然,它不是便携式的,但是,由于你处于嵌入式领域,这不是一个问题。
您倾向于看到的是包含您指定的各种地址的头文件:
// Bit masks for control, and control/data locations.
#define UART_CTRL_READREADY 0x01
#define UART_CTRL_WRITREADY 0x01
#define UART_CTRL (*((unsigned char *)(0xcafebabe)))
#define UART_DATA_READ (*((unsigned char *)(0xdeadbeef)))
#define UART_DATA_WRIT (*((unsigned char *)(0xca11ab1e)))
(此处volatile
关键字可以派上用场),以便您可以简单地编写代码:
// Wait for data to become available.
while (!(UART_CTRL & UART_CTRL_READREADY))
;
// Get it then clear flag for next byte
databyte = UART_DATA_READ;
UART_CTRL &= ~UART_CTRL_READREADY;
当然,您也可以考虑在功能中隐藏复杂性,以便您可以在不受影响的情况下进行更改。比如:
int getFlag (char *location, unsigned char mask);
void setFlag (char *location, unsifgned char mask, int setFlag);
unsigned char getData (char *location);
虽然可能速度较慢,但如果您需要更改代码,则可以大大简化您的任务。
就像这样的低级编码的指针而言,它与C中的“常规”编码没有什么不同。你可能想要阅读bitwise operators,因为一些低级设备可能需要这个级别的操纵。