了解指针用法[重复]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

我是一个新手嵌入式系统开发人员,实际上,这是我在这里的第一个问题,如果你们有任何有用的嵌入式系统网站,如果发布它,你们可以回答我的问题。

u8之后的第二个指针在这段代码中意味着什么?

#define DDRA (*(volatile u8*) 0x3A)
c pointers embedded atmega
2个回答
0
投票

u8之后的第二个指针在这段代码中意味着什么?

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

u8*是“指向u8”的类型

(*(volatile u8*) 0x3A)

添加()就像

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

所以0x3A被认为是u8(u8*)的地址和第一个“*”解引用它所以(*((volatile u8*) 0x3A))试图在地址0x3A返回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

2
投票

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

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

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

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

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

int main()
{
    DDRA = 0x2A;
    // etc...
}
© www.soinside.com 2019 - 2024. All rights reserved.