硬件编程

时间:2012-07-27 07:18:04

标签: c

如何在设备驱动程序或寄存器上的特定位置/地址上写入?

我认为我们应该使用无符号指针指向给定寄存器的地址,以便访问寄存器的内容。

 #define REG *(unsigned int *)&0xABCBBABA

任何人都能告诉我一些关于硬件级编程的基本知识/先决条件吗?

如果有人对Qualcom的软件配置文件工作有所了解。请告诉我

1 个答案:

答案 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,因为一些低级设备可能需要这个级别的操纵。

相关问题