C 理解代码的一部分
这是一部分微控制器代码,我不懂C 理解代码的一部分,c,macros,microcontroller,C,Macros,Microcontroller,这是一部分微控制器代码,我不懂 #define GPIO_PORTF_DIR_R (*((volatile unsigned long *)0x40025400)) int main (void){ GPIO_PORTF_DIR_R = 0x0E; ...} 据我所知,GPIO_PORTF_DIR_R不是一个可值,并且(*(volatile unsigned long*)0x40025400))是指针指向的地址的内容。 那么如何使用GPIO_PORTF_DIR_R作为
#define GPIO_PORTF_DIR_R (*((volatile unsigned long *)0x40025400))
int main (void){
GPIO_PORTF_DIR_R = 0x0E;
...}
据我所知,GPIO_PORTF_DIR_R不是一个可值,并且(*(volatile unsigned long*)0x40025400))是指针指向的地址的内容。
那么如何使用GPIO_PORTF_DIR_R作为变量呢。这里发生了什么。#define
声明了一个预处理器宏。这意味着在编译之前,GPIO\u PORTF\u DIR\u R
将用宏的内容替换代码中的任何地方。因此,您实际编译的代码将
(*((volatile unsigned long *)0x40025400)) = 0x0E;
这意味着将0x0E
写入该地址
如果希望通过名称引用某些(复杂的)数值,通常会使用预处理器宏。这允许您在必要时集中更改该值,但在代码中有一个有意义的名称,而不必为其指定变量。\define
声明一个预处理器宏。这意味着在编译之前,GPIO\u PORTF\u DIR\u R
将用宏的内容替换代码中的任何地方。因此,您实际编译的代码将
(*((volatile unsigned long *)0x40025400)) = 0x0E;
这意味着将0x0E
写入该地址
如果希望通过名称引用某些(复杂的)数值,通常会使用预处理器宏。这允许您在必要时集中更改该值,但在代码中有一个有意义的名称,而不必为其设置变量。常量值0x40025400被用作内存地址。似乎在您的平台(微控制器)上,该地址是一个 如果代码使其更具可读性,则与此等效:
// pointer to memory address 0x40025400
volatile unsigned long *p = 0x40025400;
// set that value in memory
*p = 0x0E;
常量值0x40025400正在用作内存地址。似乎在您的平台(微控制器)上,该地址是一个 如果代码使其更具可读性,则与此等效:
// pointer to memory address 0x40025400
volatile unsigned long *p = 0x40025400;
// set that value in memory
*p = 0x0E;
tl;赋值不是给变量,而是给内存中的特定位置 这里的宏可以被认为只是为了使用而被替换
#define GPIO_PORTF_DIR_R (*((volatile unsigned long *)0x40025400))
int main (void) {
GPIO_PORTF_DIR_R = 0x0E;
...
可以改写为
int main (void) {
(*((volatile unsigned long *)0x40025400)) = 0x0E;
...
它只是解引用内存地址0x40025400,并给它赋值0x0E。tl;赋值不是给变量,而是给内存中的特定位置 这里的宏可以被认为只是为了使用而被替换
#define GPIO_PORTF_DIR_R (*((volatile unsigned long *)0x40025400))
int main (void) {
GPIO_PORTF_DIR_R = 0x0E;
...
可以改写为
int main (void) {
(*((volatile unsigned long *)0x40025400)) = 0x0E;
...
这只是取消对内存地址的引用,并为其赋值0x0E.,这看起来像是内存映射I/O寄存器的典型定义。请注意定义中包含的指针解引用运算符。这看起来像是内存映射I/O寄存器的典型定义。请注意定义中包含的指针解引用运算符。但是(*(volatile unsigned long*)0x40025400)不是变量,它只是地址的内容。@zud不,它不是变量,它是静态地址。但它是一个表达式,最好放在一个集中的位置。@zud,它不是变量,但它是有效的,包括变量和地址。但是(*(volatile unsigned long*)0x40025400)不是变量,它只是地址的内容。@zud不,它不是变量,它是静态地址。但它是一个表达式,最好放在一个集中的位置。@zud,它不是一个变量,但它是一个有效的表达式,它包括变量和地址。