Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解代码的一部分_C_Macros_Microcontroller - Fatal编程技术网

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,它不是一个变量,但它是一个有效的表达式,它包括变量和地址。