Программирую систему на ATmega128 и неважно на СИ или Паскале в WinAvr или МикроПаскале
Но возникает ситуация когда прошу, например, подпрограмме вывести на LCD текст, а она вываливается (перезапускает main); или не выполняются переходы при работе с прерываниями.
Я предполагал что это из-за стека, но нигде не видел в реальных программах даже обращений к стеку. Мои эксперименты со стеком ничего не дали. Как добиться логичности, чтобы переходы были такие, как написаны в программе, а не с глюками? Не могут же разные компиляторы иметь похожие проблемы!
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Программа большая. Писал не я, но отлаживать приходится мне и в сжатые сроки. Хочется все переделать, но пока некогда. Никаких объявлений работы со стеком нет. WinAvr. WinAvr совместно с AvrStudio работать не хочет. несколько раз переустанавливал
Один из примеров ниже: Если в PRFMenu убрать выделенное цветом, то все работает корректно.
Иначе выход из PRFMenu в ProfileMenu нормально, а дальше возврат по ESC не в основное меню, а реально начинается перезагруз заново main.
Выделенное цветом в другом месте и других программах работает. Раз нет возврата по программе, то я и думаю, что может со стеком у меня некорректности. Как поймать?
Ну что я могу вам сказать после очень беглого знакомства с кодом... как и предполагалось, лажа.
Код:
char *buffer="0";
это объявление указателя buffer на строку из 2 байтов, один из которых \0
Код:
itoa (RxBuf[3],buffer,10);
а вот это попытка вывести в память по этому указателю строку, длина которой может быть 5 байтов, не считая \0 и подобных мест просто много. так как buffer - локальная переменная, то память под неё выделяется в стеке, и, если туда пишется больше 2 байт (туда - это по указателю), стек портится...
а вы все кристалл да кристалл...
Добавлено after 3 minutes 21 second: и это я еще 2 минуты код смотрел...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
и чего вы этим добьетесь? сделаете ничуть не лучше! в Си под указатели никогда не выделяется память автоматически - НИКОГДА! вы должны ВСЕГДА самостоятельно выделять ДОСТАТОЧНОЕ количество памяти, на которую ссылается указатель, прежде чем что-либо писать в эту память по этому указателю.
правильно делать примерно так (примерно - это значит, что есть и иные варианты, это не единственный):
Код:
void my_func(int data){ // какая-то функция char str[10]; // локальный массив из 10 байт itoa(data, str, 10); // формируем строку в массиве: int займет максимум 6 байт в массиве - размер массива гарантированно не будет превышен lcd_put_string(str); // выводим строку } // так как str - локальный массив, в этот момент он самоудаляется
Who_are_you? писал(а):
А работу стека определяет сам WinAvr !!!???
а кто её должен определять? по-моему, в Си не предусмотрено возможностей по управлению стеком.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
функция LCD_WriteText хочет не просто указатель на char, а, судя по названию функции, на строку, т.е. просто так передавать ей указатель на одиночный char нельзя - выведет символ и потом будет продолжать выводить мусор, пока не встретит 0.
если вам надо выводить один символ (именно символ, а не байт), следует поступать так
Иногда такая хрень происходила, когда какое-нибудь прерывание разрешено, а обработчика для него не написано. Проверяй регистры настройки прерываний, не разрешил ли чего лишнего. Или сделай обработчик и направь все незанятые векторы туда - хоть поймешь кто из них срабатывает. Еще вариант - вачдог сбрасывает кристалл. Вообще предельно аккуратно с указателями. Ими можно такого наворотить, что понять будет невозможно в принципе что там творится. Еще источник глюков - питание. Схему бы глянуть - может там что-то сбивает контроллер аппаратно.
В первом случае - явно указана строка символов ASCII Во втором как-то кривовато - или адрес начала массива или первый элемент массива, содержащего строку данных типа char. Вероятность иной интерпретации со стороны функции Text_Menu_String определяется ее содержимым.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения