Jump to content
    

Команда портит регистр

Коллеги, не дайте умом тронуться, одолел меня RISC-V.

Контроллер CH32V307. Ядро QingKeV4 c расширениями rv32imafc и abi = ilp32f судя по мануал. Команда непосредственной загрузки константы в регистр lui a5, 0x40011 кроме загрузки a5 портит ещё и а0.

Вот под отладкой стою на команде.

 01.thumb.png.11bcd0adf7798dcaff95941a7ccda082.png

Теперь делаю один шаг. а5 загружен, а0 сломан.

02.thumb.png.f4913ba0365cd840342e52ca6629b477.png

Команда закодирована правильно согласно талмудам.

03.thumb.png.b6f9ce90b0e3bba19c940bf9d7671c74.png

Подскажите, что происходит? Куда копать?

PS: есть и другие команды, которые так себя ведут...

Share this post


Link to post
Share on other sites

прерывания отключены? если нет, то код прерываний точно а0 не портит? 

в стандартном RISCV дебугере есть возможность запрета прерываний в single step - как сделано у китайцев - хз.

-------------------

сохраните а0 в два регистра до и после lui, ну и брек после - сравните эти регистры - точно ли портится от lui (то есть проходите этот код не в single step)

------------------- 

выровняйте эту комманду на 32 (то есть чтоб адрес был 0х438) - nop например перед ней

это не ответ, а что можно попробовать. может там какое-то исключение происходит между шагами дебагера, а код в нем кривой...

Share this post


Link to post
Share on other sites

 

19 минут назад, yes сказал:

прерывания отключены?

Код уже в прерывании. Вроде других прерываний не должно поверх быть. Сейчас попробую запретить вообще перед этим местом.

 

19 минут назад, yes сказал:

сохраните а0 в два регистра до и после lui, ну и брек после

Я на С/С++ пишу. Если только ассемблерными вставками грязной лапой залезть...

19 минут назад, yes сказал:

выровняйте эту комманду на 32

Выравнивание ничего не дало.

---------------------------------------------------------------------

Докладываю. Похоже, отладчик гадит. Запрет прерываний немного раньше по коду ничего не меняет. А вот если точку останова поставить чуть позже этой команды, то регистр оказывается не испорчен.

Share this post


Link to post
Share on other sites

Если честно, я ХЗ как оно там внутри работает. Связка CH32V307(SWD) <-> WCH-Link <-> OpenOCD-WCH <-> riscv-none-elf-gdb <-> VisualGDB в Visual Studio.

Share this post


Link to post
Share on other sites

Это не ответ на вопрос, а просто поправка опечатки, на последней картинке ошибка, правильно будет опкод = 0x37

Программа без rtos?

Share this post


Link to post
Share on other sites

Не, без rtos. Пока просто щупаю. Тут ещё на каждом уровне пилить, пилить и пилить.

Share this post


Link to post
Share on other sites

On 12/23/2022 at 8:18 AM, Immortal_Buka said:

для risc-v есть симулятор неплохой, https://github.com/riscv-software-src/riscv-isa-sim можно использовать как reference

Это SPIKE - до недавнего времени использовался как golden симупятор. Недавно в этом качестве стал использоваться QEMU - https://www.qemu.org/docs/master/system/target-riscv.html

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...