ElfPack2 — это развитие предыдущей версии ElfPack-а для Motorola, где учтён опыт его использования как со стороны конечного пользователя, так и со стороны разработчика эльфов, исправлено множество моментов, досаждавших ранее, а также значительно расширена функциональность.
1XwZsQ <a href="http://fbkrxldhzfwz.com/">fbkrxldhzfwz</a>, [url=http://fwwhdwmrmavv.com/]fwwhdwmrmavv[/url], [link=http://yztfvocnjfwq.com/]yztfvocnjfwq[/link], http://yzulqzuvtoiu.com/
comment4,
Содержание
Разработчикам
Процесс разработки эльфов имеет ряд отличий от предыдущей версии. Это касается как исходного кода, так и процесса сборки.
Разработка самого эльфпака и ряда эльфов под него проводилось под контролем системы Subversion, её мы рекомендуем использовать и всем разработчикам. Адреса основных репозиториев:
svn://svn.vilko.ru/elfpack2 - исходный код эльфпака
svn://svn.vilko.ru/elfs2 - исходные коды эльфов для него
svn://svn.vilko.ru/postlinker - Postlinker
svn://svn.vilko.ru/SDK - объединённый SDK
Все репозитории доступны для чтения с анонимным доступом. Если Вы желаете внести свой вклад, особенно в развитие SDK - обратитесь к администраторам репозиториев (Andy51, tim apple, Vilko).
Как Вы могли заметить, появился репозиторий для SDK, а это значит, что разработчики ElfPack2 настоятельно рекомендуют пользоваться только данной версией и активно дополнять именно её всем разработчикам!
Использование Subversion
Если Вы не знаете, что это такое - можно ознакомиться, например, здесь: Subversion
Также Вам понадобится клиент для работы с репозиториями: TortoiseSVN
После установки клиента, чтобы скачать самые последние версии исходников с какого-либо репозитория:
- Cоздайте папку для проекта.
- Нажмите на ней правой кнопкой мыши и выберите "SVN Checkout..."
- В поле "URL of repository" введите адрес репозитория. Остальные настройки менять не нужно.
- Нажмите ОК. Исходники теперь будут закачиваться в текущую папку.
Чтобы обновить проект до самой последней версии из репозитория - выберите из контекстного меню папки с проектом "SVN Update".
Инструментарий разработчика
Как уже упоминалось ранее, для сборки эльфов используется GCC. А именно, набор devkitPro, который широко используется для разработки под GameBoy Advance, Nintendo DS, GP32, Playstation Portable и GameCube. Из его состава, правда, понадобится только devkitARM часть, которая также включает множество бесполезных для разработчика эльфов приложений и требует много трафика для скачки. Возможно, найдутся желающие сделать специальный пакет программ для разработчиков эльфов... И уже есть первая версия настроенной среды разработки, собранная тов. DmT: EDK
Скачать установщик можно здесь: Automated Installer
Сборка эльфа
Пример простейшего скрипта для сборки эльфа (make.cmd):
@echo off del prelink.elf arm-eabi-gcc -c -Wall -mbig-endian -mthumb -mthumb-interwork -I..\SDK -fshort-wchar -nostdlib -O -DEP2 helloworld_snd.c arm-eabi-ld -pie -EB -O -nostdlib helloworld_snd.o std.sa -o prelink.elf del /Q *.o postlink prelink.elf -o helloworld_snd.elf pause
Некоторые пояснения:
- Ключ -I указывает относительный путь к SDK
- Файл std.sa выполняет функцию, аналогичную Lib.o предыдущей версии эльфпака
- Результат работы arm-eabi-ld мы передаём в postlink. Он создаёт результирующий файл res.elf - его мы переименовываем в helloworld_snd.elf и загружаем в телефон.
- Ключ -o у postlink задаёт имя результирующего файла
Для сборки C++ проекта используйте arm-eabi-g++, а также добавьте следующие ключи:
-fno-enforce-eh-specs -fno-rtti -fno-use-cxa-get-exception-ptr -fno-exceptions -fno-non-call-exceptions
В общем случае, скрипт сборки аналогичен скрипту для обычного эльфа, за исключением:
- Используйте "-shared" вместо "-pie"
- К строке линкера (arm-eabi-ld) добавляется "-soname=<внутреннее_имя_библиотеки>"
- К строке постлинкера добавляется ключ "-shared" и "-def <имя_def_файла>"
Def-файл предназначен для определения списка функций и глобальных переменных (хотя вторые не рекомендуется делать доступными), к которым имеют доступ эльфы, подключающие данную библиотеку.
Пример def-файла:testlibfn sharedVar
Пример самой библиотеки можно посмотреть в репозитории svn://svn.vilko.ru/elfs2/libtest
Различия в исходных кодах
С различиями можно наглядно ознакомиться на примере helloworld из репозитория svn://svn.vilko.ru/elfs2/hw - важные участки кода отмечены #ifdef-ами.
Больше всего изменения касаются функции - точки входа в эльф
- Необходимо объявить глобальную переменную типа ldrElf:
ldrElf elf;
ldrElf* _start( WCHAR *uri, WCHAR *params )
- Обратите внимание также на то, что параметры теперь передаются в неё как WCHAR*, что позволяет избежать проблем с путями, содержащими символы кроме латиницы, и на то, что reserve не передаётся.
if ( ldrIsLoaded( (char*)app_name ) ) { ... // Если возвращаем NULL из _start - эльф удаляется из памяти return NULL; }
evcode_base = ldrRequestEventBase( );
- А конкретно механизм выглядит так - на этапе компиляции в таблицы ивентов (any_state_handlers, например) заносятся не сами значения ивентов, а их идентификаторы. С точки зрения кода в этом месте ничего не меняется - подмена никак не отражается. А вот чтобы идентификаторы заменились на реальные значения, необходимо вызвать для каждой таблицы функцию ldrInitEventHandlersTbl ДО вызова APP_Register.
// Функция не модифицирует evcode_base, но возвращает новое значение базы - поэтому присваивание evcode_base = ldrInitEventHandlersTbl( any_state_handlers, evcode_base );
ldrSendEvent( evcode_base );
elf.name = (char*)app_name; return &elf;
Также обратите внимание на следующие общие изменения
- В функции старта приложения (в примере - HelloWorldStart) необходимо записать в структуру elf указатель на созданное приложение.
- Этим мы сообщаем эльфпаку, что эльф начал свою работу как приложение.
elf.app = app;
// Название сменилось - теперь с маленькой буквы! ldrUnloadElf();
- В прошивке это - необходимая особенность приложений, работающих прямо из ROM-памяти. В этой структуре размещаются глобальные переменные для приложения. А так как эльфы выполняются из RAM - они могут создавать обычные глобальные переменные.
// EP1: UINT32 HandleUITokenGranted( EVENT_STACK_T *ev_st, void *app ) { APPLICATION_T *papp = (APPLICATION_T*) app; status = APP_ExitStateAndApp( ev_st, app, 0 ); ... // EP2: UINT32 HandleUITokenGranted( EVENT_STACK_T *ev_st, APPLICATION_T *app ) { status = APP_ExitStateAndApp( ev_st, app, 0 ); ...
- stdarg.h -> stdargs.h
- util.h -> utilities.h
- memory.h -> mem.h
- При этом будет корректно обрабатываться, например, такой код, содержащий кириллические символы:
WCHAR *str = L"Привет";
Больше не нужно вводить такие строки посимвольно, а также для эльфов отпадёт проблема т.н. "неправильного ленга с кракозябрами". Кто сталкивался с этим - поймёт.
Заключение
Прогресс не стоит на месте, не стоит и нам с Вами - пора переходить на более совершенную технологию и постепенно отправить устаревший ElfPack1 в архив.
Тем более, что в новой версии для пользователей предоставляется значительно больше возможностей, а разработчикам нужно приложить относительно немного усилий для портирования своих эльфов на EP2.