Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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 这是什么意思#定义SOMENAME((uint32\u t*)0x130010f0_C_Pointers - Fatal编程技术网

C 这是什么意思#定义SOMENAME((uint32\u t*)0x130010f0

C 这是什么意思#定义SOMENAME((uint32\u t*)0x130010f0,c,pointers,C,Pointers,我正在尝试理解我的微控制器板上的一些示例C代码。我真的很难理解指针的全部内容。我在这个论坛上读了很多帖子,也读了一些教程,慢慢地我掌握了窍门:)但是。。。 在我的示例代码中有下面一行代码,我无法用我找到的任何信息对其进行解密 #define SOMENAME ((uint32_t *)0x130010f0) 我明白,#define只是用相应的语句替换编译代码中出现的所有SOMENAME(不知道是否正确解释了这一点,但我真的认为我明白了这一点) 现在,我可以想象,这句话的其余部分的意思是: SO

我正在尝试理解我的微控制器板上的一些示例C代码。我真的很难理解指针的全部内容。我在这个论坛上读了很多帖子,也读了一些教程,慢慢地我掌握了窍门:)但是。。。 在我的示例代码中有下面一行代码,我无法用我找到的任何信息对其进行解密

#define SOMENAME ((uint32_t *)0x130010f0)
我明白,
#define
只是用相应的语句替换编译代码中出现的所有SOMENAME(不知道是否正确解释了这一点,但我真的认为我明白了这一点)

现在,我可以想象,这句话的其余部分的意思是:

SOMENAME现在是指向地址0x130010f0的指针,但不是实际变量

这是正确的吗?例如,我可以使用它:
printf(“地址0x130010f0的值:%p”,SOMENAME)
,因为编译器会用
printf(“地址0x130010f0的值:%p”),((uint32_t*)0x130010f0)替换它。
这就给出了存储在该地址的值?如果我想要那个指针的地址,print语句是什么?我不能,对吗?因为指针不是变量,所以没有地址?非常混乱

这个例子非常复杂,这个定义也是指向structs of structs of structs的其他定义的一部分,因此这个“简单”的例子。您可以在下面找到“整体”结构:

#define ROM_API_TREE ((uint32_t *)0x130010f0)
#define BOOTLOADER_POINTER ((bootloader_tree_t *)ROM_API_TREE)

flash_driver_interface_t *FLASH_API_TREE
#define FLASH_API_TREE BOOTLOADER_POINTER->flashDriver

typedef struct BootloaderTree{
 ...
 const flash_driver_interface_t *flashDriver;
} bootloader_tree_t

typedef struct FlashDriverInterface{
 ...
 status_t (*ffr_get_uuid)(flash_config_t *config, uint8_t *uuid);
} flash_driver_interface_t

/*
* I actually want to understand that statement, but as I fail 
* already at the beginning, I posted this question
*/
status_t = FLASH_API_TREE->ffr_get_uuid(config,uuid);

正确的是,
SOMENAME
被预处理器替换为
((uint32\u t*)0x130010f0)
。这将为您提供一个指向
uint32\u t
的指针,该指针的值为
0x130010f0

然后执行此操作时:

printf("value at address 0x130010f0: %p",SOMENAME);
实际上,您将打印指针的值,即0x130010f0,而不是它所指向的值。为此,您需要取消对其的引用,即:

printf("value at address 0x130010f0: %u", *SOMENAME);

但是,这假设0x130010f0是可以解引用和读取的有效地址。这通常仅在实现允许的特定嵌入式环境中才会出现。

这表明微控制器板具有可编程的32位设备

我之所以说“可访问”,是因为这个设备可以是可读的、可写的,或者两者都可以

我用“设备”这个词,因为它可以是各种各样的东西。通常,它只是一个简单存储值的寄存器,但也可能是一个FIFO芯片,在每次读取时返回下一个存储值

假设它是一个寄存器:这些寄存器通常由单独的位或小的位组组成,以表示某个函数。在这种情况下,您将看到类似以下内容的位字段
struct
声明(例如两个16位字段):


正如我所看到的,你基本上可以理解指针背后的很多东西。SOMENAME是一个
而不是一个变量。在我开始编写代码之前,指针通常只是一个变量,它包含一个地址而不是一个值。

printf(“地址0x130010f0:%p处的值”,SOMENAME)
是错误的,因为
%p
需要的是一个值而不是一个地址,而您正在将地址传递给它,所以您所要做的就是使用
*

取消对它的引用 当您写入
(uint32\u t*)0x130010f0
时,您正在括号之间转换writeb类型的地址。

当使用指针变得复杂时,试着记住这个小例子:

int a = 10;
int *p = &a;// declare pointer of type integer. This is valid, adress of an integer variable contains adress of integer variable
int *j; //declare pointer of type integer
j = &a; //correct, because j expects an adress.
*j = &a; //wrong *j expects a value
 
printf("value of p: %p", *p);
printf("adress of p: %p", p); //or &p

我建议你去学习。因为这段代码中有各种潜在的bug/危害。嗨,Lundin,这不是我自己的代码,而是随MCU一起交付的示例代码。我只是想弄明白:)不过还是谢谢你,我会马上看一看。那就更不用担心了。MCU供应商在编写固件方面出了名的差劲。我认为关于哪个MCU厂商拥有世界上最差的程序员,存在着一些持续的竞争。涉及到很多声望。这是NXP的,是吗?他们是坏固件的市场领导者之一,但竞争非常激烈。你怎么知道是NXP的?令人印象深刻:)谢谢你的提示,但我还是个学生,不太擅长编码,我现在就这样离开它,也许当我更熟练的时候,我可以把它做得更好:)但是很高兴知道这样的代码有时不是很好…因为我主要使用NXP部件,我想我以前读过这些代码。。。一些LPC的flash驱动程序/引导加载程序,因为这个例子来自“我用我的微控制器板得到的C代码”,这里可能有一些东西可以读(即函数指针)。好吧,我认为这是有意义的!所以第一个print语句(SOMENAME)给出指针的值,第二个(*SOMENAME)给出指针指向的地址的值?!非常感谢,这很有帮助!谢谢实际上,我面前有一个这样小的例子,但我没有正确地理解它。。。“好吧,我想我现在明白了。”斯特劳姆如果不明白,请尽管问。如果你认为答案有帮助,别忘了投票。我认为具体的代码来自NXP闪存驱动程序到LPC Cortex M。我有一种奇怪的感觉,我以前见过这段代码,当我为这样一部分编写引导加载程序时。
int a = 10;
int *p = &a;// declare pointer of type integer. This is valid, adress of an integer variable contains adress of integer variable
int *j; //declare pointer of type integer
j = &a; //correct, because j expects an adress.
*j = &a; //wrong *j expects a value
 
printf("value of p: %p", *p);
printf("adress of p: %p", p); //or &p