gpt4 book ai didi

c - 编辑:结构代码在Codelite中获取无效的内存引用,但在STM32工作台中未获取

转载 作者:行者123 更新时间:2023-11-30 19:00:17 24 4
gpt4 key购买 nike

我开始使用STM32系统工作台开始裸机C编程,
我观察到以下结构

typedef struct
{
uint32_t MODER;
}GPIO_RegDef_t;


#define GPIOA ((GPIO_RegDef_t*)0x40020000U)
GPIOA-> MODER = 3;


上面的代码可以在STM32工作台中编译并完美运行

不仅仅是出于好奇,我打开了lite并进行了编译(gcc编译器),当我运行时,控制台应用程序打开了,但是我放置在上面代码之后的printf并没有显示任何内容,因此我去 https://rextester.com/l/c_online_compiler_gcc编译并运行了以下结构,我得到无效的参考。纳闷为什么?

我用Codelite编写的代码

#include <stdio.h>

#define AHB1PERIPH_BASEADDR 0x40020000
typedef struct
{
int value;
}SomeStruct;

#define GPIOA ((SomeStruct* )AHB1PERIPH_BASEADDR)

int main(int argc, char **argv)
{
GPIOA->value =3;
printf("GPIOA value =%d \n",GPIOA->value);
return 0;
}


*我已编辑问题以使问题更准确,请参考以下评论以获取答案。对不起,造成误导。

最佳答案

该代码是特定于平台的,因此您不能期望它在某些完全不同的平台上正确运行。该代码访问您为其重新编译的系统上不存在的微控制器上的GPIO硬件,并且肯定不在同一地址或相同的外围寄存器组织中。

这不是C代码问题,编译器将代码视为有效代码,并且可以正确编译。您运行的代码不是C代码,而是从C代码编译的机器代码。

在这种情况下,代码访问的地址在您正在其上运行的平台上无效,并且操作系统会捕获该错误,终止进程并报告。您看不到以下printf输出,因为该过程在此之前终止。即使地址不是无效的,或者代码是在没有内存保护或无效地址检测的硬件上运行的,也不会产生任何有意义的作用,因为该地址特定于STM32上的GPIO寄存器。

同样,如果您为STM32编写的代码访问的地址在该平台上无效,它也会调用异常处理程序。异常处理程序的工作通常是由您定义的(因为没有操作系统),默认值通常是不执行任何操作的无限循环,等待看门狗或外部复位或关机后再打开。

C是系统级编程语言,因此不会阻止您直接访问系统。但是,在这种情况下,您正在运行的操作系统正在自我保护。那不是语言的功能。

关于c - 编辑:结构代码在Codelite中获取无效的内存引用,但在STM32工作台中未获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60240982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com