Как стать автором
Обновить
80
0

Пользователь

Отправить сообщение
dialout, в статье об этом написано, и про usb тоже. В конце первой главы, если точнее.
Основное преимущество risc-v — что она реально открытая, можно брать и делать свой проц, не платя денег за лицензию и роялти.
Хорошо, преимущество для производителей микросхем есть. А для нас преимущество в чем?
Скорее даже наоборот. В микросхемах ведь чем больше партия тем дешевле. А ARM'ов гораздо больше производят.
В этом месте ожидал увидеть краткие преимущества ядра RISC-V по сравнению с ARM, чтобы понять имеет ли смысл интересоваться RISC-V.
А я их не знаю :) Ну то есть теоретически у risc более приятный ассемблер, но программируют-то все равно чаще на Си, так что какая разница. Теоретически, он быстрее, но именно vf103 в сравнении с f130 выигрывает скорее за счет каких-то аппаратных ухищрений. А аналогов чего-то другого GigaDevice не делает. Так что просто другая архитектура, почему бы ее не рассмотреть.
Неужто такие платы существуют?

Та же bluepill, у которой единственный диод на PC13, та же arduino, у которой диоды на TX, RX и SCK.
О том, что используемый софт предназначен для Linux следовало упомянуть раньше, в разделе «Настройка программного окружения».
Насколько я знаю, под Windows есть порты всего этого, да еще там вроде виртуалку линуксовую завезли.
С другой стороны, сколько статей я здесь читал, никто не делает акцента что софт предназначен, скажем, для windows. Вот разработчики на Mac иногда упоминают.
Вы правы, я не делал акцента на псевдоинструкциях вроде mv, call, ret, scrw, la. Не думаю, что с ними будут какие-то проблему у изучающих, особенно если они будут смотреть дизассемблерный файл.
А вот за шпаргалку по инструкциям спасибо, добавлю ее в статью и доки на гитхабе.
Мощные Риски это может и умеют, но контроллеры вряд ли. Да и чтобы команда добралась до процессорного «мозга» ее надо как-то закодировать, пусть и через addi
Некоторую можно. Адреса тех же GPIO и UART совпадают, биты регистров тоже. Но полностью я бы на это не полагался. Да и зачем?
Ах да, еще как минимум USB отличается. Но насколько — не знаю, не ковырял пока.
Отрицательная в lui не влияет вообще ни на что, ведь она сдвигается влево и старшие биты обрезаются.
С addi, конечно, посложнее, но, согласитесь, было бы нелогично чтобы addi a0, t0, -5 складывала с 4091.
тут видимо надо уточнить, что у классических армов, а также и у ембеднутых стека нет точно так же
Может и стоило бы, но я слишком плохо знаю arm чтобы это писать.
при входе в обработчик процессор аппаратно пушит (и при выходе — читает обратно) некоторые регистры. эти регистры, кстати, выбраны так, чтобы обработчик имел сигнатуру void HandlerName(void), без никаких __attribute__((interrupt)).
Да, это тоже красивое решение, как и аппаратная чехарда с регистрами при обработке нескольких прерываний последовательно.
Но в risc-v такое делать было нельзя, поскольку хотели оставить инструкции максимально простыми (по крайней мере я понял их логику так).
в данной реализации risc-v получается, что стек всегда софтовый и один, и никак нельзя отвязать стек пользователя от стека обработчиков (не занимая явно ещё один регистр под стек обработчика, конечно же).
Разделение прав доступа там тоже есть, хотя сделано по-другому. Вы правы, это интересный вопрос, думаю добавлю в статью.
Насколько я понял из документации, в risc-v используется сохранение sp в спецрегистр mscratchcsw:
csrrw sp, mscratchcsw, sp
что-то делаем
csrrw sp, mscratchcsw, sp

Точнее не в risc-v вообще, а именно в bumblebee, ядре моего контроллера
del (не туда ответил)
Что-то мне кажется, вы слишком закопались.
Команда lui загружает 0xDCBAA в старшие 20 бит, то есть x5 = 0xDBCAA000 = 3'687'489'536
Потом addi вычитает прибавляет к нему -1930. Раз уж в команду можно писать отрицательные числа, наверное она умеет с ними работать правильно и расширяет до нужного диапазона
x5 = x5 — 1930 = 3'687'487'606 = 0xDBCA'9876.
Для меня гораздо большим выносом мозга была загрузка относительно pc.
Впрочем, objdump умеет это сам писать в комментариях что же туда будет сохранено и какой метке / константе оно соответствует:
19c: 20000597 auipc a1,0x20000
1a0: e6458593 addi a1,a1,-412 # 20000000 <_data_end>

0x19C + 0x20'00'00'00 — 412 = 0x20'00'00'00
22a: 400117b7 lui a5,0x40011
22e: c0078793 addi a5,a5,-1024 # 40010c00 <GPIOB_BASE>

0x40'01'10'00 -1024 = 0x40'01'0c'00
Патченный это не интересно :) Но, наверное это действительно единственный способ его завести.
За makefile спасибо, ознакомлюсь. Адаптировать его под eclipse, qbs или qtcreator не буду точно: меня вполне устраивает текстовый редактор и вызов make && make prog && screen из консоли.
А вот по чему не отказался бы от консультации, так это по подключению стандартных Си-шной библиотек вроде math или string.
Вот тут не оно? github.com/riscv-mcu/GD32VF103_Firmware_Library
Но там нет скриптов сборки, так что непонятно как их вообще компилировать, какие флаги, какой стартап код, как подключить стандартные библиотеки и т.п. В общем, не разобрался я с тамошними примерами, пришлось ковырять с нуля.
добавил в конец список использованных команд ассемблера
Нормального справочника по ассемблеру я тоже не нашел, что вообще-то странно. Кое-что можно найти в спецификации ядра (например, вот)
Если вы имеете в виду что приведенные в статье исходные коды непонятны без расшифровки, то да, надо будет не забыть сделать приложение с описанием инструкций.
Есть ли возможность как в ARM сохранять на стек или снимать с него сразу пачку регистров?

А вот это в статье описано. Собственно стека в RISCV нет, так что все манипуляции делаются ручками. Хотите чтобы рос вверх — пожалуйста, увеличивайте sp вместо уменьшения. Хотите вместо sp использовать, скажем, a5 — пожалуйста. Просто другие процедуры этого могут не понять. Как и компилятор Си.
Это попытка пошагового описания от констант, указанных в даташите, к более-менее нормальному коду. Оно все — переходные варианты, поэтому много внимания им не уделял. Но вы правы, раз уж заменил номер порта на константу, надо было и битовую константу оформить по-человечески
Ну ее хорошо бы исправить. Заменить «пьезоэлектрический эффект» на «пьезорезистивный» и описание его работы с генерации напряжения на изменение сопротивления.
Вот например
Ищите по полному имени gd32vf103cbt6. Там на Али какие-то проблемы с поиском
там ниже будет замена магических чисел 0b1111 и 0b0011 на константы. А в следующей части будет файл макросов, где это делается еще проще:
#define RLED B, 5, 1, GPIO_PP50
...
GPIO_config( RLED );
GPO_ON( RLED );

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность