для сборки компилятора использовался данный репозиторий
строка конфигурации:
./configure --prefix=../riscv-gcc-crosscompiler64 --with-arch=rv64ima --with-abi=lp64 --with-multilib-generator="rv64ima-lp64--f*c" --disable-linux -j$(nprocs)
Для сборки/запуска надо изменить переменную RISCV_CROSS_BIN
в Makefile (указать путь установки кросскомпилятора). Пример:
RISCV_CROSS_BIN = ../riscv-gcc-crosscompiler64/bin
Дальнейших изменений не требуется
Доступные точки входа Makefile
make biuld # сборка
make build-debug # сборка с отладочной информацией
make qemu # запуск в qemu
make qemu-debug # запуск в qemu в режиме отладки
make debug # запуск gdb для подключения к активной сессии qemu
make dump-dts # получение dts конфига устройств
Пример запуска без отладчика: make build && make qemu
Пример запуска в режиме отладки make build-debug && make qemu-debug
. В соседней сессии терминала: make debug
- В MakeFile У переменной
QEMU_FLAGS
изменить 128M на необходимое кол-во - В 64-bit-main.ld изменить параметры
ram_to_use
(кол-во опреативы, отведённой под исполняемый файл) иram_to_test
(кол-во опреативы, отведённой под заполнение и проверку) - В main.c изменить значение макроса
RAM_LENGTH
(кол-во оперативы под заполнение паттерном).
- В main.c объявлены макросы, задающие основные параметры вывода на экран. Можно изменить размер чанка, длину / ширину списка битых адресов и т.д.
Это может пригодиться для тестирования решения на машине без проблем с оперативной памятью (как, на пример, текущая виртуальная машина). Это нужно только чтобы показать формат вывода данных в UART
- получить пример выявления ошибок при проверки данны через CPU (см коммент к
char write_buffer
вmain.c
). если заменить один из символов U на что-то ещё, то выведется таблица с диапазонами адресов, где была обнаружена эта лишняя единица. Тест показывает потенциально битые байты. - получить пример выявления ошибок при записи по определённому адресу через DMA (см коммент в
int fill_ram()
--src/memcheck.c
). Если раскомментировать приложенный код, мы искуственно добавляем флаг ошибки записи к некоторым из чанков, записываемым каналом №2. Тем самым спровацируем вывод таблицы с диапазоном адресов, куда запись якобы не удалась.
- цикл статей для новичков по написанию кода под riscv
- код минимального uart0 драйвера на RUST
- реализация PDMA драйвера под линукс
- заголовочный файл этой реализации
- RISC-V GNU Compiler Toolchain
- SiFive FU540-C000 Manual
По ходу разбирательства в теме и реализации приложения я оставлял заметки касательно того, что я узнал / что думамю по поводу всего этого. Оставлю их тут на всякий случай. Там в том числе разъясняется, почему я принимал те или иные концептуальные решения (только архитектурно значимые, разумеется).