Инструменты разработчика
Пример использования набора инструментов
В качестве примера использования установленного выше набора инструментов необходимо написать исходный файл на языке Assembler. Для этого необходимо открыть текстовый редактор (например, nano или vi для работы в консоли, а также gedit, kate, sublime или code для работы в графическом режиме) и ввести следующий код, после чего необходимо сохранить его с именем example.s.
.text .globl _start _start: addi x10, x0, 7 addi x17, x0, 93 ecall
Для сборки и запуска программы, а также проверки результата её исполнения необходимо ввести следующую последовательность команд:
riscv64-linux-gnu-as -o example.o example.s riscv64-linux-gnu-ld -o example example.o qemu-riscv64-static example echo $? 7
Первая команда вызывает для написанного исходного кода компилятор программ на языке Assembler, который транслирует исходный код в машинные инструкции объектного файла. Вторая команда вызывает компоновщик, который дополняет код объектного файла не обходимыми инструкциями и генерирует исполняемый файл с именем example. Третья команда запускает скомпилированный бинарный исполняемый файл на исполнение в эмуляторе архитектуры RISC-V. Поскольку этот код ничего не делает, кроме как завершает работу с указанным кодом возврата, на экране в результате выполнения программы ничего не будет выведено. Для того, чтобы увидеть код возврата последней вызываемой команды или программы, воспользуемся командой командного интерпретатора bash (строка 4). В качестве результата в консоли должно напечататься число 7.
Помимо компилятора и компоновщика, набор инструментов также содержит утилиту objdump (файл riscv64-linux-gnu-objdump) - дизассемблер, который позволяет провести обратное описанным выше операциям действие и на основе скомпилированного бинарного кода получить набор инструкций на языке Assembler. Пример вызова утилиты дизассемблирования показан ниже:
riscv64-linux-gnu-objdump -sd example example: file format elf64-littleriscv Contents of section .text: 100b0 13057000 9308d005 73000000 ..p.....s... Contents of section .riscv.attributes: 0000 412d0000 00726973 63760001 23000000 A-...riscv..#... 0010 05727636 34693270 305f6d32 70305f61 .rv64i2p0_m2p0_a 0020 3270305f 66327030 5f643270 3000 2p0_f2p0_d2p0. Disassembly of section .text: 00000000000100b0 <_start>: 100b0: 00700513 li a0,7 100b4: 05d00893 li a7,93 100b8: 00000073 ecall
Первая часть вывода objdump показывает содержимое файла в шестнадцатеричном виде (за это отвечает передаваемый программе ключ -s), вторая часть - собственно дизассемблированный код (ключ -d). К этому примеру мы ещё вернёмся позднее, сейчас он служит просто демонстрацией работоспособности установленных пакетов набора инструментов.
Наконец, можно использовать отладчик. Для этого введите следующие команды:
qemu-riscv64-static -g 1234 example & gdb-multiarch example ... Reading symbols from example... (No debugging symbols found in example) (gdb) target remote :1234 Remote debugging using :1234 0x00000000000100b0 in _start () (gdb) display /3i $pc 1: x/3i $pc => 0x100b0 <_start>: li a0,7 0x100b4 <_start+4>: li a7,93 0x100b8 <_start+8>: ecall (gdb) si 0x00000000000100b4 in _start () 1: x/3i $pc => 0x100b4 <_start+4>: li a7,93 0x100b8 <_start+8>: recall 0x100bc: .2byte 0x2d41 (gdb) si 0x00000000000100b8 in _start () 1: x/3i $pc => 0x100b8 <_start+8>: ecall 0x100bc: .2byte 0x2d41 0x100be: .2byte 0x0 (gdb) c Continuing. [Inferior 1 (process 1) exited with code 07]
После запуска эмулятора с подключением возможности удалённой отладки через порт 1234, запускается программа-отладчик gdb-multiarch. Отладчик подключается к удалённой системе благодаря команде target remote с указанием требуемого порта (1234). Команда display /3i $pc показывает 3 следующие за текущей инструкции, команда si предписывает выполнить одну инструкцию (сделать один шаг по коду), а команда c даёт указание продолжить выполнение программы. Чтобы выйти из отладчика, нужно ввести команду q.
Запуск Visual Studio Code и PlatformIO вместе с Qemu и пакетом инструментов RISC-V GNU Toolchain
Помимо работы в командной строке, также возможно настроить работу в интегрированной среде разработки. В качестве примера рассмотрим, как можно использовать среду разработки Visual Studio Code (доступна по адресу http://https://code.visualstudio.com) с установленным расширением PlatformIO, пример работы которого показан на рис.2.3 (расширение доступно по адресу http://https://platformio.org).
Откройте терминал в среде VS Code, находясь внутри PlatformIO и выбрав пункт меню "New terminal", и введите следующую команду:
pio platform install https://github.com/e1d1-academy/platform-linux_riscv.git
Также можно импортировать тестовый проект, как показано в следующем разделе, и проверить, запускается ли он корректно.