Опубликован: 19.01.2025 | Доступ: свободный | Студентов: 1 / 0 | Длительность: 02:34:00
Лекция 3:

Инструменты разработчика

< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Пример использования набора инструментов

В качестве примера использования установленного выше набора инструментов необходимо написать исходный файл на языке 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 и выбрав пункт меню &QUOT;New terminal&QUOT;, и введите следующую команду:

pio platform install https://github.com/e1d1-academy/platform-linux_riscv.git

Также можно импортировать тестовый проект, как показано в следующем разделе, и проверить, запускается ли он корректно.

Пример интерфейса среды разработки VS Code с расширением PlatformIO, работающим в режиме отладки

Рис. 2.3. Пример интерфейса среды разработки VS Code с расширением PlatformIO, работающим в режиме отладки
< Лекция 2 || Лекция 3: 123 || Лекция 4 >