Димон Безпарольный 2 31 июля, 2017 Опубликовано 31 июля, 2017 (изменено) · Жалоба Весьма запутано, постараюсь объяснить. case(OpenTCP): //Открытие TCP { // printf("\rOpen TCP Session\r");// GSM_State_Mashine = ConnMQTT;//Успешно GSM_Mashine_Errors = 0; // int T = GPRSConnect1(TCP, MQTT_BROKER_SERVER, PORT, DEFAULT_TIMEOUT*8, DEFAULT_INTERCHAR_TIMEOUT*5); if(!T) // { //Не успешно printf("\rError TCP Open... Try Again...\r");// int T = GPRSClose();// GSM_Mashine_Errors++;// break; // } // GSM_State_Mashine = ConnMQTT;//Успешно GSM_Mashine_Errors = 0; // printf("\rTCP Session Open\r");// break; // Если ставить GSM_State_Mashine = ConnMQTT после вызова GPRSConnect1, то в переменной GSM_State_Mashine остается старое значение и этот case выполняется вечно. Сама функция GPRSConnect1 и вызываемые ей функции никакого отношения к переменной GSM_State_Mashine не имеет. Причем перед выходом из функции, содержащей этот switch (GSM_State_Mashine) присвоение есть, но за ней (снаружи этой функции) эта переменная имеет старое значение! Пока вышел из положения присваивая значение GSM_State_Mashine = ConnMQTT; до вызова функции. Так работает. После вызова - нет. Что ж за глюк такой? Переменная объявлена глобальной volatile unsigned int GSM_State_Mashine = 0;// Изменено 31 июля, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexey123_45 0 31 июля, 2017 Опубликовано 31 июля, 2017 (изменено) · Жалоба А если в этом case поставить точку останова и пойти по шагам попадете на эту строчку, после вызова функции? Изменено 31 июля, 2017 пользователем alexey123_45 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба А если в этом case поставить точку останова и пойти по шагам попадете на эту строчку, после вызова функции? Да. Все тоже самое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба Весьма запутано, постараюсь объяснить. ... int T = GPRSConnect1(TCP, MQTT_BROKER_SERVER, PORT, DEFAULT_TIMEOUT*8, DEFAULT_INTERCHAR_TIMEOUT*5); .. поставьте в функцию GPRSConnect1 сразу ретурн. если глюкало исчезнет - ищите а) по корректности передаваемых параметров в функцию б) по потрохам самой функции. удачи вам (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба Напрашивается поставить на эту переменную watchpoint и смотреть, где она свернула не туда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба int T = GPRSConnect1(TCP, MQTT_BROKER_SERVER, PORT, DEFAULT_TIMEOUT*8, DEFAULT_INTERCHAR_TIMEOUT*5); if(!T) // Ведь Т - это число... А if(!T) подразумевает, что в скобках будет булево выражение - истина или ложь... А что такое !T по Вашему??? Даже если компилятор воспримет это как битовую инверсию, то это все равно будет число, но не истина или ложь... Для примера вместо if(!T) сделайте printf( вот этого !T в виде набора битов... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба Ведь Т - это число... А if(!T) подразумевает, что в скобках будет булево выражение - истина или ложь... А что такое !T по Вашему??? Даже если компилятор воспримет это как битовую инверсию, то это все равно будет число, но не истина или ложь... Для примера вместо if(!T) сделайте printf( вот этого !T в виде набора битов... Не понимаю. Весь Paho MQTT в этих if(!T) и работает. И только в одном месте глючит. Проверил. Баз этого if(!T), просто с вызовом тоже глючит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба А что такое !T по Вашему??? Вообще-то !T - это такой же точно int, как и T: The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. Димон Безпарольный, поищите undefined behavior в функции GPRSConnect1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 1 августа, 2017 Опубликовано 1 августа, 2017 · Жалоба Ведь Т - это число... А if(!T) подразумевает, что в скобках будет булево выражение - истина или ложь... А что такое !T по Вашему??? Даже если компилятор воспримет это как битовую инверсию, то это все равно будет число, но не истина или ложь... Для примера вместо if(!T) сделайте printf( вот этого !T в виде набора битов... Если вы плохо знаете Си, то лучше не пишите в темах про Си. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 1 августа, 2017 Опубликовано 1 августа, 2017 · Жалоба А где здесь ARM? Треду именно что место в темах про C. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 1 августа, 2017 Опубликовано 1 августа, 2017 · Жалоба Ведь Т - это число... А if(!T) подразумевает, что в скобках будет булево выражение - истина или ложь... А что такое !T по Вашему??? Даже если компилятор воспримет это как битовую инверсию, то это все равно будет число, но не истина или ложь... Для примера вместо if(!T) сделайте printf( вот этого !T в виде набора битов... Это тяжелое наследство "асемблерности" C. В нём нет булева типа. Поэтому всё целочисленнуказательное что 0 - считается ложным, а все остальное - истинным. Так и живем. :) ----------- А по сабжу - чудес не бывает. Либо UB, либо битый указатель, либо выход индекса за диапазон, либо стек начал наваливаться на область памяти статических переменных. Ватчпойнты и последовательное выбрасывание кода, помогут разобраться, т.к. в приведенном участке кода ничего криминального не видно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 1 августа, 2017 Опубликовано 1 августа, 2017 · Жалоба Либо UB, либо битый указатель, либо выход индекса за диапазон, либо стек начал наваливаться на область памяти статических переменных. Похоже что именно так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 1 августа, 2017 Опубликовано 1 августа, 2017 · Жалоба берите map-файл проекта с расположением переменных в памяти. И посмотрите, какая переменная в памяти расположена ДО вашей сбойной GSM_State_Mashine в обоих случаях: - когда "всё работает" - когда "сбоит" там, где сбоит - смотрите название переменной и копайте причины её поломки. Возможно неверное приведение типов при работе с указателями или может где-то ещё пораньше в памяти массив лежит, с которым неверно работаете. По крайней мере такой анализ map-файла достаточно быстро проводится, и позволяет быстро находить поверхностные ошибки. также для того варианта, когда "всё работает" - посмотрите, куда переменная переехала в памяти, предшествующая GSM_State_Mashine - скорее всего, она затирает какие-то несущественные данные, и поэтому вы не замечаете проблем. Так называемый плавающий баг - как правило, он именно вашим описанием и характеризуется, когда от простой перестановки строк кода меняется поведение программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 1 августа, 2017 Опубликовано 1 августа, 2017 · Жалоба Похоже что именно так. Кстати может быть бага в компиляторе. Если gcc, то имеет смысл его обновить до старшего минора в используемой ветке. Или наоборот, попробовать предыдущий мажор. Правда с теми же симптомами может быть и UB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 1 августа, 2017 Опубликовано 1 августа, 2017 · Жалоба Кстати может быть бага в компиляторе. Если gcc, то имеет смысл его обновить до старшего минора в используемой ветке. Или наоборот, попробовать предыдущий мажор. Правда с теми же симптомами может быть и UB. Нет. Keil 5.17 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться