Proteus - Как отладить недопустимый код операции?

При запуске программы, скомпилированной в Arduino IDE 1.8.5, а затем с использованием файла .ELF внутри LabCenter Proteus 8.0, для Arduino Nano ATMEL Mega 328P, для кода, связанного с использованием библиотеки SoftwareSerial.h, следовательно, включающей несколько циклов, без взаимодействия с пользователем, я получаю следующую ошибку:

Invalid opcode 0x0024 at PC=0x0096

Теперь я совершенно потерялся. Согласно Руководству по набору инструкций AVR, такой код операции должен (не уверен в этом?) быть Возвращен из Прерывания в строке программы (?) № 150 = 0x096. Полный код содержит 779 строк плюс несколько библиотечных вызовов, а строка 150 оказывается непосредственно перед функцией loop () (?), Которая никогда не должна повторяться, будучи просто объявлением.

Итак, как мне следует отлаживать эту ошибку? Очевидно, я не прошу решить проблему за меня, но как мне приступить к ее отладке и найти реальную ошибку?

Мне не удалось найти в Proteus инструмент для "Остановки отладки в случае ошибки".

Я не смог изолировать ошибку простым способом, чтобы поделиться ею. Это должно быть как-то связано с прерываниями, используемыми библиотекой SoftwareSerial.h, потому что при некоторых модификациях программы код зависает при возврате прерывания. Я работаю над этим, но на самом деле продвигаюсь очень медленно.

Связанный с этим вопрос № 1.

, 👍2

Обсуждение

PC=0x96 " не имеет никакого отношения к каким-либо строкам в вашем исходном коде. Так что нет, нет смысла смотреть на строку 150. Строка 150 здесь совершенно неуместна. И где именно в руководстве вы прочитали, что "0x0024" - это " RETI?, @AnT

Я не понимаю ситуации для отладки этого..., @Brethlosze

Где программа? Подобные ошибки могут быть легко вызваны внесистемной модификацией локального массива. Повреждение стека разбивает обратный адрес сохраненной функции, заставляя ее "возвращаться" в совершенно неправильное место (например, " 0x96`), попадая в "недопустимые инструкции", хранящиеся там., @AnT

`PC=0x96 " означает, что счетчик программ указывает на это место в памяти и пытается выполнить инструкцию в этом месте ..... на последнем рисунке показан код в 0x1ab4, @jsotola

У меня та же проблема. Не могли бы вы сказать мне, пожалуйста, решили ли вы проблему и как?, @Rami Ma

@RamiMa Я совершенно забыл, что мне нужно было сделать, чтобы это исправить. Я смутно помню, что мне нужно было избегать чего-то громоздкого, что я делал, например, использования версии, библиотеки или массива. Все, что я пробовал с Proteus с реальным кодом Arduino, работало нормально: сериалы, порты, логика, аналоговое и цифровое моделирование и т. Д. В этом случае, пожалуйста, откажитесь от некоторых шагов и постарайтесь сохранить простоту и прояснить плохой шаг, который вы сделали. Конечно, я ничего не отлаживал. Мне пришлось вернуться к чему-то понятному Протею. Я предполагаю: это было вызвано тем, что Mega стал сокращением для моего кода, а затем, я думаю, мне пришлось переехать..., @Brethlosze


2 ответа


2

Во-первых: Используйте файл ino.hex вместо файла .ELF Во-вторых: эта ошибка отображается, потому что вы компилируете свой код с другой платой. Убедитесь, что вы используете правильную плату в среде IDE Arduino. Мой совет: переключите свою плату на Arduino Uno как в proteus, так и в среде IDE Arduino и посмотрите, работает ли она. Позже вы можете попробовать разные платы.

,

2

Ребята, если вы столкнулись с ошибкой недопустимого кода операции 0xffff на ПК = 0x3e402 в proteus с использованием Arduino, перейдите в программное обеспечение Arduino IDE и в верхнем меню нажмите "инструмент" и измените тип платы, например, Arduino UNO на Arduino Mega 2560.

,