получить дефект сегментации на биглебоне черный - PullRequest
0 голосов
/ 20 марта 2019

я новичок в beaglebone и linux, так что для проекта им приходится управлять пользователем, управляемым на BBB, используя адреса, а также иметь функцию для будущего использования, обеспечивая возможность установки всех портов gpio через это,но когда я запускаю его, чтобы просто включить и выключить светодиоды пользователя, я получаю ошибку сегментации, и я не знаю, почему или что мне нужно сделать, чтобы это исправить.что мне нужно включить или что я делаю, просто не ходи и если да, что мне делать?

#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;
}

1 Ответ

0 голосов
/ 21 марта 2019

Адреса, которые вы назначили, выглядят как физические или шинные адреса; Ваша программа будет работать с виртуальными или программными адресами. Ядро на вашей машине создает страницы перевода, чтобы ваша программа могла поддерживать нормализованный просмотр адресов памяти, которые ядро ​​может назначать динамически.

Вам необходимо отобразить (используя mmap ()) пространство регистров в вашей программе и назначить структуру, указывающую на них.

Вы должны получить код, который выглядит примерно так:

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

ps: стилистически, предварение _TypeDef побеждает назначение механизма typedef, который заключается в создании значимых имен и самодокументируемых программ. Идиотическое использование _t только немного лучше, потому что оно не тратит так много нажатий клавиш. Помните, что у некоторых программистов есть проблемы со зрением, и они должны слушать вспомогательное устройство, которое говорит «подчеркивать прописными буквами T y pe прописными буквами D e f» каждый раз, когда они сталкиваются с этим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...