【发布时间】:2016-05-12 04:14:26
【问题描述】:
我们正在使用 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)
如果可能的话,谁能帮我解决这个问题。
谢谢:)
【问题讨论】:
-
首先:你确定
mmap的结果不是MAP_FAILED吗?您应该检查mmap返回值。 -
reg = mapGPIO[1][GPIO_OE_REG / 4]-->reg = mapGPIO[j][GPIO_OE_REG / 4] -
你确定
pinGPIO->bank的值吗?
标签: android c android-ndk beagleboneblack beagleboard