了解指针用法

Understanding pointer usage

我是一名新手嵌入式系统开发人员,实际上,这是我的第一个问题,如果你们能回答我的问题,如果你们有任何有用的嵌入式系统网站,我将不胜感激。

这段代码中u8后的第二个指针是什么意思?

#define DDRA (*(volatile u8*) 0x3A)

#define DDRA (*(volatile u8*) 0x3A)

使用 (volatile u8*)0x3A 转换为指向 8 位值的指针,然后第一个 * 引用该指针。它正在访问内存映射端口控制寄存器。

需要 volatile 关键字来防止编译器优化掉对寄存器的引用,这是一个硬件位置。

一个示例用法是在微控制器中设置端口 A 数据方向时:

#define DDRA (*(volatile char*) 0x3A)

int main()
{
    DDRA = 0x2A;
    // etc...
}

What does the second pointer after u8 mean in this code?

我想你说的是第二个“*”

u8*是类型"pointer to an u8"

(*(volatile u8*) 0x3A)

加()就好

(*((volatile u8*) 0x3A))

所以 0x3A 被认为是 u8 (u8*) 的地址,第一个“*”取消引用它所以 (*((volatile u8*) 0x3A))尝试 return 地址 0x3A 处的 u8 (如果 0x3A 不是有效地址,它将产生分段错误)或赋值的左侧尝试写入地址 0x3A

例如将 u8 定义为 char 并将 0x3A 替换为全局变量的地址:

#include <stdio.h>

#define DDRA (*(volatile u8 *) &A)

typedef char u8;

int A = 'a';

int main()
{
  printf("%c\n", DDRA);
  DDRA = 'b';
  printf("%c\n", DDRA);

  return 0;
}

编译与执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
a
b