Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Еще одна проблема с CASE
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Димон Безпарольный
Пытался вынести кусок кода из CASE в отдельную функцию:


Код
void MQTT_Connect(void)                            //
{                                                //
    int rc;                                        //
    unsigned char buf[200];                        //
    unsigned char readbuf[100];                    //
    MQTTClient(&c, 20000, buf, 200, readbuf, 100);
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.willFlag = 0;                            //Данные прописаны в MQTT.h
    data.MQTTVersion = MQTTVersioN;                //
    data.clientID.cstring = MQTTClientID;        //
    data.username.cstring = MQTTUsername;        //
    data.password.cstring = MQTTPassword;        //
    data.keepAliveInterval = MQTTKeepAliveInterval;//
    data.cleansession = MQTTCleansession;        //
    printf("\rConnect to MQTT Brocker\r");        //
    if ( (rc = MQTTConnect(&c, &data)) != 0)    //
        {                                          //Не успешно
            printf("\rClient connection with IBM MQTT broker failed with Error Code %d\r", (int)rc);
            switch (rc)                            //
                {                                //
                    case C_REFUSED_PROT_V:        //
                        {                        //
                            printf("Connection Refused, unacceptable protocol version\r");
                            break;                //
                        }                        //
                    case C_REFUSED_ID:            //
                        {                        //
                            printf("Connection Refused, identifier rejected\r");
                            break;                //
                        }                        //
                    case C_REFUSED_SERVER:        //
                        {                        //
                            printf("Connection Refused, Server unavailable\r");
                            break;                //
                        }                        //
                    case C_REFUSED_UID_PWD:        //
                        {                        //
                            printf("Connection Refused, bad user name or password\r");
                            break;                //
                        }                        //
                    case C_REFUSED_UNAUTHORIZED://
                        {                        //
                            printf("Connection Refused, not authorized\r");
                            break;                //
                        }                        //
                }                                 //
            printf("\rMQTT Error.. Try again... %d\r", GSM_Mashine_Errors++);//    
            return;                                //
        }                                         //
    else                                         //Успешно
        {                                         //
            printf("\rConnected with IBM MQTT broker\r");
//Подписка
            char* Topic = MQTTSubscribeTopic;    //
            printf("\rSubscribing topic: %s\r", Topic);
            if( MQTTSubscribe(&c, Topic, QOS0, messageArrived) < 0)
                {                                //
                    printf("\rSubscribe with IBM MQTT broker failed\r");
                }                                 //
            else                                 //
                {                                //
                    printf("\rSubscribed to topic: %s\r", Topic);
                }                                //
            GSM_Mashine_Errors=0;                //
            GSM_State_Mashine = PubMQTT;        //Успешно
        }                                         //else if( (rc = MQTTConnect(&c, &data)) != 0)
                    
        
}



Код выполняется, но в следующем шаге все виснет на вызове int T1 = MQTTPublish(&c,(char*)"iot-2/evt/status/fmt/json", &MQTT_msg);
Ковыряя эту функцию обнаружил что выхода из функции
Код
int MQTTSerialize_publish(unsigned char* buf, int buflen, unsigned char dup, int qos, unsigned char retained, unsigned short packetid,
        MQTTString topicName, unsigned char* payload, int payloadlen)


в нужное место не происходит. Т.е. выполнение доходит до return rc; в любом случае, но в вызывающий процесс не возвращается. Но если в теле этой функции блокировать следующий код:

Код
/*        
    writeMQTTString(&ptr, topicName);
        
        
    if (qos > 0)
        writeInt(&ptr, packetid);
    
    memcpy(ptr, payload, payloadlen);
*/


То выход из функции исправно происходит. Учитывая что код рабочий (на 99%) на ум приходит только нехватка памяти. Что в этом случае делать?
HardEgor
Цитата(Димон Безпарольный @ Aug 7 2017, 01:33) *
То выход из функции исправно происходит. Учитывая что код рабочий (на 99%) на ум приходит только нехватка памяти. Что в этом случае делать?

А причем здесь case?
Что делать? Есть два варианта:
- не пользоваться функцией MQTTSerialize_publish
- исправить код функции, чтобы memcpy не затирал память переменной rc .
Димон Безпарольный
Цитата(HardEgor @ Aug 6 2017, 22:41) *
А причем здесь case?
Что делать? Есть два варианта:
- не пользоваться функцией MQTTSerialize_publish
- исправить код функции, чтобы memcpy не затирал память переменной rc .

При том, что если код находится в CASE все исправно работает. Я может быть и не прав, дело не в этом, но найти в чем пока не могу. Не пользоваться функцией не могу, а исправить рабочий код... тоже не могу.

Можно было бы и так оставить, но боюсь что в будущем этот невидимый косяк мне аукнется.
HardEgor
Цитата(Димон Безпарольный @ Aug 7 2017, 01:44) *
Можно было бы и так оставить, но боюсь что в будущем этот невидимый косяк мне аукнется.

Угу, где-то в другом месте затирает, пока не критичном....
Alechek
Цитата(Димон Безпарольный @ Aug 6 2017, 23:33) *
Пытался вынести кусок кода из CASE в отдельную функцию:

Код
void MQTT_Connect(void)                            //
{                                                //
    int rc;                                        //
    unsigned char buf[200];                        //
    unsigned char readbuf[100];                    //


Опть.... Это правда так надо, динамически выделять такие объемы из стека?
Глядя на такое, вопрос по нехватке памяти должен отпасть сам.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.