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+). Итак, начнём с фундаментальных вещей.
Многозадачность - это когда одновременно несколько программ (задач), находящихся в памяти компьютера, разделяют между собой различные системные ресурсы (процессор, память, доступ к устройствам и т.д.). В общих чертах, многозадачность в AmigaOS основана на том, что программы проводят большинство времени в "спячке" (waiting). Они ждут определённых событий (events) типа нажатия на клавишу, движения мышью и т.д.. Пока программа ждёт, процессор освобождается для задач "требующих" его (ready), например rendering, игры, mpeg, CPU-метры.
AmigaOS делает так, что каждой задаче (task) выделяется определённое количество времени процессора для её обработки, это всё происходит настолько быстро (task switch), что мы видим на экране "одновременно" выполняющиеся программы. Так как ОС полностью управляет переключением (switch) между задачами для процессора, то с точки зрения любой программы, она оказывается "полноправной владелицей" компьютера (как в MS-DOS).
AmigaOS полностью управляет распределением различных ресурсов между задачами. Это очень важно, для того чтобы независимо выполняющиеся программы не вступали между собой в конфликты. Представьте, что будет если сразу несколько задач будут контролировать передачу данных по параллельному порту! Для того, чтобы получить доступ к какому-нибудь ресурсу, ОС предоставляет для него специальные функции. Например, для получения в своё распоряжение определённое количество памяти, нужно вызвать функцию AllocMem().
Если вы хотите получить контроль над ресурсом, обязательно вызывайте соответствующие функции, другие программы могут его уже использовать - например аудио каналы. И ещё, всё что вы "забрали" у ОС, должны ей "вернуть", например каждому
AllocMem()
должен соответствовать свойFreeMem()
.
Большинство возможностей, которые вам предоставляет 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().
Кроме "разделяемых" библиотек в AmigaOS существуют похожие на них (по интерфейсу) "устройства" и "ресурсы". Они так же содержат функции и т.д.
- Устройства представляют из себя программный интерфейс для доступа к реальным ("printer.device") или логическим устройствам ("console.device").
- Ресурсы предоставляют полный (low-level) контроль над некоторыми устройствами компьютера ("disk.resource", "battclock.resource").
Ни что в распределении памяти AmigaOS не имеет постоянного адреса, кроме адреса
00000004
в котором содержится адрес "exec.library". В ОС могут одновременно работать множество программ, каждая может иметь свой экран (screen), память, открытые файлы и т.д. Для того чтобы как-то это всё контролировать AmigaOS динамически создаёт (удаляет) "связанные списки" (link list)."связанный список" - это цепочка элементов данных, каждый элемент которой содержит указатель на следующий элемент данных и т.д. Если знать указатель на первый элемент списка, то можно "добраться" до любого. Вы также можете создавать свои "связанные списки" для своих нужд.
Таким образом, AmigaOS "помнит" обо всём.
Exec - сердце AmigaOS. Он отвечает за многозадачность, ресурсы, управляет библиотеками, связанными списками и т.д., и т.п.
В следующей статье речь пойдёт о "новом" Графическом Интерфейсе Пользователя (GUI) AmigaOS - MUI (Magic User Interface) и будет написана первая объектно-ориентированная программа с GUI.
© 1998-2006 Андрей Черешнев | Часть вторая | Начало |