README.md

QEMU be-u1000 suite

Обёртка для разработки и эмуляции BE-U1000 (машина evu-ba, RISC-V BR350 CORE0/CORE1): submodules с QEMU и примерами SDK, плюс пара вспомогательных скриптов.

Структура

.
├── qemu/                        # submodule: [qemu](https://git.rulkc.org/pub/scm/landau/qemu/git/baikal/qemu.git)
├── examples/
│   └── mcu-sdk-examples/        # submodule: [mcu-sdk-examples](https://gitflic.ru/project/maquefel/mcu-sdk-examples.git)
└── tools/
|   └── svd2qemu.py              # генерация кода для QEMU из svd файлов
└── scripts/
    └── gdb-be-u1000.sh          # запуск gdb против gdbstub QEMU
    └── be-u1000-dfilter.py      # построение -dfilter по именам регионов

Клонирование

git clone --recurse-submodules <url-обёртки>
# или, если уже склонировано без --recurse-submodules:
git submodule update --init --recursive

Сборка QEMU

Нужен riscv32-softmmu таргет:

cd qemu
mkdir -p build && cd build
../configure --target-list=riscv32-softmmu
ninja qemu-system-riscv32

Для MMIO-трассировки с фильтром по ядру (см. раздел про dfilter) соберите с дополнительным флагом:

../configure --target-list=riscv32-softmmu --enable-trace-cpu-filter

Сборка примеров

Тулчейн: riscv64-unknown-elf-gcc (пакеты Ubuntu gcc-riscv64-unknown-elf + picolibc-riscv64-unknown-elf, либо PICOLIBC=local для сборки picolibc из подмодуля под свой тулчейн).

cd examples/mcu-sdk-examples
make -j$(nproc)

Соберутся все примеры из Projects/HAL_examples/** — .elf/.bin/.hex лежат в build/<Example>.elf и т.д., например build/GPIO_LEDBlink.elf.

Если нужен конкретный тулчейн не из PATH, укажите:

make TC_DIR=/path/to/toolchain

Запуск примера в QEMU

Прошивка грузится явно в EFLASH через generic loader (-kernel машина пока не обрабатывает):

qemu/build/qemu-system-riscv32 -M evu-ba -display none -bios none -serial stdio \
  -device loader,file=examples/mcu-sdk-examples/build/GPIO_LEDBlink.bin,addr=0xa0000000,cpu-num=0,force-raw=on

Консольный UART выбирается -machine evu-ba,uart=uartN (по умолчанию uart0).

Для примеров на CORE_1 (например GPIO_LEDBlink_C1) укажите cpu-num=1.

Отладка через gdb

Сначала запустите QEMU с gdbstub и в режиме halt:

qemu/build/qemu-system-riscv32 -M evu-ba -display none -bios none -serial stdio \
  -device loader,file=examples/mcu-sdk-examples/build/GPIO_LEDBlink.bin,addr=0xa0000000,cpu-num=0,force-raw=on \
  -s -S

Затем, из корня обёртки:

./gdb-be-u1000.sh GPIO_LEDBlink            # найдёт examples/mcu-sdk-examples/build/GPIO_LEDBlink.elf
./gdb-be-u1000.sh path/to/some.elf         # или указать .elf напрямую
./gdb-be-u1000.sh -c 1 GPIO_LEDBlink_C1    # пример на CORE_1 -> gdb thread 2

Скрипт сам ищет riscv64-unknown-elf-gdb (или riscv32-unknown-elf-gdb, gdb-multiarch) в PATH; при нестандартном пути подмодуля с примерами задайте EXAMPLES_DIR=....

MMIO-трассировка и be-u1000-dfilter.py

Базовая трассировка по CPU — через штатные события QEMU (ничего собирать дополнительно не нужно):

qemu/build/qemu-system-riscv32 -M evu-ba ... \
  -trace enable=memory_region_ops_read -trace enable=memory_region_ops_write \
  -D trace.log

Для живого фильтра по ядру нужна сборка с --enable-trace-cpu-filter (см. выше):

qemu/build/qemu-system-riscv32 -M evu-ba ... \
  -machine evu-ba,trace-cpu-mask=0x1,trace-dma=off

trace-cpu-mask — битовая маска (0x1=CORE0, 0x2=CORE1, 0x3/"0+1" — оба), не номер харта. trace-dma отдельно включает/выключает показ DMA-доступов.

Чтобы отфильтровать трассировку ещё и по адресам, удобнее задавать регионы по имени, а не вручную считать адреса. Сначала дамп карты памяти:

qemu/build/qemu-system-riscv32 -M evu-ba,dump-memmap=memmap.json,dump-memmap-format=json \
  -S -display none -serial none -monitor none

Затем scripts/be-u1000-dfilter.py строит аргумент -dfilter по именам:

scripts/be-u1000-dfilter.py memmap.json UART0,ROM0
# -dfilter 0x11001000+0x1000,0x40000000+0x10000

scripts/be-u1000-dfilter.py memmap.json --merge UART0,UART1   # схлопнуть смежные регионы

# сразу запустить QEMU с построенным -dfilter:
scripts/be-u1000-dfilter.py memmap.json --merge UART0,UART1 -- \
  qemu/build/qemu-system-riscv32 -M evu-ba ...
Описание
Конвейеры
0 успешных
0 с ошибкой
Разработчики