gpt4 book ai didi

c - 在 beaglebone black 上出现段错误

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

我是 beaglebone 和 Linux 的新手,所以对于一个项目,我必须使用地址来控制 BBB 上的用户,并通过确保所有 GPIO 端口都能够通过此设置来确保将来使用的功能。但是当我运行它来打开和关闭用户 LED 时,我遇到了段错误,我不知道为什么或者我需要做什么来解决这个问题。我需要包含什么,或者我正在做的事情是不行的,如果是的话我应该做什么?

#include <string.h>
#include <stdint.h>
#include <stdio.h>

typedef struct {
volatile uint32_t REVISION; //Address offset: 0x00
volatile uint32_t rangeA[3]; //Address offset: 0x04-0x0C
volatile uint32_t SYSCONFIG; //Address offset: 0x10
volatile uint32_t rangeB[3]; //Address offset: 0x14-0x1C
volatile uint32_t EOI; //Address offset: 0x20
volatile uint32_t IRQSTATUS_RAW_0; //Address offset: 0x24
volatile uint32_t IRQSTATUS_RAW_1; //Address offset: 0x28
volatile uint32_t IRQSTATUS_0; //Address offset: 0x2C
volatile uint32_t IRQSTATUS_1; //Address offset: 0x30
volatile uint32_t IRQSTATUS_SET_0; //Address offset: 0x34
volatile uint32_t IRQSTATUS_SET_1; //Address offset: 0x38
volatile uint32_t IRQSTATUS_CLR_0; //Address offset: 0x3C
volatile uint32_t IRQSTATUS_CLR_1; //Address offset: 0x40
volatile uint32_t IRQWAKEN_0 ; //Address offset: 0x44
volatile uint32_t IRQWAKEN_1; //Address offset: 0x48
volatile uint32_t rangeC[26]; //Address offset: 0x4C-0x110
volatile uint32_t SYSSTATUS; //Address offset: 0x114
volatile uint32_t rangeD[6]; //Address offset: 0x118-0x12C
volatile uint32_t CTRL; //Address offset: 0x130
volatile uint32_t OE; //Address offset: 0x134
volatile uint32_t DATAIN; //Address offset: 0x138
volatile uint32_t DATAOUT; //Address offset: 0x13C
volatile uint32_t LEVELDETECT0; //Address offset: 0x140
volatile uint32_t LEVELDETECT1; //Address offset: 0x144
volatile uint32_t RISINGDETEDT; //Address offset: 0x148
volatile uint32_t FALLINGDETECT; //Address offset: 0x14C
volatile uint32_t DEBOUNCENABLE; //Address offset: 0x150
volatile uint32_t DEBOUNCINGTIME; //Address offset: 0x154
volatile uint32_t rangeE[14]; //Address offset: 0x158-0x18C
volatile uint32_t CLEARDATAOUT; //Address offset: 0x190
volatile uint32_t SETDATAOUT; //Address offset: 0x194
} GPIO_TypeDef;

#define GPIO0 ((GPIO_TypeDef *) 0x44E07000)
#define GPIO1 ((GPIO_TypeDef *) 0x4804C000)
#define GPIO2 ((GPIO_TypeDef *) 0x481AC000)
#define GPIO3 ((GPIO_TypeDef *) 0x481AE000)

int main() //testing if this would work
{
GPIO1->OE &= ~(1UL<<21); // set bits to output eneble
while(1)
{
GPIO1->DATAOUT |= 1UL<<21;
int delay = 0;
while(delay < 15000) // just really quick crappy delay
delay++;
GPIO1->DATAOUT &= ~(1UL<<21);
printf("Blink!!\n"); //test to see if it works
}
return 0;
}

最佳答案

您分配的地址似乎是物理地址或总线地址;您的程序将使用虚拟地址或程序地址运行。您机器上的内核会构造翻译页面,以便您的程序可以保留内核可以动态分配的内存地址的规范化 View 。

您需要将寄存器的设备空间映射(使用 mmap())到您的程序中,并分配您的结构以指向它们。

您最终应该得到如下所示的代码:

GPIO_TypeDef  *g0, *g1, ... ;
...
g0 = mmap(0, sizeof *g0,..., fd, 0);
...
g0->DataOut = 3;
...

ps:从风格上讲,前置 _TypeDef 违背了 typedef 机制的目的,即创建有意义的名称和自记录程序。 _t 的愚蠢使用只是好一点,因为它不会浪费那么多击键。请记住,有些程序员有视觉障碍,每次遇到这种情况时都必须听辅助设备说“下划线大写 T y p e 大写 D e f”!

关于c - 在 beaglebone black 上出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55268146/

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