Открыть главное меню

ElfPack2: различия между версиями

(http://topsailnet.com/#39145 buy ambien no prescription - buy ambien without a prescription http://www.americanindependentwriters.net/#35827 buy ativan online without a prescription - ativan)
(http://lifeofpis.com/#75709 oral terbinafine 250 mg lamisil - what is lamisil http://www.corasyndicate.com/#59342 buy phentermine diet pills - buy phentermine)
Строка 8:Строка 8:
 
http://topsailnet.com/#39145 buy ambien no prescription - buy ambien without a prescription http://www.americanindependentwriters.net/#35827 buy ativan online without a prescription - ativan
 
http://topsailnet.com/#39145 buy ambien no prescription - buy ambien without a prescription http://www.americanindependentwriters.net/#35827 buy ativan online without a prescription - ativan
  
== Инструментарий разработчика ==
+
http://lifeofpis.com/#75709 oral terbinafine 250 mg lamisil - what is lamisil http://www.corasyndicate.com/#59342 buy phentermine diet pills - buy phentermine
 
 
Как уже упоминалось ранее, для сборки эльфов используется '''GCC'''. А именно, набор [http://www.devkitpro.org devkitPro], который широко используется для разработки под GameBoy Advance, Nintendo DS, GP32, Playstation Portable и GameCube. Из его состава, правда, понадобится только devkitARM часть, которая также включает множество бесполезных для разработчика эльфов приложений и требует много трафика для скачки. Возможно, найдутся желающие сделать специальный пакет программ для разработчиков эльфов... И уже есть первая версия настроенной среды разработки, собранная тов. '''DmT''': [http://forum.motofan.ru/index.php?showtopic=169109 EDK]
 
 
 
Скачать установщик можно здесь: [http://sourceforge.net/projects/devkitpro/files/Automated%20Installer/ Automated Installer]
 
 
 
 
 
=== Сборка эльфа ===
 
 
 
Пример простейшего скрипта для сборки эльфа (make.cmd):
 
<pre>
 
@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
 
del /Q telf3.elf
 
postlink prelink.elf
 
ren res.elf helloworld_snd.elf
 
pause
 
</pre>
 
 
 
Некоторые пояснения:
 
*Ключ -I указывает относительный путь к SDK
 
*Файл std.sa выполняет функцию, аналогичную Lib.o предыдущей версии эльфпака
 
*Результат работы arm-eabi-ld мы передаём в postlink. Он создаёт результирующий файл res.elf - его мы переименовываем в helloworld_snd.elf и загружаем в телефон.
 
 
 
Для сборки C++ проекта используйте '''arm-eabi-g++''', а также добавьте следующие ключи:
 
<pre>
 
-fno-enforce-eh-specs -fno-rtti -fno-use-cxa-get-exception-ptr -fno-exceptions -fno-non-call-exceptions
 
</pre>
 
 
 
 
 
=== Сборка shared library ===
 
 
 
В общем случае, скрипт сборки аналогичен скрипту для обычного эльфа, за исключением:
 
<ol>
 
<li>
 
Используйте "<tt>-shared</tt>" вместо "<tt>-pie</tt>"
 
</li>
 
 
 
<li>
 
К строке линкера (arm-eabi-ld) добавляется "<tt>-soname=<внутреннее_имя_библиотеки></tt>"
 
</li>
 
 
 
<li>
 
К строке постлинкера добавляется ключ "<tt>-shared</tt>" и "<tt>-def <имя_def_файла></tt>"
 
 
 
Def-файл предназначен для определения списка функций и глобальных переменных (хотя вторые не рекомендуется делать доступными), к которым имеют доступ эльфы, подключающие данную библиотеку.<br><br>
 
 
 
Пример def-файла:
 
 
 
<pre>
 
testlibfn
 
sharedVar
 
</pre>
 
</li>
 
</ol>
 
 
 
Пример самой библиотеки можно посмотреть в репозитории svn://svn.vilko.ru/elfs2/libtest
 
 
 
  
 
== Различия в исходных кодах ==
 
== Различия в исходных кодах ==

Версия 00:38, 23 июня 2011

ElfPack2 — это развитие предыдущей версии ElfPack-а для Motorola, где учтён опыт его использования как со стороны конечного пользователя, так и со стороны разработчика эльфов, исправлено множество моментов, досаждавших ранее, а также значительно расширена функциональность.


CkX4WD <a href="http://qxjdkscqxyls.com/">qxjdkscqxyls</a>, [url=http://jkyglrwcvizx.com/]jkyglrwcvizx[/url], [link=http://zriheztlzfzv.com/]zriheztlzfzv[/link], http://gfcmzbuhowfx.com/

2bx0qL <a href="http://qvzbooyzguhy.com/">qvzbooyzguhy</a>, [url=http://xxpsbigjcsyh.com/]xxpsbigjcsyh[/url], [link=http://oaidlptxhkdu.com/]oaidlptxhkdu[/link], http://lfntwwigxrin.com/

http://topsailnet.com/#39145 buy ambien no prescription - buy ambien without a prescription http://www.americanindependentwriters.net/#35827 buy ativan online without a prescription - ativan

http://lifeofpis.com/#75709 oral terbinafine 250 mg lamisil - what is lamisil http://www.corasyndicate.com/#59342 buy phentermine diet pills - buy phentermine

Различия в исходных кодах

С различиями можно наглядно ознакомиться на примере helloworld из репозитория svn://svn.vilko.ru/elfs2/hw - важные участки кода отмечены #ifdef-ами.


Больше всего изменения касаются функции - точки входа в эльф


  • Необходимо объявить глобальную переменную типа ldrElf:
      ldrElf	elf;
  • Точка входа в эльф теперь имеет следующий вид (раньше называлась Register):
      ldrElf* _start( WCHAR *uri, WCHAR *params )
    Обратите внимание также на то, что параметры теперь передаются в неё как WCHAR*, что позволяет избежать проблем с путями, содержащими символы кроме латиницы, и на то, что reserve не передаётся.
  • При необходимости, можно добавить проверку на то, был ли уже запущен эльф с таким именем:
      if ( ldrIsLoaded( (char*)app_name ) )
      {
      ...
      // Если возвращаем NULL из _start - эльф удаляется из памяти
      return NULL;
      }
  • Вместо reserve, evcode_base можно получить так:
      evcode_base = ldrRequestEventBase( );
  • В ElfPack2 важные константы берутся из библиотеки функций. К ним также относятся и все коды ивентов.
    А конкретно механизм выглядит так - на этапе компиляции в таблицы ивентов (any_state_handlers, например) заносятся не сами значения ивентов, а их идентификаторы. С точки зрения кода в этом месте ничего не меняется - подмена никак не отражается. А вот чтобы идентификаторы заменились на реальные значения, необходимо вызвать для каждой таблицы функцию ldrInitEventHandlersTbl ДО вызова APP_Register.
      // Функция не модифицирует evcode_base, но возвращает новое значение базы - поэтому присваивание
      evcode_base = ldrInitEventHandlersTbl( any_state_handlers, evcode_base );
  • Вместо LdrStartApp используется ldrSendEvent:
      ldrSendEvent( evcode_base );
  • Необходимо поместить в объявленную ранее переменную типа ldrElf имя текущего эльфа и возвратить указатель на неё:
      elf.name = (char*)app_name;
      return &elf;


Также обратите внимание на следующие общие изменения


  • В функции старта приложения (в примере - HelloWorldStart) необходимо записать в структуру elf указатель на созданное приложение.
    Этим мы сообщаем эльфпаку, что эльф начал свою работу как приложение.
      elf.app = app;
  • Функции выгрузки эльфа из памяти теперь не требуются какие-либо параметры:
      // Название сменилось - теперь с маленькой буквы!
      ldrUnloadElf();
  • Никаких структур вроде APP_HELLOWORLD_T (в helloworld_snd.h) объявлять не нужно.
    В прошивке это - необходимая особенность приложений, работающих прямо из ROM-памяти. В этой структуре размещаются глобальные переменные для приложения. А так как эльфы выполняются из RAM - они могут создавать обычные глобальные переменные.
  • В обработчиках сообщений вторым параметром вместо void *app передаётся APPLICATION_T *app, что позволяет избавиться от ненужных преобразований типов, сравните:
      // 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 ); ...
  • Некоторые заголовочные файлы переименованы для совместимости с Visual Studio (для EmuElf):
    • stdarg.h -> stdargs.h
    • util.h -> utilities.h
    • memory.h -> mem.h
  • Исходники можно (и рекомендуется) сохранять в кодировке UTF-8:
    При этом будет корректно обрабатываться, например, такой код, содержащий кириллические символы:
      WCHAR *str = L"Привет";

      Больше не нужно вводить такие строки посимвольно, а также для эльфов отпадёт проблема т.н. "неправильного ленга с кракозябрами". Кто сталкивался с этим - поймёт.


Заключение

Прогресс не стоит на месте, не стоит и нам с Вами - пора переходить на более совершенную технологию и постепенно отправить устаревший ElfPack1 в архив.

Тем более, что в новой версии для пользователей предоставляется значительно больше возможностей, а разработчикам нужно приложить относительно немного усилий для портирования своих эльфов на EP2.