Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неопределённая инструкция
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Beginning
Пишу обработчик всех непредвиденных ситуаций. Написал обработчик UNDEF. Вставил в С код строку типа asm(" DC32 0x10101010"); и столкнулся с непредвиденной проблемой. А какую именно инструкцию не поймёт проц? Перепробовал кучу вариантов и все проглатывал. Может, кто подскажет, от какой инструкции сработает прерывание UNDEF.
aaarrr
Строго говоря, это зависит от архитектуры. Для архитектур по V5 включительно, команды вида 0xFFxxxxxx вызовут Undef.
Beginning
Процессор SHARP LH79525 архитектура 720T.
aaarrr
Цитата(Beginning @ Oct 11 2007, 21:00) *
Процессор SHARP LH79525 архитектура 720T.

Это V4T.

В предыдущем посте я наврал немного - такая конструкция сработает только на V5, остальные её просто игнорируют.

Для ARM7 нужно что-то типа: 0xe6000010, где биты 31..28 это условие выполнения (0xE - всегда), биты 24..5 и 3..0 могут быть любыми (собственно инструкция).
Beginning
Предложенная вами инструкция превратилась вот в это:
Цитата
asm(" DC32 0xe6000010");
00003088 E6000010 STR R0, [R0], - R0, LSL #0

И прекрасно проглочена процессором.

Я перебрал кучу вариантов, и все варианты благополучно превращались в удобоваримый код.
smile3046.gif
aaarrr
Цитата(Beginning @ Oct 11 2007, 22:04) *
Предложенная вами инструкция превратилась вот в это:

STR R0, [R0], - R0, LSL #0

У ARM7, как впрочем и у ARM9-10-XScale такой инструкции нет. Есть у ARM11.

Цитата(Beginning @ Oct 11 2007, 22:04) *
И прекрасно проглочена процессором.

Процессором или симулятором?
Beginning
Прошу прощения, ваша инструкция вызвала UNDEF. Я забыл переключить компиляцию debug/relis. Всё работает отлично, как и должно работать. Большой a14.gif
Beginning
Пытаюсь сделать data-abort. Выполняю инструкции типа:

x=0xFFFF7004;
asm(" str R0,[R0]");

В datasheet чётко написано:

0xFFFF7000 - 0xFFFF0FFF Invalid Access*

NOTE: *An access to this area will cause a memory abort.


В симуляторе, чётко вижу, что по этому адресу записывается значение. Однако в железе ничего не происходит. В чём, может быть засада?


Пытаюсь сделать perfetch-abort. Выполняю инструкции типа:

x=0x80001000;
asm(" stmdb sp!,{r0}");
asm(" ldmia sp!,{PC}");

Напрямую записать в PC компилятор не даёт.
В симуляторе, чётко вижу, что программа прыгает на адрес 0x80001000. Однако в железе видно тоже происходит прыжок (т.к.) виснет прога, но прерывания не происходит.
aaarrr
Цитата(Beginning @ Oct 12 2007, 11:49) *
В datasheet чётко написано:

0xFFFF7000 - 0xFFFF0FFF Invalid Access*

Чётко, ага. Только 0xFFFF0FFF < 0xFFFF7000 smile.gif Судя по всему, должно быть 0xFFFF0000 - 0xFFFF0FFF.
Справедливости ради нужно сказать, что 0xFFFF7004 все же попадает под invalid access (0xFFFF6000 - 0xFFFFEFFF).

Цитата(Beginning @ Oct 12 2007, 11:49) *
В симуляторе, чётко вижу, что программа прыгает на адрес 0x80001000. Однако в железе видно тоже происходит прыжок (т.к.) виснет прога, но прерывания не происходит.

В даташите есть еще такие цифры:
Код
0x80000000 - 0x80001FFF Boot ROM
0x80002000 - 0xFFFBFFFF Invalid Access

Так что вполне возможно, что прыжок происходит аккуратно в середину Boot ROM.

Попробуйте добиться DAbort/PAbort на адресе 0x80002000.


Да, а зачем все это нужно, если не секрет?
Beginning
Я в DATASHEET LH79524-5 вижу таблицу (стр. 58) в которой следующие цифры:

0x80000000 - 0x80000FFF Boot ROM
0x80001000 - 0xFFFBFFFF Invalid Access*

