了解指针用法
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
我是一名新手嵌入式系统开发人员,实际上,这是我的第一个问题,如果你们能回答我的问题,如果你们有任何有用的嵌入式系统网站,我将不胜感激。
这段代码中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