В этой статье я хотел бы остановиться подробнее на разработке программ для Palm OS в Linux. Я использую дистрибутив ALT Linux Master 2.0 с настроенным репозитарием пакетов Sisyphus, откуда можно легко установить большинство необходимых программ. Конечно, все используемые программы можно скачать в интернете, и использовать бесплатно.
Я не буду подробно описывать технологию программирования в Palm OS - достаточно много информации по этой теме можно найти в Интернете. Главными справочниками разработчика являются Palm OS Companion and Reference. На том же сайте вы можете найти много полезной документации, предназначенной для разработчиков: http://www.palmos.com/dev/support/docs/. Неплохой форум, посвященный разработке под Palm OS можно найти на сайте http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=palmos. Из конференций (news-groups) могу порекомендовать сервер news://news.falch.net/ — конференция pilot.programmer.gcc (на английском). Хороший каталог ресурсов по разработке для Palm на OpenNet.
Кратко перечислю используемые программы:
Palm OS SDK
библиотеки и заголовочные файлы;
prc-tools
собственно кросс-компилятор gcc и другие инструменты для компиляции и сборки программ под Palm OS;
pose
эмулятор Palm. Позволяет отлаживать программы с помощью m68k-palmos-gdb, без риска потерять все данные на реальном устройстве;
pilrc
компилятор ресурсов для Palm OS. Преобразует rcp (текстовый файл описания ресурсов) в бинарные файлы формата Palm OS
guikachu
графический редактор ресурсов Palm OS (на базе gtk/gnome). Позволяет “рисовать” интерфейс приложений Palm OS
ddd
графический frontend к отладчику gdb, включая m68k-palmos-gdb;
gvim
редактор исходных текстов. Подойдет любой привычный редактор или среда;
Глава 2. Palm OS SDK
Для работы с gcc надо на странице http://www.palmos.com/dev/tools/sdk/ перейти в раздел нужной версии SDK и скачать архив в разделе “Unsupported Palm OS SDK 5.0 for PRC-Tools”. Я надеюсь, что rpm установит файлы куда надо, а для архива tar.gz надо делать так:
создать каталог /usr/local/palmdev/sdk35 и линк на неё — /usr/local/palmdev/sdk (что-бы легко переключаться между версиями SDK):
Из архива скопировать содержимое каталога Palm OS 3.5 Support/Incs в каталог /usr/local/palmdev/sdk35/include, и Palm OS 3.5 Support/GCC Libraries — в /usr/local/palmdev/sdk35/lib
Скачать последнюю версию можно с домашней страницы prc-tools. На текущий момент это версия 2.2, которая поддерживает последние модели Palm-based устройств на ARM-процессорах и Palm OS SDK 5.
В пакет prc-tools входят программы:
build-prc
строит из бинарных файлов и ресурсов файл .prc готовый к установки на Palm;
m68k-palmos-ar
позволяет создавать свои библиотеки
m68k-palmos-c++
для Palm можно писать программы на C++ (это тема отдельного разговора и многочисленных споров);
m68k-palmos-gdb
отладчик программ. Можно использовать линк с реальным устройством или эмулятором POSE;
Другие инструменты
prc-tools во многом повторяет стандартный пакет gcc, и изначально являлся хаком 2.95 версии gcc. Поэтому команды и ключи prc-tools не покажутся необычными программисту, работавшему с gcc. Специфичные для Palm OS опции можно посмотреть на соответсвующей странице.
Глава 4. POSE
POSE это эмулятор Palm OS-based машин. Существует версия для UNIX, MacOS, Windows. Исходники можно найти на соответствущей странице. Для дистрибутивов ALT Linux достаточно дать команду apt-get install pose. Так-же доступны пакеты pose-skins и pose-doc. Пакет pose-skins нужен для корректной работы с конкретными моделями Palm. Доступны шкурки для Palm, Handspring, Workpad, HandEra разных моделей.
Для работы понадобиться ещё и образ системной памяти Palm (ROM Image Files), который по лицензионным ограничениям распространяться в составе дистрибутива не может. Для получения ROM Image Files необходимо подписаться на Palm OS Developer Program. Также можно скопировать ROM с самого устройства Palm. Для этого надо:
Для старых моделей, с объёмом ROM в 512Кб можно использовать getrom.prc;
Запустить на Palm установленную программу getrom и нажать кнопку Start. В Linux запустить программу pi-getrom;
Полученный pilot.rom можно загружать в POSE.
Замечание
На последних моделях Palm getrom2.prc использовать нельзя. Достаточно нажать кнопку синхронизации и запустить pi-getrom.
Теперь можно запустить и настроить POSE. В открывшемся окне POSE нажатием правой кнопки мыши вызывается меню. Выберите пункт New и заполните поля:
В поле ROM file надо открыть пункт Other и выбрать файл, скачанный с помощью pi-getrom;
В поле Device появиться номер модели;
В поле Skin выберите шкурку;
В поле RAM size — размер памяти вашего виртуального Palm;
Вот как выглядит POSE, настроенный на Palm m505:
Теперь можно устанавливать и отлаживать программы.
Глава 5. Guickachu и pilrc
Программа для Palm OS состоит из ресурсов. Сам код является специфичным типом ресурса. Также как и текст программы, ресурсы описываются текстовым файлом (стандартное расширение .rcp), который можно редактировать напрямую в текстовом редакторе.
Для визуального редактирования ресурсов существуют такие программы как pilrcedit и guikachu. Pilrcedit — это Java-приложение, и мне показалось не слишком удобным. Guikachu написан под Gtk+/GNOME, использует XML, как формат сохраняемых файлов, и активно развивается. Последняя стабильная версия на текущий момент — 1.2.3. Скачать можно с домашней страницы. Для дистрибутивов ALT Linux, guikachu можно установить командой apt-get install guikachu. Чтобы преобразовать исходный файл guikachu в RCP-файл, достаточно дать команду guikachu2rcp name.guikachu или выбрать пункт Экспорт RCP из меню Файл.
Guikachu поддерживает следующие типы ресурсов:
Форма;
Диалог;
Меню;
Строка;
Списки строк;
Текстовые поля;
В формы можно добавлять: статический текст, поля, кнопки, списки, таблицы, пользовательские элементы. Интерфейс достаточно понятен и удобен.
После получения rcp файла, его необходимо преобразовать в бинарный формат. Для этого служит программа pilrc (пользователи Sisyphus могут ее установить командой apt-get install pilrc). Синтаксис достаточно прост: pilrc -H name.h name.rcp. По этой команде создадутся необходимые .bin-файлы, и заголовочный файл с определениями идентификаторов.
Замечание
Все идентификаторы ресурсов в Palm OS должны быть числовыми, но в программе удобнее пользоваться говорящими именами. Ключ -H позволяет автоматически сгенерировать заголовочный файл с “#define Имя Число”, давая возможность в программе использовать конструкции типа “case MY_BEST_BUTTON:” вместо “case 9991:”.
Глава 6. Отладчик DDD
m68k-palmos-gdb является версией стандартного gdb, пропатченного под Palm, поэтому можно использовать графические оболочки к gdb. Здесь я расскажу про отладку под ddd.
Чтобы программа собралась с отладочной информацией, надо добавить ключ -g в вызове m68k-palmos-gcc. Размер окончательного .prc-файла увеличится мало — добавиться только заглушка, передающая управлению внешнему отладчику на хосте. Вся отладочная информация записывается в объектный модуль, который и надо загружать в отладчик.
Для запуска ddd в качестве frontend к m68k-palmos-gdb надо дать ключ --debugger m68k-palmos-gdb:
ddd --debugger m68k-palmos-gdb
Первым делом стоит загрузить (Ctrl-O) объектник с отладочной информацией (тот файл, который указан в опции -o m68k-palmos-gcc). Чтобы стартовать сессию отладки в окне gdb надо дать команду target pilot localhost:6414. По указанному порту POSE общается с отладчиком.
Замечание
Для упрощения, можно создать в ddd кнопку. Для этого надо открыть меню Commands->Edit Buttons и в пункте Console Buttons ввести: target pilot localhost:6414. После этого над окном отладчика появиться кнопка с введенной командой.
Теперь отладчик ждет, когда на pose запустят программу. При старте в эмуляторе программы, управление немедленно передастся в ddd, и экран POSE останется черный, пока не пойдет вывод из программы. Теперь можно как обычно устанавливать точки прерывания, просматривать значения переменных и т.д. Вот как выглядит сессия отладки:
Глава 7. Среда разработки
Под Linux можно собрать для себя эффективную среду разроботки. Выбор довольно широк: vi, emacs, Anjuta, KDevelop. Все эти программы можно настроить для разработки под Palm OS. Универсальным и мощным средством работы является make.
Ниже приведен примера файла Makefile с комментариями.
# Имя prc файла
PRC = name.prc
# Уникальный идентификатор приложения.
# Должен быть зарегистрирован на сайте
# http://dev.palmos.com/creatorid/
CID = TeSt
# Имя приложения, показываемое в Launcher
NAME = Name
# Объектные файлы, из которых состоит программа
OBJS = module1.o module2.o module3.o
# Файл, созданный guikachu
GUI = name.guikachu
# Файл, создаваемый в результате работы guikachu2rcp
RCP = name.rcp
# Базовая программа вызова компилятора
CCBASE = m68k-palmos-gcc -DOS35 -DPRC2 -fno-exceptions -fno-rtti
# Для окончательного проекта эту опцию можно закомментировать
DEBUG = -g
CC = $(CCBASE) $(DEBUG)
# Вызов команды, генерирующей зависимости файлов
DEPEND = makedepend
# Сначало надо вызывать pilrc, т.к. идентификаторы ресурсов
# уже могут использоваться в программе
all: $(RCP) $(PRC)
# rcp файл зависит от guikachu
$(RCP): $(GUI)
guikachu2rcp $(GUI)
pilrc -H $(NAME).h $(RCP)
# prc файл зависит от ресурсов и объектных модулей
$(PRC): $(RCP) $(OBJS)
$(CC) $(OBJS) -o $(NAME)
build-prc $(PRC) "$(NAME)" $(CID) $(NAME) *.bin
# Выведем результат сборки, что-бы контролировать размер
ls -l *.prc
# Объектные модули получаются в результате компиляции всех файлов
# с расширением .c (или .cpp) -
# нужное раскоментировать
# .cpp.o:
.c.o:
$(CC) -c $<
# Для генерации зависимостей от .h файлов, используйте make dep
#dep: *.cpp
dep: *.c
$(DEPEND) *.c
# Очистить рабочую директорию
clean:
rm -f *.bin
rm -f *.o
rm -f $(NAME)
rm -f *.grc
rm -f *~
rm -f $(RCP)