А на странице 56 я вижу:

0x80000000 - 0x80001FFF Boot ROM

Чему верить?


Зачем мне это всё нужно секрета не представляет. Просто архиважно сохранять данные находящиеся в ОЗУ, при всяких непредвиденных ситуациях. Вот для того, что бы мне проверить как, эти данные сохраняются, я и делаю краш-тесты.
aaarrr
Цитата(Beginning @ Oct 12 2007, 13:53) *
Чему верить?

Ну да, я на это обратил внимание. Ничему не верить, проверять вручную.

А получилось что-нибудь с 0x80002000?

Цитата(Beginning @ Oct 12 2007, 13:53) *
Зачем мне это всё нужно секрета не представляет. Просто архиважно сохранять данные находящиеся в ОЗУ, при всяких непредвиденных ситуациях. Вот для того, что бы мне проверить как, эти данные сохраняются, я и делаю краш-тесты.

Понятно. Только по-моему, краш-тест логичнее делать железом.
Искусственное создание DAbort/PAbort/Undef - это, скорее, штатная работа.
Beginning
С адресом 0x80002000 тоже самое что и с 0x80001000
Цитата
Только по-моему, краш-тест логичнее делать железом.

Не понял утверждения. Я прогу отлаживаю в реальном железе. Логически в нормально работающем железе и правильно написанной программе, не должны возникать исключительные ситуации описанные выше. Можно только предположить когда такое возникнет, например, рядом лежащий сотовик, наведёт помеху на шину или молния рядом долбанёт или ещё хр… знает что, что весьма трудно реализовать на практике с гарантированными обязательными задуманными последствиями. Поэтому эти ситуации приходится модулировать вручную.
aaarrr
Undef Вы уже получили, как я понимаю. Обработчики Data и Prefetch Abort строятся ровно по тому же принципу, вызывать их в железе, по-моему, большой необходимости нет.

Под "железными" краш-тестами я имел в виду работу на пониженном/повышенном питании, температуре и т.п. А молнию рядом вполне можно пустить при желании smile.gif
Beginning
Цитата
Обработчики Data и Prefetch Abort строятся ровно по тому же принципу, вызывать их в железе, по-моему, большой необходимости нет.

В принципе я с вами согласен. Просто не люблю, когда непонятности остаются. Я явно вызываю ситуации, при которых должны сработать прерывания, а они не срабатывают. И эта недокументированная ситуация напрягает. А что ещё проектировщики забыли в схему вложить?
Цитата
А молнию рядом вполне можно пустить при желании

Да было дело... Как-то устраивал краш-тест, долбанул шокером в контроллер. Произошел так называемый эффект "защёлкивания микросхемы", это когда открываются паразитные динисторы, образованные между подложкой и вышестоящими элементами. При этом микросхема начинает потреблять амперы, и соответственно греться как утюг tort.gif . Никакая собака при этом не помогает. Только полное обесточивание микросхемы.
aaarrr
Цитата(Beginning @ Oct 12 2007, 16:34) *
В принципе я с вами согласен. Просто не люблю, когда непонятности остаются. Я явно вызываю ситуации, при которых должны сработать прерывания, а они не срабатывают. И эта недокументированная ситуация напрягает. А что ещё проектировщики забыли в схему вложить?

Я, к сожалению, с Sharp дела не имел, но, судя по всему, его проектировали те же люди, что и продукцию Cirrus Logic. А у них сюрпризов хватало.
SpiritDance
Цитата(aaarrr @ Oct 12 2007, 16:57) *
Я, к сожалению, с Sharp дела не имел, но, судя по всему, его проектировали те же люди, что и продукцию Cirrus Logic. А у них сюрпризов хватало.

Да ладно вам обоим. smile.gif С шарпом нормально все более-менее, сюрпризов поменьше гораздо, чем в том же атмеле или филипсе. А совсем без "непонятностей" в армах на сегодняшний день пока не бывает.
e-yes
Я для вызова data abort пользуюсь *((int*)1)=0; - получается невыровненый доступ и как следствие data abort. Не знаю, как на Шарпе, но на Атмеле - работает.
Могу еще предположить (с вероятностью 95%, что на PXA/IXP тоже).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.