Код: Выделить всё
void uart_puts(const char *str);
void uart_putc(char c);
void notmain(void) {
volatile char *uart = (char *)0x1c090000; // UART базова адреса
char c;
uart_puts("UART test...\n");
while (1) {
c = *uart; // Читаємо символ з UART
if (c != 0) { // Перевіряємо, чи є дані
uart_putc(c); // Виводимо символ на екран
}
}
}
void uart_puts(const char *str) {
while (*str) {
uart_putc(*str++);
}
}
void uart_putc(char c) {
volatile char *uart = (char *)0x1c090000;
*uart = c; // Виведення символа в UART
}
Код: Выделить всё
.globl _start
_start:
mov sp, #0x20000 // Встановлюємо стековий вказівник
bl notmain // Викликаємо C-функцію notmain
hang:
b hang // Безкінечний цикл
.globl PUT32
PUT32:
str w1, [x0] // Записуємо значення з регістра w1 в адресу, на яку вказує x0
ret // Повертаємося з функції
Код: Выделить всё
aarch64-linux-gnu-as --warn --fatal-warnings -march=armv8-a strap.s -o strap.o
Код: Выделить всё
aarch64-linux-gnu-gcc -c -Wall -O2 -nostdlib -nostartfiles -ffreestanding -march=armv8-a notmain.c -o notmain.o
Код: Выделить всё
/*memmap*/
MEMORY
{
ram :ORIGIN = 0x10000, LENGTH = 32K
}
SECTIONS
{
.text : { *(.text*)} > ram
.bss : { *(.bss*)} > ram
}
Код: Выделить всё
aarch64-linux-gnu-ld strap.o notmain.o -T memmap -o notmain.elf
Код: Выделить всё
aarch64-linux-gnu-objcopy notmain.elf -O binary os.bin

Для визуализации я использую эту команду:
Код: Выделить всё
qemu-system-aarch64 -M virt -cpu cortex-a53 -m 128 -serial mon:stdio -kernel os.bin
Итак, что мне нужно исправить:
- визуализировать bin в qemu gui virt (без параметра -noghraphic)
- клавиатура «ответит» в эмуляторе
Подробнее здесь: https://stackoverflow.com/questions/790 ... u-emulator