了解指针用法

时间:2019-04-21 10:01:30

标签: c pointers embedded atmega

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

u8之后的第二个指针在此代码中是什么意思?

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

2 个答案:

答案 0 :(得分:2)

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

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

需要使用volatile关键字来防止编译器优化对作为硬件位置的寄存器的引用。

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

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

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

答案 1 :(得分:0)

  

u8之后的第二个指针在此代码中是什么意思?

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

u8*是类型“指向 u8 的指针”

(*(volatile u8*) 0x3A)

添加()就像

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

因此0x3A被视为 u8 u8*)的地址,并且第一个“ *”取消引用它,因此(*((volatile u8*) 0x3A))尝试返回<在地址0x3A处的em> u8 (如果0x3A不是有效地址,则会产生分段错误),或者在分配的左侧尝试在地址0x3A处写

例如,将 u8 定义为 char ,然后将0x3A替换为全局var的地址:

#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