Программирование в AmigaOS. Часть первая

Андрей Черешнев

1. Введение

AmigaOS - одна из самых совершенных операционных систем созданных за всю историю компьютеров. Объединяя в себе всё самое современное - полностью 32-bit, вытесняющая многозадачность, динамическая архитектура памяти, Plug`n`Play, "разделяемые" библиотеки (DLL в Windows) и т.д.; имея большие возможности расширения (улучшения) - система DataTypes, интерфейс BOOPSI для новых Объектно-Ориентированных GUI (Графический Интерфейс Пользователя), CGX, система локализации и т.д., а также очень рациональное использование ресурсов компьютера, делают её просто уникальной ОС.

Я хотел бы начать цикл статей посвящённых "современному" программированию в AmigaOS с того, что рассказать о некоторых "требованиях" предъявляемых ОС к большинству программистов. Во-первых, хотя бы начальные знания языка "С" (не С++!). Во-вторых, вам будет нужен компилятор "С" и файлы заголовки (.h) к нему, лучше всего купить SAS/С или StormC++, они содержат всё необходимое. Для программирования в MUI (ОО GUI) вам понадобятся два архива - "mui38usr.lha" (наверняка MUI у вас уже есть) и "mui38dev.lha". Их можно взять из Интернет ( www.sasg.com), купить на CD или дискетах.

Все статьи будут рассчитаны на пользователей AmigaOS начиная с версии 2.04 (А500+). Итак, начнём с фундаментальных вещей.

1.1 Многозадачность

Многозадачность - это когда одновременно несколько программ (задач), находящихся в памяти компьютера, разделяют между собой различные системные ресурсы (процессор, память, доступ к устройствам и т.д.). В общих чертах, многозадачность в AmigaOS основана на том, что программы проводят большинство времени в "спячке" (waiting). Они ждут определённых событий (events) типа нажатия на клавишу, движения мышью и т.д.. Пока программа ждёт, процессор освобождается для задач "требующих" его (ready), например rendering, игры, mpeg, CPU-метры.

1.2 "Вытесняющая" (preemptive) многозадачность

AmigaOS делает так, что каждой задаче (task) выделяется определённое количество времени процессора для её обработки, это всё происходит настолько быстро (task switch), что мы видим на экране "одновременно" выполняющиеся программы. Так как ОС полностью управляет переключением (switch) между задачами для процессора, то с точки зрения любой программы, она оказывается "полноправной владелицей" компьютера (как в MS-DOS).

1.3 Распределение ресурсов

AmigaOS полностью управляет распределением различных ресурсов между задачами. Это очень важно, для того чтобы независимо выполняющиеся программы не вступали между собой в конфликты. Представьте, что будет если сразу несколько задач будут контролировать передачу данных по параллельному порту! Для того, чтобы получить доступ к какому-нибудь ресурсу, ОС предоставляет для него специальные функции. Например, для получения в своё распоряжение определённое количество памяти, нужно вызвать функцию AllocMem().

Если вы хотите получить контроль над ресурсом, обязательно вызывайте соответствующие функции, другие программы могут его уже использовать - например аудио каналы. И ещё, всё что вы "забрали" у ОС, должны ей "вернуть", например каждому AllocMem() должен соответствовать свой FreeMem().

1.4 "Разделяемые" (shared) библиотеки

Большинство возможностей, которые вам предоставляет AmigaOS организованы в группы функций, называемые библиотеками. Они отличаются от библиотек, которые вы линкуете (link) с .o файлами программы тем, что одной "копией" библиотеки в памяти, могут пользоваться сразу несколько программ одновременно.

Разделяемые библиотеки могут находиться или в ROM AmigaOS (например, exec.library) или на логическом устройстве "LIBS:". Чтобы вызвать библиотечную функцию, нужно сначала "открыть" эту библиотеку функцией OpenLibrary(). Эта функция находится в "exec.library" (библиотека автоматически открывается при загрузке ОС).

Пример использования OpenLibrary() для "muimaster.library":

#include <libraries/mui.h>

#include <proto/muimaster.h>
#include <proto/exec.h>

#include <stdio.h>
#include <stdlib.h>

struct Library *MUIMasterBase; /* обязательно глобальная!, имя
                                  переменной можно найти в
                                  "proto/имя_библиотеки.h" */
int main(void)
{
   MUIMasterBase = OpenLibrary("muimaster.library", MUIMASTER_VMIN);
   if(!MUIMasterBase)
   {
      puts("Can't open muimaster.library");
      return(20);
   }
   /* Здесь начинается наша программа, пока что */
   puts("OK");

   CloseLibrary(MUIMasterBase); /* не забывайте! */
   return(0);
}
В директории libraries/ или(и) в имя_библотеки/ находятся файлы-заголовки, содержащие необходимые определения структур, констант и т.д. для библиотеки. В proto/ находятся файлы-заголовки всех библиотек которые вы можете использовать, в этих файлах находятся прототипы функций библиотеки, причём если вы хотите воспользоваться функциями библиотеки которая входит в состав AmigaOS (например asl.library), то вам достаточно просто написать #include <proto/имя_библиотеки.h>:
#include <libraries/asl.h>

#include <proto/asl.h>
#include <proto/exec.h>

int main(void)
{
   /* Здесь начинается ваша программа, использующая asl.library */

   return(0);
}
Функция OpenLibrary() возвращает указатель на библиотеку или 0 если не смогла её открыть. OpenLibrary() имеет следующие аргументы: имя файла библиотеки и минимальная версия этой библиотеки в которой содержатся нужные вам функции. Например, для muimaster.library в "libraries/mui.h" определены:
#define MUIMASTER_VMIN    11
#define MUIMASTER_VLATEST 19
Когда ваша программа заканчивает свою работу, всем OpenLibrary() должны соответствовать CloseLibrary().

1.5 Устройства (device) и Ресурсы (resource)

Кроме "разделяемых" библиотек в AmigaOS существуют похожие на них (по интерфейсу) "устройства" и "ресурсы". Они так же содержат функции и т.д.

1.6 Динамическая архитектура памяти AmigaOS

Ни что в распределении памяти AmigaOS не имеет постоянного адреса, кроме адреса 00000004 в котором содержится адрес "exec.library". В ОС могут одновременно работать множество программ, каждая может иметь свой экран (screen), память, открытые файлы и т.д. Для того чтобы как-то это всё контролировать AmigaOS динамически создаёт (удаляет) "связанные списки" (link list).

"связанный список" - это цепочка элементов данных, каждый элемент которой содержит указатель на следующий элемент данных и т.д. Если знать указатель на первый элемент списка, то можно "добраться" до любого. Вы также можете создавать свои "связанные списки" для своих нужд.

Таким образом, AmigaOS "помнит" обо всём.

1.7 Exec (exec.library) - системный исполнитель

Exec - сердце AmigaOS. Он отвечает за многозадачность, ресурсы, управляет библиотеками, связанными списками и т.д., и т.п.

В следующей статье речь пойдёт о "новом" Графическом Интерфейсе Пользователя (GUI) AmigaOS - MUI (Magic User Interface) и будет написана первая объектно-ориентированная программа с GUI.


© 1998-2006  Андрей Черешнев
Часть вторая | Начало
Сайт создан в системе uCoz