mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
ЛР13. Обновление platform.h и руководства к нему.
This commit is contained in:
@@ -625,7 +625,7 @@ Disassembly of section .data:
|
||||
|
||||
При написании программы, помните что в C++ сильно ограничена арифметика указателей, поэтому при присваивании указателю целочисленного значения адреса, необходимо использовать оператор `reinterpret_cast`.
|
||||
|
||||
Для того, чтобы уменьшить ваше взаимодействие черной магией указателей, вам представлен файл [platform.h](platform.h), в котором объявлены структуры, в которых происходит отображение полей на физические адреса периферийных устройств. Вам нужно лишь проинициализировать указатель на структуру физическим адресом периферийного устройства (преобразовав перед этим целочисленное значение в тип указателя с помощью макроса `CAST`, представленного в файле `platform.h`).
|
||||
Для того, чтобы уменьшить ваше взаимодействие с черной магией указателей, вам представлен файл [platform.h](platform.h), в котором объявлены указатели структуры, отвечающие за отображение полей на физические адреса периферийных устройств. Вам нужно лишь воспользоваться указателем на ваше периферийное устройство.
|
||||
|
||||
Пример взаимодействия с периферийным устройством через вымышленную структуру:
|
||||
|
||||
@@ -633,22 +633,24 @@ Disassembly of section .data:
|
||||
#include "platform.h"
|
||||
|
||||
/*
|
||||
Создаем указатель на структуру SUPER_COLLIDER_HANDLE и инициализируем этот
|
||||
указатель адресом 0xFF000000, поскольку в нашей системе это периферийное
|
||||
устройство расположено под номером 255.
|
||||
При инициализации указателя, мы делали преобразование типа посредством
|
||||
макроса CAST(type, address) из заголовочного файла platform.h
|
||||
Создаем заголовочном файле "platform.h" объявлен collider_ptr — указатель на структуру SUPER_COLLIDER_HANDLE.
|
||||
Доступ к полям этой структуры можно осуществлять через оператор "->".
|
||||
Также в этом файле объявлен указатель collider_mem, который указывает на
|
||||
некоторую память этого периферийного устройства. Данный указатель можно
|
||||
использовать в качестве имени массива.
|
||||
*/
|
||||
struct SUPER_COLLIDER_HANDLE* collider_ptr = CAST(struct SUPER_COLLIDER_HANDLE*, 0xFF000000);
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
while(1){ // В бесконечном цикле
|
||||
while (!(collider_ptr->ready)); // Постоянно опрашиваем регистр ready,
|
||||
// пока тот не станет равен 1.
|
||||
while(1){ // В бесконечном цикле
|
||||
while (!(collider_ptr->ready)); // Постоянно опрашиваем регистр ready,
|
||||
// пока тот не станет равен 1.
|
||||
|
||||
// После чего запускаем коллайдер, записав
|
||||
collider_ptr->start = 1; // 1 в контрольный регистр start
|
||||
// После чего запускаем коллайдер,
|
||||
collider_ptr->start = 1; // записав 1 в контрольный регистр start
|
||||
collider_mem[0] += collider_mem[1]; // Пример взаимодействия с памятью,
|
||||
// Используя объявленный в platform.h
|
||||
// указатель в качестве имени массива.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -671,6 +673,8 @@ extern "C" void int_handler()
|
||||
}
|
||||
```
|
||||
|
||||
Если одним из ваших периферийных устройств был VGA-контроллер, использовать не указатель на структуру, а объявленные в том же файле указатели на байты: `char_map`, `color_map`, `tiff_map`. Как вы знаете, указатель может использоваться в качестве имени массива, а значит вы можете обращаться к нужному вам байту в соответствующей области памяти VGA-контроллера как к элементу массива. Например, для того, чтобы записать символ в шестое знакоместо второй строки, вам необходимо будет обратиться к `char_map[2*80+6]` (2*80 — индекс начала второй строки).
|
||||
|
||||
---
|
||||
|
||||
### Порядок выполнения задания
|
||||
|
Reference in New Issue
Block a user