OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5900|回复: 3

在freertos上跑Mqtt总是断连

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-10-17
在线时间
1 小时
发表于 2018-10-17 22:56:39 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 MrBigTree 于 2018-10-17 23:02 编辑

我在zynq-7000上跑freertos (基于lwip),我起了一个任务建立mqtt连接,又在其中起了另一个任务去初始化一个GPIO的中断。现在遇到的问题是,只要我启动这个中断,mqtt的连接就总会断,大概5秒之内吧;而如果不起中断,则连接很稳定。我在中断中只是每10ms发送一个信号量给其他任务。
建立mqtt连接的代码如下:[mw_shl_code=c,true]void mqtt_application_thread() {
    xil_printf("Enter into mqtt_application_thread...\r\n");
    mqtt_client_t *client = mqtt_client_new();
    if (client != NULL) {
        mqtt_example_do_connect(client, client_id_suffix);
    }

    xBinarySemaphore = xSemaphoreCreateBinary();

    if (NULL != xBinarySemaphore) {

        //Init Gpio Interrupt
        xTaskCreate(Task_Gpio_Init, "Gpio_Init", 1024, NULL,
        DEFAULT_THREAD_PRIO, NULL);
    }

    for (;;) {
        xSemaphoreTake(xBinarySemaphore, portMAX_DELAY);

        xil_printf("In infinite mqtt_application_thread loop...\r\n");

        u8_t state = mqtt_client_is_connected(client);
        xil_printf("Current mqtt connection state is %d...\r\n", state);
        //if mqtt disconnected, try to reconnect
        if (example_publish(client, mqtt_pub_request_cb) != 1) {
            free(client);
            client = NULL;
            client = mqtt_client_new();
            client_id_suffix++;
            if (client != NULL) {
                mqtt_example_do_connect(client, client_id_suffix);
            }
        }
    }
}[/mw_shl_code]初始化中断的代码如下:
[mw_shl_code=c,true]int InterruptInitialize(u16 DeviceId, XGpio * GpioInstancePtr) {
    XScuGic_Config * IntcConfigPtr;
    int status;

    // Interrupt controller initialization
    IntcConfigPtr = XScuGic_LookupConfig(DeviceId);
    if ((XScuGic_Config *) NULL == IntcConfigPtr)
        return XST_FAILURE;

    status = XScuGic_CfgInitialize(&InterruptInst, IntcConfigPtr,
            IntcConfigPtr->CpuBaseAddress);
    if (status != XST_SUCCESS)
        return XST_FAILURE;

    // Call interrupt setup function
    status = InterruptSystemSetup(&InterruptInst);
    if (status != XST_SUCCESS)
        return XST_FAILURE;

    // Register GPIO interrupt handler
    status = XScuGic_Connect(&InterruptInst, INTC_GPIO_INT_ID,
            (Xil_ExceptionHandler) InterruptHandler, (void*) GpioInstancePtr);
    if (status != XST_SUCCESS)
        return XST_FAILURE;

    // Enable GPIO interrupts
    XGpio_InterruptEnable(GpioInstancePtr, GPIO_INT_MASK);
    XGpio_InterruptGlobalEnable(GpioInstancePtr);

    // Enable GPIO interrupts in the controller
    XScuGic_Enable(&InterruptInst, INTC_GPIO_INT_ID);

    return XST_SUCCESS;
}[/mw_shl_code]

中断处理函数如下:   
[mw_shl_code=c,true]void InterruptHandler(void * InstancePtr) {
    BaseType_t xHigherPriorityTaskWoken;

    xHigherPriorityTaskWoken = pdFALSE;

    // Acknowledge GPIO interrupts
    (void) XGpio_InterruptClear(&GpioInst, GPIO_INT_MASK);

    // Enable GPIO interrupts
    XGpio_InterruptEnable(&GpioInst, GPIO_INT_MASK);

    xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken );
    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}[/mw_shl_code]

另一个奇怪的问题是,当我试图在mqtt的线程中重连时,通过mqtt_client_is_connected(client)读回来的连接状态永远是已连接,即使服务端都显示断开了也不会变。麻烦各位大神帮忙看看,谢谢。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-10-18 02:14:16 | 显示全部楼层
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-10-17
在线时间
1 小时
 楼主| 发表于 2018-10-19 11:02:22 | 显示全部楼层
没有人可以帮忙吗?
回复

使用道具 举报

22

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2014-7-26
在线时间
66 小时
发表于 2018-12-31 21:58:49 | 显示全部楼层
我还没移植成功的,我下载了paho.mqtt.embedded-c-master,复制进FreeRTOS ,但发现需要//#include "FreeRTOS_IP.h"
//#include "FreeRTOS_Sockets.h"支持。我想用AT去实现。群里有案例,但我想自己移植试试,可以对代码更有理解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-26 06:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表