在raspberry pi上一起使用Pubnub Posix C SDK和bcm2835 C库时的内存问题

时间:2016-11-07 22:45:56

标签: c raspberry-pi pubnub spi

有没有人试图在树莓派上一起使用bcm2835pubnub posix c api?我能够让他们单独工作,但我一起有记忆问题。我正在使用bcm2835进行spi通信。这是我的代码:

这在main中被调用:

void inline setup() {
    error = NO_ERROR;
    run = 1;
    spi_setup();
    pb_setup();
}

当我首先调用spi_setup()然后调用pb_setup()时,spi_setup()完成正常,但是pb_setup()在pubnub_alloc()上被卡住了,但是当我以相反的顺序调用它们时,我立即得到一个段错误从我的main函数调用setup()。我知道这是某种内存问题,但不知道它可能是什么。我知道pubnub_alloc()为用于订阅或发布到通道的上下文动态分配内存。这可能是问题吗?

pb_setup:

    void pb_setup() {
#ifdef DEBUG
    printf("Starting pubnub setup\n");
#endif
    sub_ctx = pubnub_alloc();
    pub_ctx = pubnub_alloc();

    if ((NULL == sub_ctx) && (NULL != pub_ctx)) {
        pubnub_free(pub_ctx);
        error = PUBNUB_INIT_ERROR;
        return;
    } else if ((NULL == pub_ctx) && (NULL != sub_ctx)) {
        pubnub_free(sub_ctx);
        error = PUBNUB_INIT_ERROR;
        return;
    } else if ((NULL == pub_ctx) && (NULL == sub_ctx)) {
        error = PUBNUB_INIT_ERROR;
        return;
    }

    pubnub_init(sub_ctx, PUBNUB_PUB_KEY, PUBNUB_SUB_KEY);
    pubnub_init(pub_ctx, PUBNUB_PUB_KEY, PUBNUB_SUB_KEY);

    pthread_mutex_init(&pb_pubstat.mut, NULL);
    pthread_mutex_init(&pb_substat.mut, NULL);
    pthread_cond_init(&pb_pubstat.cond, NULL);
    pthread_cond_init(&pb_substat.cond, NULL);

    pubnub_register_callback(pub_ctx, pb_pub_callback, &pb_pubstat);
    pubnub_register_callback(sub_ctx, pb_sub_callback, &pb_substat);

    pubnub_set_transaction_timeout(pub_ctx, 2000);
    pubnub_set_transaction_timeout(sub_ctx, 900000);

    pb_subscribe();
#ifdef DEBUG
    printf("pubnub setup successful");
#endif
}

spi_setup:

void spi_setup() {
#ifdef DEBUG
    printf("Starting spi setup\n");
#endif
    if (!bcm2835_init()) {
        error = SPI_INIT_ERROR;
        return;
    }

    if (!bcm2835_spi_begin()) {
        error = SPI_INIT_ERROR;
        return;
    }

    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_256);
#ifdef DEBUG
    printf("spi setup successful\n");
#endif
}

0 个答案:

没有答案