|
Неопределённая инструкция |
|
|
|
Oct 11 2007, 18:04
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Предложенная вами инструкция превратилась вот в это: Цитата asm(" DC32 0xe6000010"); 00003088 E6000010 STR R0, [R0], - R0, LSL #0 И прекрасно проглочена процессором. Я перебрал кучу вариантов, и все варианты благополучно превращались в удобоваримый код.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 11 2007, 18:12
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Beginning @ Oct 11 2007, 22:04)  Предложенная вами инструкция превратилась вот в это:
STR R0, [R0], - R0, LSL #0 У ARM7, как впрочем и у ARM9-10-XScale такой инструкции нет. Есть у ARM11. Цитата(Beginning @ Oct 11 2007, 22:04)  И прекрасно проглочена процессором. Процессором или симулятором?
|
|
|
|
|
Oct 12 2007, 07:49
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Пытаюсь сделать 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. Однако в железе видно тоже происходит прыжок (т.к.) виснет прога, но прерывания не происходит.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 12 2007, 08:39
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Beginning @ Oct 12 2007, 11:49)  В datasheet чётко написано:
0xFFFF7000 - 0xFFFF0FFF Invalid Access* Чётко, ага. Только 0xFFFF0FFF < 0xFFFF7000  Судя по всему, должно быть 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. Да, а зачем все это нужно, если не секрет?
|
|
|
|
|
Oct 12 2007, 10:07
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Beginning @ Oct 12 2007, 13:53)  Чему верить? Ну да, я на это обратил внимание. Ничему не верить, проверять вручную. А получилось что-нибудь с 0x80002000? Цитата(Beginning @ Oct 12 2007, 13:53)  Зачем мне это всё нужно секрета не представляет. Просто архиважно сохранять данные находящиеся в ОЗУ, при всяких непредвиденных ситуациях. Вот для того, что бы мне проверить как, эти данные сохраняются, я и делаю краш-тесты. Понятно. Только по-моему, краш-тест логичнее делать железом. Искусственное создание DAbort/PAbort/Undef - это, скорее, штатная работа.
|
|
|
|
|
Oct 12 2007, 11:48
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
С адресом 0x80002000 тоже самое что и с 0x80001000 Цитата Только по-моему, краш-тест логичнее делать железом. Не понял утверждения. Я прогу отлаживаю в реальном железе. Логически в нормально работающем железе и правильно написанной программе, не должны возникать исключительные ситуации описанные выше. Можно только предположить когда такое возникнет, например, рядом лежащий сотовик, наведёт помеху на шину или молния рядом долбанёт или ещё хр… знает что, что весьма трудно реализовать на практике с гарантированными обязательными задуманными последствиями. Поэтому эти ситуации приходится модулировать вручную.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 12 2007, 12:34
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Цитата Обработчики Data и Prefetch Abort строятся ровно по тому же принципу, вызывать их в железе, по-моему, большой необходимости нет. В принципе я с вами согласен. Просто не люблю, когда непонятности остаются. Я явно вызываю ситуации, при которых должны сработать прерывания, а они не срабатывают. И эта недокументированная ситуация напрягает. А что ещё проектировщики забыли в схему вложить? Цитата А молнию рядом вполне можно пустить при желании Да было дело... Как-то устраивал краш-тест, долбанул шокером в контроллер. Произошел так называемый эффект "защёлкивания микросхемы", это когда открываются паразитные динисторы, образованные между подложкой и вышестоящими элементами. При этом микросхема начинает потреблять амперы, и соответственно греться как утюг  . Никакая собака при этом не помогает. Только полное обесточивание микросхемы.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 12 2007, 12:57
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Beginning @ Oct 12 2007, 16:34)  В принципе я с вами согласен. Просто не люблю, когда непонятности остаются. Я явно вызываю ситуации, при которых должны сработать прерывания, а они не срабатывают. И эта недокументированная ситуация напрягает. А что ещё проектировщики забыли в схему вложить? Я, к сожалению, с Sharp дела не имел, но, судя по всему, его проектировали те же люди, что и продукцию Cirrus Logic. А у них сюрпризов хватало.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|