Введение
За последние 9 лет (c 1993) в мире персональных компьютеров появился новый участник – карманный персональный компьютер (КПК). Большую роль в распространении этого вида компьютерной техники сыграли устройства на базе операционной системы PalmOS, которая появилась в 1996 году. За последующие 6 лет в свет вышло более 5 версий PalmOS (1.0 – 4.1). Большим изменениям PalmOS никогда не подвергалась, причины это кроются в том, что для PalmOS создавалось очень много программ (это продолжается и по сей день), и вторая причина это то, что аппаратная часть КПК на базе PalmOS всегда оставалась неизменной (см. таблицу).
Пятая версия PalmOS, которая появилась несколько месяцев назад, полностью переработана для работы на новой аппаратуре. КПК на базе PalmOS 5 еще не успели распространиться, и показать себя в работе.
В этом обзоре рассматривается структура операционной системы PalmOS версий 3.0-4.1. Предполагается, что читатель знаком с операционной системой PalmOS как пользователь.
Таблица характеристик обычного КПК (PalmOS версии 3.0 – 4.1):
характеристика |
описание |
Габариты |
Приблизительно 7*11*1.5 см. |
Вес |
от 100 до 250 гр. |
Процессор |
Motorolla DragonBall от 16 до 33 Мгц |
обьем памяти (RAM) |
От 1 до 8 Мб |
Экран |
160*160, Сенсорный, Ч/Б / 4 / 16 градаций серого или цветной |
Функциональные клавиши |
От 6 до 9 |
Ввод текста |
Графити (существуют подключаемые клавиатуры) |
Дополнительная аппаратура |
Инфракрасный порт, динамик, микрофон, USB, COM . |
Общие сведения
- PalmOS однозадачная операционная система.
- Поддерживает графический интерфейс (диалоги, кнопки, списки, шрифты, … )
- Приложения PalmOS одно-потоковые, событийно ориентированные.
- В PalmOS есть своя файловая система.
- Пользователь в PalmOS не работает ни с папками, ни с файлами. Пользователь “видит” только приложения и документы с которыми работает данное приложение.
- В PalmOS нет таких понятий: “загрузка операционной системы” и “завершение работы”. Вместо этого PalmOS “умеет делать” легкий рестарт (Reset) и полный рестарт (Hard Reset).
- PalmOS Состоит из модулей (Manager) и библиотек (Library), например Memory Manager – модуль управления памятью, Data Manager – модуль управления файловой системой, Библиотека TCP/IP. (см. рис 1). Модуль это неотъемлемая часть PalmOS, а библиотеки можно добавлять и удалять.
- Каждый модуль и библиотека предоставляет документированное API для приложений.
- Автоматически управляет питанием. Например, PalmOS может полностью остановить процессор, при этом приложение ничего не заметит.
- PalmOS является ОС с микро ядром (Micro Kernel OS), основное качество такого типа ОС это гарантировано малое время реакции на любое внешние событие. (микро ядро AMX, разработано фирмой Kadak)
- PalmOS поддерживает только один процессор - Motorolla DragonBall 68К ,
рисунок с PalmOS SDK - горизонтальный срез.
Память
Система управления памятью одна из важнейших частей PalmOS которая во многом определяет архитектуру операционной системы и ее особенности.
Физически память расположена на картах (Card) памяти, которые нумеруются – 0, 1, … . Каждая карта памяти может иметь RAM и ROM сегменты (RAM – random access memory, ROM – read only memory).
PalmOS делит все пространство RAM сегмента на Dynamic Heap и Storage Heap. Storage Heap это эквивалент диска (HDD), там находятся только файлы. Dynamic Heap это эквивалент обычной памяти (Heap). В Dynamic Heap находятся все динамические объекты приложения, операционной системы, библиотек, модулей, а также стек (в момент выполнения, код приложения не находится в Dynamic Heap).
В PalmOS код приложения не загружается в Dynamic Heap для выполнения. Зачем, если приложение и так в памяти ? выполнение происходит по месту (inplace), т.е. все программы, как и сама PalmOS, всегда выполняются прямо из Storage Heap. Это прозрачно для приложений.
Т.к. ROM это сегмент памяти “только для чтения”, то соответственно там находится только файлы. Например, большинство моделей КПК имеет карту памяти – Card0, и в ROM сегменте этой карты находятся файлы операционной системы со встроенными приложениями. Приложение может получить список всех карт, и указать с какой картой оно будет работать (например, файловый менэджер “Filez” позволяет выбрать номер карты с которой нужно получить список всех файлов).
Размеры Dynamic Heap и Storage Heap определяются операционной системой при инициализации и зависят от общего размера памяти в КПК. Обычно размер Dynamic Heap 32-256Кб. Работать с Памятью можно через API модуля Memory Manager. Этот модуль поддерживает всю внутреннюю структуру памяти, его используют все остальные модули.
Основные API функции модуля Memory Manager:
MemPtr MemPtrNew (UInt32 size) |
выделить блок памяти и получить указатель на него |
MemHandle MemHandleNew (UInt32 ) |
выделить блок памяти и получить его дескриптор (handle) |
MemPtr MemHandleLock (MemHandle) |
получить указатель на блок памяти от его дескриптора т.е. “заблокировать” дескриптор. |
Err MemHandleUnLock (MemHandle) |
“разблокировать” дескриптор, указатель от дескриптора уже недействующий. |
Err MemHandleFree (MemHandle) |
Освободить память |
Err MemPtrFree (MemPtr)
|
Освободить память |
Если приложение запросит слишком большой блок памяти, а доступны будут только маленькие блоки, то PalmOS произведет фоновую дефрагментацию памяти, при этом из-за перемещения существующих блоков, изменятся их базовые указатели. Чтобы изменение указателей не повлияло на приложение - существуют дескрипторы (handle) это указатель на указатель блока. Дескриптор это такой же указатель на память, но для того чтобы начать работать с этим блоком необходимо его “заблокировать” т.е. получить указатель который будет оставаться действительным, даже если произойдет фоновая дефрагментация памяти.
Если приложение выделяет память, не используя дескриптор (MemPtrNew), либо получает указатель от дескриптора, т.е. “блокирует” его (MemHandleLock), то PalmOS не будет перемещать такой блок при дефрагментации.
Не смотря на то что механизм дескрипторов сложнее чем просто работа с указателями , избежать его нельзя т.к. многие функции API Системных Модулей работают с дескрипторами. т.е. следует заранее позаботится о том чтобы большие блоки данных в программе были представлены в виде дескрипторов. Для блока памяти также есть такое понятие как LocalID – специальный номер, по которому можно узнать в какой памяти и на какой карте памяти находится блок памяти.
Основные типы данных с которыми оперирует модуль управления памятью (Memory Manager): MemHandle – дескриптор блока памяти, MemPtr – указатель на блок памяти (можно явно привести к указателю на строку, число, void), LocalID – номер блока памяти, Uint32 – целое, беззнаковое число (4 байта), Err – номер ошибки.
Вся Dynamic Heap память доступна для любого приложения на чтение\запись и PalmOS не следит к каким адресам обращается приложение. Когда приложение завершает свою работу вся память, выделенная для приложения, автоматически очищается для нового приложения.
Ранее упоминалось, что в Динамической памяти (Dynamic Heap) находятся объекты операционной системы, модулей и системных библиотек. Любые ошибки приложения в работе с динамической памятью могут сразу нарушить работоспособность всей ОС.
Если в КПК вставить дополнительное устройство (такие как дополнительные устройства для слотов springboard для моделей Visor, или флеш карточки), например модем , то оно возможно будет содержать в себе карту памяти со своими программами, это карта будет видна в системе как Card1, или Card2 если Card1 уже есть. 1 карта может содержать максимум 512 Мб.
Файловая система
PalmOS имеет свою файловую систему, которая находится в Storage Heap Главная особенность файловой системы это – отсутствие директорий
В PalmOS файл называется database, как и в любой ОС у него есть имя, тип, размер, другие атрибуты. Database в свою очередь разбит на records (Запись). У Записи есть такие атрибуты как: порядковый номер, размер, и др. . В Записях уже непосредственно хранятся данные.
Можно сказать, что database это аналог директории, а record это аналог файла т.к. приложение сначала открывает database а потом в ней открывает record на чтение или запись.
Максимальный размер записи 64Кб.
Файлы в PalmOS могут быть 2 видов – просто файлы (database) и ресурсные файлы (resource database). Файлы содержат только Записи, а ресурсные файлы содержат только Ресурсы – такие же Записи, но просто называются ресурсы. Например исполняемый файл приложения (у которого тип “appl”) является ресурсным файлом, в нем есть ресурсы (записи) – версия, исполняемый код, главная форма, строки, меню, картинки и т.д.
За файловую систему отвечают модули: DataManager и ResourceManager. Все они используют модуль MemoryManager для работы с памятью (Storage Heap) .
Основные свойства файла (Database):
свойство |
длина |
описание |
Name |
32 |
Имя файла |
Type |
4 |
Тип файла ( например “appl” – приложение) |
CreatorID |
4 |
идентификатор создателя файла |
Size |
4 |
Размер файла |
ReadOnly |
1 |
Файл только для чтения. |
Backup |
1 |
Нужно создать резервную копию файла на настольном компьютере владельца КПК (т.е. синхронизировать) |
Copy protect |
1 |
файл нельзя копировать путем передачи через инфракрасный порт (IR-beam) |
Hidden |
1 |
Не показывать этот файл пользователю |
Launchable |
1 |
это обычный файл но он может быть запущен на выполнение как приложение. |
Open |
1 |
файл открыт |
Resource DB |
1 |
Ресурсный фал |
Date |
|
Дата Создания, Изменения, Сихронизации |
Modification Num |
|
Число произведенных изменений в файле с момента его создания (например удаление, добавление, изменение записи) |
CreatorID этот номер (идентификатор) который устанавливается разработчиком приложения. Все файлы этого приложения должны иметь такой же идентификатор, для того чтобы операционная система могла точно определить принадлежность файла к приложению. Каждое PalmOS приложения имеет свой уникальный идентификатор. На уникальность его можно проверить на сайте www.palmos.com . Если все же случится так, что на одном устройстве (КПК) окажутся приложения с одинаковыми идентификаторами, то они будут конфликтовать и это приведет к потере данных этих приложений. Опреционная система не сообщит пользователю о таком конфликте.
Свойиства Записи (Record) :
|
длина |
|
Busy |
1 |
Запись открыта и заблокирована кем-либо. |
Delete |
1 |
Запись помечена на удаление (физически ее удалит синхронизатор после синхронизации) |
Dirty |
1 |
Запись изменилась после последней Синхронизации (т.е. необходимо ее синхронизировать). |
Secret |
1 |
Запись помечена как Private (приложение обязано скрыть ее от пользователя) |
Далее в тексте для простоты файл (database) в PalmOS будем называть просто “файл”.
Чтобы открыть файл нужно знать его LocalID и номер карты, где он находится (обычно 0). LocalID файла (еще называется как Database ID) это LocalID блока памяти который содержит информацию об этом файле (количество записей, свойства, дата).
Основные API функции модуля DataManager:
Err DmGetNextDatabaseByTypeCreator (Boolean newSearch, DmSearchStatePtr stateInfoP, UInt32 type, UInt32 creator, Boolean onlyLatestVers, UInt16* cardNoP, LocalID* dbIDP)
получить LocalID всех файлов, по типу и идентификатору создателя.
|
LocalID DmFindDatabase (UInt16 cardNo, const Char* nameP)
Еще один способ получить LocalID файла
|
DmOpenRef DmOpenDatabase (UInt16 cardNo, LocalID dbID, UInt16 mode)
открыть файл по номеру карты и его LocalID
|
MemHandle DmQueryRecord (DmOpenRef dbP, UInt16 index)
Открыть запись(record) на чтение или запись
|
Err DmWrite (void* recordP, UInt32 offset, const void * srcP, UInt32 bytes)
Записать данные в запись
|
Err DmCloseDatabase (DmOpenRef dbP)
Закрыть файл
|
После того как файл открыть, в файле открывается Запись (DmQueryRecord). При открытии Записи не нужно предоставлять буфер для считываемых данных, вместо этого функция DmQueryRecord сама возвращает указатель на блок памяти, где находятся данные (тот же самый буфер). Благодаря этому механизму, Запись любой длины открывается одинаково быстро.
Записывать в Запись можно только с помощью специальной функции (по соображениям безопасности) другое использование указателя на Запись сразу вызывает ошибку с последующим рестартом КПК .
PalmOS позволяет работать с файлами по классической схеме (fopen, fread, fclose) не обращая на особенности строения файлов.
Создание приложений, Инструментарий, POSE
Программы для PalmOS обычно создаются на С (С++), однако существуют компиляторы для других языков: Java, Pascal, Basic, Assembler. (для запуска Java приложений нужно будет дополнительно установить Java Машину).
Самая популярная коммерческая среда разработки это CodeWarrior, так-же есть Falch.Net, VFDIDE, PilotMAG - все эти "визуальные" среды разработки имеют редактор кода с синтаксической подсветкой кода и другие функции. (управление проектом, встроенный отладчик, редактор ресурсов, ...). Самая популярная некоммерческая среда это PRC-Tools (компилятор gcc под процессор Motorola DragonBall 68K). Большинство разработчиков предпочитают PRC-Tools, т.к. этот инструментарий бесплатный, популярный, и официально поддерживается компанией PalmSource, Inc (владелец PalmOS).
В качестве напутствия для программистов можно сказать, что PalmOS это очень открытая платформа, как для разработчиков приложений, так и для разработчиков аппаратуры (дополнительных модулей). Компания PalmSource Inc создала сообщество разработчиков,
Palm Alliance Program - сообщество Палм программистов, там можно получить ROM файлы практически с любой версией PalmOS. также можно получить "debug" ROMs с отладочными версиями PalmOS (для системных программистов)
На сайте www.palmos.com всегда доступна полная документация для PalmOS, а также различные FAQ, Knowledge Base и конференции. Написано много книг и публикаций для программистов, в интернете можно найти кучу исходных тестов по различным направлениям. Еще компания Palm Computing (ныне PalmSource,Inc) создала эмулятор операционной системы PalmOS, для тестирования приложений на настольном компьютере.
POSE – PalmOS Emulator
(под Windows , Mac, Unix). Для работы эмулятора нужен ROM файл, это файл с “образом” операционной системы PalmOS какой-то определенной версии. Его можно “вытащить” из КПК либо скачать из интернета (см. ссылки). После запуска эмулятора на экране появляется “картинка” КПК – можно мышкой кликать на экране КПК как стилусом (даже писать символы граффити), можно запускать приложения.
Преимущества POSE:
Процесс загрузки приложения в POSE намного быстрее, чем в реальный КПК, что намного ускоряет процесс тестирования. Не нужно каждый раз синхронизироваться.
В POSE можно сохранять текущее состояние КПК, а потом к нему возвращаться.
Source-Level отладка приложений намного проще с POSE.
В POSE можно делать скриншоты, и применять Gremlins – искусственный “неопытный” пользователь (который резво тыкает стилусом куда попало).
С помощью POSE можно увидеть различные КПК с PalmOS разных версий с различным размером памяти, без наличия самого КПК.
в POSE можно регулировать – уровень системных ошибок, на которые следует обращать внимание (например, прямой доступ к аппаратуре, экрану, ROM, …)
Итак, POSE это MustHave для любого PalmOS программиста.
Чтобы создать простое приложение для PalmOS с помощью PRC-Tools, необходимо установить CygWin(эмуляция unix среды в Windiws), PRC-Tools (gcc компилятор), PilRc for Win32 (компилятор ресурсов), PalmOS SDK 3.5 , PalmOS Emulator. Дополнительные сведения об установке можно найти в интернете.
Простое Приложение состоит из 3 файлов: исходный код на С или другом языке, и два файла ресурсов приложения (resource.h, resource.rcp).
Каждое Palm приложение имеет уникальный CreatorID, это 4 байта, например “MyAp”. Палм использует CrID для того что-бы различать приложения и его файлы. Если два приложения имеют одинаковый CrID то одно из них может затереть второе при синхронизации, либо повредить файлы другого приложения. Для каждого приложения которое “выходит в мир” нужно регистрировать CreatorID на сайте www.palmos.com
После компиляции и сборки получается файл с расширением “prc” – это файл приложения для PalmOS, его можно поместить в эмулятор для тестирования (или инсталлировать в КПК через HotSync).
В отличии от PRC-Tools , CodeWarrior (версия 7) это полностью самодостаточная среда для создания приложений для PalmOS, там есть все что нужно. Ее можно сравнить с MS Visual C++ 6.0. . В этой среде работа над проектом приложения выполняется в одном окне. При создании приложения создается его заготовка (шаблон приложения). CodeWarrior может работать с внешней системой управления исходным кодом приложения (например MS Visual SourceSave).
Выполнение приложений
PalmOS однозадачная операционная система т.е. активным бывает только одно приложение. Когда пользователь запускает другое приложение, то предыдущее текущее приложение завершает свою работу (все данные автоматически сохраняются).
Точка входа в приложение – функция PilotMain.
UInt32 PilotMain (UInt16 launchCode, void *cmdPBP, UInt16 launchFlags).
На вход этой функции передается несколько параметров, самый важный параметр это - LaunchCode - код запуска приложения. SysAppLaunchCmdNormalLaunch это код нормального запуска, - приложение должно показать свое главное окно. Иногда операционная система вызывает приложение с целью “сообщить” что-то важное или “узнать” что-то от приложения (например, при рестарте КПК или синхронизации или в случае глобального поиска), в этом случает приложение обрабатывает событие и возвращает управление.
на рисунке показано схема работы приложения.
Вначале приложение создает главную форму (FrmGotoForm). Затем в бесконечном цикле приложение ожидает события (EvtGetEvent) от пользователя или системы. Если происходит событие, приложение определяет кому оно предназначено, например если событие произошло на форме (окно) приложения - вызвать обработчик FormEvtHandler. При закрытии приложения поступает событие – AppStopEvent.
!!! расказать подробнее
За событийную модель в PalmOS отвечает модуль EventManager.
Управление Питанием
Операционная система PalmOS автоматически управляет питанием компьютера. Например, по истечении одной минуты бездействия, КПК выключается; если приложение не выполняет никакой работы, то процессор приостанавливает свою работу. Для приложений это прозрачно. Существует 3 состояния, в которых может находиться устройство:
Doze mode – Режим бездействия, Дисплей включен, приложение активно, но оно ничего не выполняет. Процессор готов к работе, но не выполняет инструкций (halted). Это состояние активируется после вызова функции EvtGetEvent. (это случается когда пользователь не прикасается стилусом к экрану, и не нажимает кнопки)
Sleep mode – Режим “сна”. Активируется, если Doze mode по времени продолжается дольше установленного тайм-аута (обычно одна минута). Выключаются: Дисплей, дигитайзер (сенсоры экрана), главные часы, работает только контролер прерываний. Все устройства КПК переводятся на режим экономии питания, система ждет событий от кнопок либо от часов реального времени.
Running mode – Режим активной работы, Дисплей включен, приложение активно, процессор выполняет инструкции. Все устройства готовы к работе либо работают. Обычно это происходит если функция EvtGetEvent возвращает какое-то событие и приложение его обрабатывает. (например, пользователь работает стилусом, жмет на кнопки, или приложение выполняет работу)
В режиме Running mode КПК находится 5%-10% от времени проведенного в Doze mode (когда экран включен, а пользователь ничего не делает), это объясняется тем , что пользователь обычно большую часть времени изучает информацию на дисплее нежели производит действия. В активных играх это конечно не соблюдается т.к. пользователь постоянно жмет на кнопки или тычет стилусом в экран. Для того чтобы приложения не противоречили этой стратегии нужно программистам следует придерживаться определенных правил событийной модели в PalmOS (см. в SDK ).
PalmOS GUI
PalmOS это графическая операционная система обладающая средствами для создания практически любого GUI (graphical user interface).
Базовые элементы GUI - это Форма (Form), Диалог, Меню. Плюс традиционные элементы любого графического интерфейса: кнопки, флажки (checkbox), списки, поля с текстом, селекторы, таблицы, картинки.
Экран имеет размеры 160*160 точек, поэтому при проектировании интерфейса приложении нужно постараться его не загромождать, а сделать максимально понятным пользователю.
Интерфейс создается в виде словесного описания в файле ресурсов (см. пример приложения). В этом файле описывается, какие формы будет показывать приложение и какие элементы (кнопки, надписи ...) будут на формах.
Для программистов на Win API можно сказать проще: для Палм приложения нужно создавать файл ресурсов со всеми диалогами, картинками и строками. Этот файл имеет почти такой-де синтаксис как и у RC файлов.
Форма
Обычно приложение содержит несколько Форм и одно Меню, форма может занимать только часть экрана. Все формы модальные, т.е. пока одна форма активна, другая форма не может обрабатывать события
не модальность бессмысленна на маленьком экране, вносит осложнения для пользователя и требует больших усилий со стороны ОС, следовательно и большего количества кода.
События которые происходят на форме (нажатие кнопки, ввод буквы, команда меню выделение строки списка) приходят в процедуру – обработчик сообщений формы. В это процедуре можно определить тип события, и считать данные с элементов на форме (например тест из текстового поля или состояние флажка)
Меню
Меню в PalmOS существует, для того чтобы “снять нагрузку” с формы и спрятать в себе все второстепенные команды приложения. Однако нужно помнить что, для того чтобы добраться до меню пользователь делает 3 клика стилусом, поэтому там обычно находятся редко употребляемые команды.
Command Shortcut (ярлык к меню)– это росчерк граффити, который ускоряет выполнение комманд из меню. Росчерк делается в два этапа – обратный слэш + буква. Ярлыки задаются в файле ресурсов.
Для быстрого доступа к командам из меню приложение может использовать Command Toolbar – это панель с которая появляется нижней части экрана , после росчерка “/”. (введено в PalmOS 4.0)
Ограничения Palm GUI:
Для элементов интерфейса отсутствует такое понятие как Disabled.
Меню не всегда видно на экране.
Меню не имеет вложенных подменю.
Отсутствуют такие элементы интерфейса как: StatusBar, TAB control, Контекстные меню
В диалогах нет контекстной помощи и всплывающих подсказок (ToolTips). В место этого каждая форма может иметь текст помощи, который открывается, если ткнуть на значке “?” у формы.
Интерфейс можно создавать динамически, а также создавать нестандартные элементы, но это довольно сложная задача.
Графика
В PalmOS есть средства для работы с простейшей графикой: точки, линии, круги, прямоугольники, заливка, инверсия, картинки. Поддержку графики осуществляет модуль Window Manager, с помощью его API функций можно устанавливать цвет пера, заливки, текущий шрифт и другие параметры. Для создания “быстрой” графики приложение может воспользоваться видео буфером – это область памяти доступная для чтения/записи, содержимое этой области сразу же отображается на экране.
PalmOS 4.0 поддерживает 1-, 2-, 4- 8 и 16-битовые цвета и оттенки серого а PalmOS 3.0 поддерживает только 4 градации серого.
Сервис ОС
Для того чтобы приложения могли в полной мере воспользоваться всеми возможностями аппаратуры и операционной системы, существует несколько модулей, которые предоставляют дополнительный сервис для приложений.
В PalmOS все API функции модулей имеют префикс из 2-3 букв, который обозначает к какому модулю приналежит функция, например в функциях DmOpenDatabase, MemFreePtr Dm - означает Data Manager, Mem - Memory Manager. Если знать все префиксы то становится удобнее читать исходный код программ.
Таблица префиксов к именам функций различных модулей:
Имя модуля |
Префикс |
имени функций |
Alarm Manager |
Alm |
программируемый будильник |
Time Manager |
Tim, Date |
работа с датой |
Sound Manager |
Snd |
работа со звуком |
System Manager |
Sys |
системный сервис |
Form Manager |
Frm |
работа с формами |
Всем программистам, особенно тем кто “перешёл” на PalmOS с другой системы рекомендуется прочитать главу “Good Design Practices” из документации по PalmOS (Palm OS Programmer's Companion). В этой главе рассматриваются наиболее отличительные моменты PalmOS приложения, эту главу нужно прочитать несколько раз по мере ознакомления с PalmOS.
System Features
Системные Характеристики - аналог переменных окружения в ДОС. Это глобальное значение (только 4 байта) которое можно установить и обращаться к этому значению по мере необходимости из приложения или библиотеки. После легкого рестарта эти значения пропадают. Есть системные характеристики, например версия операционной системы - sysFtrNumROMVersion, или версии какой-то библиотеки. Обозначения всех системных характеристик даны в файле SystemMgr.h .
Err FtrSet (UInt32 creator, UInt16 featureNum, UInt32 newValue) – установка значения
Err FtrGet (UInt32 creator, UInt16 featureNum, UInt32 *valueP) – получение зачения
При установке или считывании характеристик используется идентификатор создателя приложения. Для получения системных характеристик (Features) вместо идентификатора создателя используется номер - sysFtrCreator. Этим сервисом удобно пользоваться если необходимо хранить какие ни будь 2-3 числовых настройки, или если функции доступа к файлам временно недоступны (например из “хаков”, см. Расширения PalmOS)
Preferences
Аналог реестра в Windows. Это общее хранилище для хранения настроек от всех приложений. Существую также системные настройки - там хранятся значения типа формата даты и времени, единиц измерения.
Звук
SoundManager позволяет генерировать простые сигналы, разной частоты и длительности.
PalmOS, начиная с версии 3.5 поддерживает воспроизведение стандартных MIDI-звуков.
Notifications
Приложение может получать различные уведомления о системных событиях, например: вставление / извлечение модуля расширения, удаление файла, изменение настроек экрана или сети, изменение времени, подключение / отключение от сети, переход в режим “сна”, легкий рестарт, синхронизация.
Уведомления “приходят” в приложения в виде кода запуска (launch code).
Attentions and alarms
Приложения может поставить “будильник” для себя, когда время подойдет то Alarm Manager сообщит приложению что время пришло, если приложение закрыто то PalmOS запустит его. А с помощью Attention Manager приложение показывает диалог с сообщением, и если пользователь захочет, то может отложить это событие на пару минут (Snooze).
Рестарт операционной системы
Приложение может самостоятельно сделать легкую перегрузку операционной систему.
Легкий рестарт - это отчистка Dynamic Heap памяти, проверка целостности Storage Heap , и дефрагментация всей памяти.
Полный Рестарт это обнуление всей памяти (уничтожение всей файловой системы) и создание файловой системы заново, потом туда копируются приложения операционной системы и производится установка настроек, в которой принимает участие пользователь.
Комуникации
Инфракрасный порт, последовательный порт, и сеть - это 3 основных типа коммуникаций в PalmOS. Приложение может пользоваться инфракрасным портом на высоком уровне – это пересылка файлов между КПК, и на низком уровень эта работа с портом напрямую.
С помощью TCP/IP протокола можно работать с интернетом или локальной сетью. В PalmOS реализованы Berkley Sockets функции, можно работать в асинхронном или синхронном режимах (не блокируемые вызовы и блокируемые)
Совместимость версий
Этот вопрос очень важный для PalmOS, сейчас самые распространенные версии 3.0 – 4.0. Концептуальной разницы в них нет, главное отличие в сервисе операционной системы для приложений. Feature Set – список того, что нового появилось в определенной версии PalmOS. В документации PalmOS (Palm OS Programmer's Companion) есть глава Compatibility Guide – в которой перечисляются новые функции константы и другие вещи которые появились после PalmOS 1.0 .
Приложение должно проверять версию операционной системы, чтобы быть уверенным что необходимый сервис присутствует в данной версии PalmOS. Например, Alarm Manager присутствует не во всех версиях.
Расширения PalmOS
Как уже ранее говорилось все приложения вызывают API функции PalmOS для выполнения каких либо действий , например открытие файла, вывод на экран, ввод/вывод. Но PalmOS так устроена, что в ней можно переопределять поведение этих функций.
в операционной системе Windows тоже можно подменить любую API функцию, но в PalmOS этот механизм упрощен и официально поддерживается на уровне системы.
Например, при вызове DmOpenDatabase (открытие файла) вызывается функция с номером sysTrapDmOpenDatabase в специальной таблице указателей. Этот механизм называется - Palm OS trap dispatch mechanism – т.е. когда вызывается API функция, то на самом деле приложение обращается к обработчику API вызовов (trap dispatch) и просит его вызвать такой-то номер функции (а параметры передаются в стеке). Эту таблицу указателей можно спокойно изменять с целью подмены функций.
Подменить системную функцию может любое приложение (например CyrHack, подменяет ряд функция для русификации PalmOS). Но есть еще специальный вид приложений для PalmOS – это Хаки (от слова hack, а официальное название System Extention). Это приложения, которые подменяют определенные системные функции и делают что-то полезное. Хаки созданы по спецификации HackMaster API, это стандарт который облегчает создание таких приложений, а также делает более безопасным их присутствие в системе. Согласно этому стандарту за всеми хаками в системе следит Менеджер Хаков. Это обычное приложение (например X-Master) в котором можно посмотреть список всех хаков, настроить их, и активизировать.
Программирование хаков требует более глубокого знания системы.
Пример Разработки Приложения для PalmOS
Рассмотрим пример простого приложения - example1.prc(1,5кб) оно состоит из одной формы. На Форме расположена кнопка , надпись, и текстовое поле, к форме прикреплено меню . При нажатии на кнопку появляется сообщение. Проект приложения состоит из 4х файлов:
Example1.c – исходный код на языке С.
Example1.h – имена и номера елементов формы
Example1.rcp – описание ресурсов приложения (форма, меню, кнопка, диалог сообщения).
Makefile – для сборки приложения.
файл example1.c
#include <PalmOS.h>
#include "hw.h"
static FormPtr gpForm;
Boolean Form1_HandleEvent(EventPtr event)
{
switch(event->eType) {
case ctlSelectEvent:
if ( event->data.ctlEnter.controlID == Button1)
FrmCustomAlert(Alert1, "MessageBox !", "", "");
break;
case menuEvent:
if ( event->data.menu.itemID == IDM_about)
FrmCustomAlert(Alert1, "This is Example", "", "");
break;
case frmOpenEvent:
gpForm=FrmGetActiveForm();
FrmDrawForm(gpForm);
break;
case frmCloseEvent:
FrmEraseForm(gpForm);
FrmDeleteForm(gpForm);
break;
default:
return false;
}
return true;
}
static Boolean ApplicationHandleEvent(EventPtr event)
{
FormPtr frm;
Boolean handled=false;
switch(event->eType) {
case frmLoadEvent:
frm = FrmInitForm (event->data.frmLoad.formID);
FrmSetActiveForm (frm);
FrmSetEventHandler(frm , Form1_HandleEvent);
handled = true;
break;
}
return handled;
}
UInt32 PilotMain(UInt16 launchCode, void *cmdPBP, UInt16 launchFlags)
{
EventType event;
UInt16 error;
if(launchCode==sysAppLaunchCmdNormalLaunch) {
FrmGotoForm(Form1);
do {
EvtGetEvent(&event,evtWaitForever);
if(!SysHandleEvent(&event))
if(!MenuHandleEvent(0,&event,&error))
if(!ApplicationHandleEvent(&event))
FrmDispatchEvent(&event);
}
while(event.eType!=appStopEvent);
FrmCloseAllForms();
}
return 1;
}
файл example1.rcp
#include "hw.h"
FORM ID Form1 AT (0 0 160 160) FRAME USABLE
MENUID MenuBar1
BEGIN
TITLE "Example 1"
LABEL "This is an example" AUTOID AT (10 10+5) FONT 1
LABEL "of small GUI programm" AUTOID AT (PREVLEFT PREVBOTTOM+5) FONT 2
FIELD ID IDB_Edit1 AT (PREVLEFT PREVBOTTOM+5 110 20) MAXCHARS 50 UNDERLINED FONT 2
BUTTON "Hello" ID Button1 AT (10 80 AUTO AUTO)
END
MENU ID MenuBar1
BEGIN
PULLDOWN "Help"
BEGIN
MENUITEM "About" ID IDM_about "A"
END
END
ALERT ID Alert1
INFORMATION
BEGIN
TITLE "Example 1"
MESSAGE "^1 ^2 ^3"
BUTTONS "Ok"
END
Файл example1.h
#define Form1 1000
#define Button1 1003
#define Edit1 1006
#define MenuBar1 1000
#define Alert1 1102
#define IDM_about 1001
#define IDB_Edit1 1002
makefile
CC=m68k-palmos-gcc.exe
PILRC=pilrc.exe
BUILDPRC=build-prc
OBJRES=m68k-palmos-obj-res
GRC=*.grc
CFLAGS = -O2
all: example1
example1: example1.bin resources
ls *.grc|$(BUILDPRC) example1.prc Test -v 1.0 *.bin *.grc
example1.bin: example1.o
$(CC) -o $@ $<
$(OBJRES) $@
example1.o: example1.c
$(CC) $(CFLAGS) -c $<
resources: example1.rcp
$(PILRC) $<
clean:
rm *.bin
rm *.o
rm *.grc
Ссылки:
http://goanna.cs.rmit.edu.au/~winikoff/palm/dev.html
http://www.cyberport.com/~tangent/palm/faq/
http://www.palmopensource.com/ - много исходников по разным темам
http://www.massena.com/darrin/pilot/tanda.htm
http://www.pdaprogramming.com/old/palmos/sources.html
http://spider.macomnet.ru/docs/PalmOS/palm_developers_guide/
http://home.hetnet.nl/~tonicor/palm/tutorial/uk/index.htm
http://www.multimania.com/pbriol/palmos/gcc.html
http://oasis.palm.com/dev/kb/browse.cfm?type=1
http://www.kadak.com/html/kdkp1010.htm - ядро PALMOS
http://pdasecurity.chat.ru/main.html - взлом софта под палм
http://palm.x-a-o-c.ru
От Автора :
По мере того как я работаю с PalmOS и PocketPC я стараюсь обновлять эту работу . Самая свежая версия всегда лежит на http://www.dekart.com/publ/PalmOS%20referat_6.pdf .