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

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

(Инструментарий разработчика)
(Различия в исходных кодах)
Строка 10:Строка 10:
 
comment5,
 
comment5,
  
== Различия в исходных кодах ==
+
comment1,
 
 
С различиями можно наглядно ознакомиться на примере helloworld из репозитория svn://svn.vilko.ru/elfs2/hw - важные участки кода отмечены #ifdef-ами.
 
 
 
 
 
=== Больше всего изменения касаются функции - точки входа в эльф ===
 
<br>
 
 
 
<ul>
 
<li>'''Необходимо объявить ''глобальную'' переменную типа ldrElf:
 
<ul><pre>
 
ldrElf elf;
 
</pre></ul>
 
</li>
 
 
 
<li>'''Точка входа в эльф теперь имеет следующий вид (раньше называлась Register):
 
<ul><pre>
 
ldrElf* _start( WCHAR *uri, WCHAR *params )
 
</pre></ul>
 
:Обратите внимание также на то, что параметры теперь передаются в неё как WCHAR*, что позволяет избежать проблем с путями, содержащими символы кроме латиницы, и на то, что reserve не передаётся.
 
</li>
 
 
 
<li>'''При необходимости, можно добавить проверку на то, был ли уже запущен эльф с таким именем:
 
<ul><pre>
 
if ( ldrIsLoaded( (char*)app_name ) )
 
{
 
...
 
// Если возвращаем NULL из _start - эльф удаляется из памяти
 
return NULL;
 
}
 
</pre></ul>
 
</li>
 
 
 
<li>'''Вместо reserve, evcode_base можно получить так:
 
<ul><pre>
 
evcode_base = ldrRequestEventBase( );
 
</pre></ul>
 
</li>
 
 
 
<li>'''В ElfPack2 важные константы берутся из библиотеки функций. К ним также относятся и все коды ивентов.
 
:А конкретно механизм выглядит так - на этапе компиляции в таблицы ивентов (any_state_handlers, например) заносятся не сами значения ивентов, а их идентификаторы. С точки зрения кода в этом месте ничего не меняется - подмена никак не отражается. А вот чтобы идентификаторы заменились на реальные значения, необходимо вызвать для каждой таблицы функцию ldrInitEventHandlersTbl ДО вызова APP_Register.
 
<ul><pre>
 
// Функция не модифицирует evcode_base, но возвращает новое значение базы - поэтому присваивание
 
evcode_base = ldrInitEventHandlersTbl( any_state_handlers, evcode_base );
 
</pre></ul>
 
</li>
 
 
 
<li>'''Вместо LdrStartApp используется ldrSendEvent:
 
<ul><pre>
 
ldrSendEvent( evcode_base );
 
</pre></ul>
 
</li>
 
 
 
<li>'''Необходимо поместить в объявленную ранее переменную типа ldrElf имя текущего эльфа и возвратить указатель на неё:
 
<ul><pre>
 
elf.name = (char*)app_name;
 
return &elf;
 
</pre></ul>
 
</li>
 
</ul>
 
 
 
<br>
 
=== Также обратите внимание на следующие общие изменения ===
 
<br>
 
 
 
<ul>
 
<li>'''В функции старта приложения (в примере - HelloWorldStart) необходимо записать в структуру elf указатель на созданное [[Application|приложение]].
 
:Этим мы сообщаем эльфпаку, что эльф начал свою работу как приложение.
 
<ul><pre>
 
elf.app = app;
 
</pre></ul>
 
</li>
 
 
 
<li>'''Функции выгрузки эльфа из памяти теперь не требуются какие-либо параметры:
 
<ul><pre>
 
// Название сменилось - теперь с маленькой буквы!
 
ldrUnloadElf();
 
</pre></ul>
 
</li>
 
 
 
<li>'''Никаких структур вроде APP_HELLOWORLD_T (в helloworld_snd.h) объявлять не нужно.
 
:В прошивке это - необходимая особенность приложений, работающих прямо из ROM-памяти. В этой структуре размещаются глобальные переменные для приложения. А так как эльфы выполняются из RAM - они могут создавать обычные глобальные переменные.
 
</li>
 
 
 
<li>'''В обработчиках сообщений вторым параметром вместо void *app передаётся APPLICATION_T *app, что позволяет избавиться от ненужных преобразований типов, сравните:
 
<ul><pre>
 
// 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 );
 
    ...
 
</pre></ul>
 
</li>
 
 
 
<li>'''Некоторые заголовочные файлы переименованы для совместимости с Visual Studio (для [[EmuElf]]):
 
*stdarg.h -> stdargs.h
 
*util.h -> utilities.h
 
*memory.h -> mem.h
 
</li>
 
 
 
<li>'''Исходники можно (и рекомендуется) сохранять в кодировке UTF-8:
 
:При этом будет корректно обрабатываться, например, такой код, содержащий кириллические символы:
 
 
 
<ul>
 
<pre>
 
WCHAR *str = L"Привет";
 
</pre>
 
Больше не нужно вводить такие строки посимвольно, а также для эльфов отпадёт проблема т.н. "неправильного ленга с кракозябрами".
 
Кто сталкивался с этим - поймёт.
 
</ul>
 
</li>
 
 
 
</ul>
 
 
 
  
 
== Заключение ==
 
== Заключение ==

Версия 09:58, 20 мая 2011

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,

comment1,

comment5,

comment1,

Заключение

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

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