我们正在使用beaglebone black来获取数据。 Temprature sensor dht11
取自beagle bone black的GPIO。
正常开启和关闭(单向传输)很容易完成但是当涉及到连续数据传输时,我们在android中获得了内存映射问题。
以下是声明部分。
typedef struct {
unsigned int id; /**< FS: ID is the file for the pin */
unsigned char bank; /**< MMAP: GPIO bank determines register */
unsigned int mask; /**< MMAP: Mask determines bit in register */
} GPIOBit_t;
static const uint32_t gpioAddrs[] = { 0x44E07000, 0x4804C000, 0x481AC000,0x481AE000 }; /**< Register Bank addresses */
static uint32_t *mapGPIO[4]; /**< Variable for GPIO memory map */
#define GPIO_OE_REG 0x134 /**< GPIO OE register address */
以下是生成问题的功能。
static void writeGPIOMmapdir(const GPIOBit_t *pinGPIO, const unsigned int value) {
fdGPIO = open("/dev/mem", O_RDWR);
/* mmap() the four GPIO bank registers */
int j;
for (j = 0; j < 4; j++) {
mapGPIO[j] = (uint32_t *) mmap(NULL, getpagesize(),PROT_READ | PROT_WRITE, MAP_SHARED, fdGPIO, gpioAddrs[j]);
unsigned int reg;
reg = mapGPIO[1][GPIO_OE_REG / 4];
if (value) {
reg = reg | pinGPIO->mask;
/* Set the appropriate OE register */
//*****************ISSUE IS IN BELOW LINE*******************
mapGPIO[pinGPIO->bank][GPIO_OE_REG / 4] = reg;
} else {
reg = reg & (0xFFFFFFFF - pinGPIO->mask);
mapGPIO[pinGPIO->bank][GPIO_OE_REG / 4] = reg;
}
}
在logcat中获取内存映射问题。然后整个应用程序重新启动。
01-01 00:19:30.814:A / libc(965):致命信号11(SIGSEGV)位于0x00000134(代码= 1),线程983(线程-56)
如果有可能,任何人都可以帮助我。
谢谢:)
答案 0 :(得分:1)
不应该这样:
reg = mapGPIO[1][GPIO_OE_REG / 4];
Be:
reg = mapGPIO[j][GPIO_OE_REG / 4];