Урок ОК05

Начальная страница курса

В уроке ОК05 используется код урока ОК04 чтобы послать сигнал SOS при помощи светодиода.

1. Данные

До сих пор, все что мы должны были сделать для нашей операционной системы это предоставить ей необходимые инструкции. Тем не менее иногда инструкции это не все. Операционная система может нуждается в данных.

В общем случае данные это просто важные числа. Вы наверное привыкли думать о данных, которые имеют определенный тип (текстовый файл содержит текст, файл изображения содержит картинку и т.д.) но в действительности все зависит только от способа их интерпретации. Все данные в компьютере это просто числа. В данном примере мы собираемся сохранить последовательность вспышек светодиода в качестве данных.

Скопируйте этот код в конец ‘main.s’.

.section .data
.align 2
pattern:
.int 0b11111111101010100010001000101010

Разница между кодом и данными в том, что данные мы кладем в секцию .data. В данном случае данные расположены в памяти после секции кода. Так делают для того, чтобы иметь возможность реализовать систему безопасности и знать, какие участки памяти могут быть выполнены, а какие нет.

Я использовал здесь две новые команды. .align и .int. .align — указывает что данные должны быть выровнены. .align 2 — значит что данные будут размещены по адресу кратному 2^2 = 4. Это действительно важно, т.к. инструкция ldr, которую мы будем использовать для чтения памяти работает только с адресами кратными 4.
Команда .int размещает константу следующую за ней в памяти. Т.е. число 0b11111111101010100010001000101010 будет расположено в памяти по адресу метки pattern.

Как я упоминал, данные могут быть любыми. В данном случае я закодировал сигнал SOS в коде Морзе (т.е. …—… для тех кто не знаком). Я использовал 0 для обозначения единици времени когда светодиод не включен и 1 для обозначения светящегося состояния. Таким образом мы можем написать код, который будет отображать последовательность данных. И если нам нужно будет вывести другую последовательность нам нужно будет только сменить данные. Это очень простой пример того, чем должны заниматься операционные системы все время — интерпретировать и отображать данные.

Скопируйте эти строки перед меткой loop$ в ‘main.s’.

ptrn .req r4
ldr ptrn,=pattern
ldr ptrn,[ptrn]
seq .req r5
mov seq,#0

Этот код загружает данные в r4 и 0 в r5. r5 — будет служить для хранения текущей позиции в последовательности, чтобы можно было понять сколько мы уже отобразили и сколько осталось.

mov r1,#1
lsl r1,seq
and r1,ptrn

Этот код помешает в регистр r1 не нулевое значение если в последовательности не 0. Мы будем использовать r1 для функции SetGpio, которая должна получить на вход не нулевое значение, чтобы выключить светодиод, и 0 — чтобы включить.

Теперь модифицируйте весь код в ‘main.s’ так, чтобы каждую итерацию цикла устанавливалось новое состояние светодиода согласно последовательности. После этого добавьте ожидание 250000мкс (или другое подходящее). После чего инкрементируйте номер бита в последовательности (r5). Когда номер в последовательности достигает 32 его необходимо сбросить в 0. Если сделали это, постарайтесь сделать сброс в 0 используя только одну инструкцию.

2. Время летит когда Вы испытываете удовольствие

Сейчас Вы готовы протестировать код на Raspberry Pi. Должны появиться 3 короткие вспышки светодиода, затем 3 длинные и снова 3 короткие. После задержки все должно повториться. Если что-то не так обратитесь в раздел решения проблем.

Если все сработало, поздравляю! Вы закончили начальную серию уроков курса.
Мы выучили что такое коды ассемблера, контроллер GPIO, системный таймер. Мы рассмотрели что такое функции и их ABI. А также некоторые основные концепции операционной системы.

Теперь Вы готовы перейти к более сложным заданиям.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий