mirror of
https://github.com/MPSU/APS.git
synced 2025-09-16 17:40:41 +00:00
Лабу по дейзи-цепочке необходимо вставить сразу после лабы по интеграции контроллера прерываний, поэтому приходится увеличить нумерацию оставшихся лаб.
33 lines
2.4 KiB
ArmAsm
33 lines
2.4 KiB
ArmAsm
_start:
|
||
# Инициализируем начальные значения регистров
|
||
0: 050000b7 li x1 , 0x05000000 # сохраняем базовый адрес uart_rx
|
||
4: 06000137 li x2 , 0x06000000 # сохраняем базовый адрес uart_tx
|
||
8: 0001c1b7 li x3 , 0x0001c200 # устанавливаем бодрейт 115200
|
||
c: 20018193
|
||
10: 0030a623 sw x3 , 0x0c(x1)
|
||
14: 00312623 sw x3 , 0x0c(x2)
|
||
18: 00100213 li x4 , 0x00000001 # устанавливаем parity_bit
|
||
1c: 0040a823 sw x4 , 0x10(x1)
|
||
20: 00412823 sw x4 , 0x10(x2)
|
||
24: 00100293 li x5 , 0x00000001 # подготавливаем маску прерывания единственного
|
||
# (нулевого) входа
|
||
28: 30429073 csrw mie, x5 # загружаем маску в регистр маски
|
||
2c: 03c00293 la x5, trap_handler # псевдоинструкция la аналогично li загружает число,
|
||
30: 00028293 # только в случае la — это число является адресом
|
||
# указанного места (адреса обработчика перехвата)
|
||
# данная псевдоинструкция будет разбита на две
|
||
# инструкции: lui и addi
|
||
34: 30529073 csrw mtvec, x5 # устанавливаем вектор прерывания
|
||
# Вызов функции main
|
||
main:
|
||
38: 00000063 beq x0, x0, main # бесконечный цикл, аналогичный while (1);
|
||
# ОБРАБОТЧИК ПЕРЕХВАТА
|
||
# Без стороннего вмешательства процессор никогда не перейдет к инструкциям ниже,
|
||
# однако в случае прерывания в программный счетчик будет загружен адрес первой
|
||
# нижележащей инструкции.
|
||
# Сохраняем используемые регистры на стек
|
||
trap_handler:
|
||
3c: 0000a383 lw x7, 0(x1) # загружаем пришедший байт
|
||
40: 00712023 sw x7, 0(x2)
|
||
44: 30200073 mret
|