motofan logo
16 страниц V < 1 2 3 4 > »         
> 

Учимся писать эльфов вместе, Обсуждение процесса кодинга

Andy51
сообщение 29.10.2007, 20:13 Закрепленное сообщение!


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Вот и долгожданное обновление SDK до v0.2

Основные новшества с прошлой версии:
+ Добавлено множество функций в SDK
+ Добавлено два новых примера - на этот раз GUI

Что внутри:
Папка SDK - ну, и так ясно, заголовочные файлы. За описаниями функций заглядываем в эту папку.

helloworld_snd - первый пример эльфа. Несколько нестандартный HelloWorld, заменяет озвучку цифровой клавиатуры системными звуками. Предназначен в основном для изучения структуры приложения (Application), ну и как пример приложения, работающего в фоне.

helloworld_gui - классический HelloWorld эльф, на этот раз с использованием GUI. Выводит сообщение с помощью диалога Notice. Предназначен для изучения структуры простейшего GUI-приложения.

ListTest - пример использования диалога List. Значительно более сложный пример, предназначен для изучения возможностей и принципов управления диалогами.

make_*.bat - батники для сборки эльфов-примеров. Эльфы расчитаны на компиляцию с комплектом ADS. Из-за правил форума, я не могу включить его в SDK, однако оставляю ссылки
http://ifolder.ru/3937671
http://slil.ru/25060171
http://rapidshare.com/files/67580866/ads.7z.html

Lib.o - для функционирования эльфа под моим загрузчиком, необходимо подлинковать этот файл к проекту (в make.bat уже прописан).
Внимание! Этот файл не зависит от конкретной версии прошивки, под которую собирается эльф, но, тем не менее, зависит от версии библиотеки!
В этом SDK уже включен Lib.o для библиотеки v071218 (оч. старый - не забудьте обновить, если понадобятся новые функции)

Пара слов об т.н. Application.
В телефонах motorola есть система AFW, которая позволяет, не затрачивая лишних ресурсов процессора на обеспечение "полноценной" многозадачности, достаточно полноценно работать нескольким приложениям, ориентированным на диалог с пользователем. Как это работает: приложения представляют собой, фактически, набор обработчиков событий(ивентов, events) + структура данных приложения. Откликаясь на те или иные события, приложения поочерёдно обрабатывают списки накопившихся ивентов. Таким образом, мы фактически имеем невытесняющую многозадачность.
Есть теоретическая возможность писать и эльфы, выделенные в отдельный процесс(task), но эта часть всё ещё в разработке.

Книги по Си
  1. Руководство полного идиота по программированию (на языке Си) - Не смотря на такое название все азы разжёваны. Если вы вообще никогда не видели Си, начните с этой книги
  2. Герберт Шилдт, "Полный справочник по С (4-е издание)"
    Прикрепленный файл Spr_po_C.rar   ( 934.62 килобайт ) Кол-во скачиваний: 1156
  3. "Язык программирования C"
    Прикрепленный файл C_book.zip   ( 220.86 килобайт ) Кол-во скачиваний: 900
Исходники эльфов
  1. SRC by om2804
  2. SRC by G-XaD
SDK
  1. SDK by om2804
  2. SDK by G-XaD
Эльфостроение на motoWiki

Компилятор + исходники от om2804 для EP1 скачать

Сообщение отредактировал om2804 - 3.5.2011, 13:59
Прикрепленный файл SDKv02.rar   ( 24.88 килобайт ) Кол-во скачиваний: 2177
Прикрепленный файл C_book.zip   ( 220.86 килобайт ) Кол-во скачиваний: 900
Прикрепленный файл Spr_po_C.rar   ( 934.62 килобайт ) Кол-во скачиваний: 1156
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DmT
сообщение 26.5.2008, 7:00


Мото-Портной
******

Группа: Разработчики
Сообщений: 1 175
Регистрация: 31.3.2007
Пользователь №: 129 181
Модель телефона: LG GW620, L7e и др.
Победитель конкурса 2008

Рейтинг: 680



Andy51,
т.е. я так понимаею если у нас есть ф-я скажем
UINT32 function1(param1, param2, param3, param4){...}
то
param1-param4 = R1-R4
а сама ф-я вернет значение в R0
так?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 26.5.2008, 7:06


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



DmT, нет, не так... Вот пример вызова функции:
Код
UINT32 function(a,b,c,d,e);
result = function(1,2,3,16,32);

mov r3, #32
str r3, [sp]
mov r3, #16
mov r2, #3
mov r1, #2
mov r0, #1
bl function
; теперь R0 - result


Сообщение отредактировал Andy51 - 26.5.2008, 7:07
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Dex9999
сообщение 26.5.2008, 10:02


Интересующийся
**

Группа: Пользователи
Сообщений: 67
Регистрация: 18.6.2005
Пользователь №: 44 478
Модель телефона: V500
Прошивка: V500->V620->E1 (R373_G_0E.30.45R)

Рейтинг: 14



Цитата(Andy51 @ 26.5.2008, 10:49) *

Посмотри внимательно - JsaSuitesList_SwitchStorage может возвращать значение в R0. Смотрим код
JsaSuitesList_SimpleEventProcess, в конце:
Код
ADD     R0, R6, #0
POP     {R3-R7}
POP     {R3}
BX      R3
; End of function JsaSuitesList_SimpleEventProcess

Видишь, перед выходом в R0 кладётся какое-то значение из внутреннего регистра, оно и будет так же возвращаемым значением в JsaSuitesList_SwitchStorage.

Действительно, попутал немного - писал о JsaSuitesList_SimpleEventProcess, а смотрел только в код JsaSuitesList_SwitchStorage.
Цитата
Ты, наверно, имел в виду UINT64? Я не помню точно, но то ли оно передаётся через R0+R1, толи через указатель... В любом случае, в прошивке оно очень редко встречается.

Я более привык к типам вида char, int, long и т.п. Буду тогда пользоваться UINT32, спасибо.

Цитата
Смотрим начало кода saSuitesList_SimpleEventProcess:
Код
PUSH    {R3-R7,LR}
ADD     R7, R2, #0
ADD     R4, R1, #0
...
Первая команда сохраняет регистры R3-R7 включительно, и регистр возврата. Ну, а в конце функции регистры восстанвливаются. Тоесть, внутри функции мы можем спокойно использовать регистры R0-R7 на наше усмотрение.
Ты спросишь - почему R0-R2 тоже? Просто есть конвенция вызова Си-функций для ARM. Она предусматривает передачу первых 4 параметров функции через регистры R0-R4, а остальных - через стек. Так что R0-R4, а так же R12 (не помню, для чего оно предусмотрено, но вроде как используется в Veneers. Т.к. бОльшая часть кода откомпилирована в Thumb, R12 в таком коде не используется) могут быть без вреда для хода остальной программы "испорчены".

Спасибо еще раз. что делают PUSH/POP я в курсе, а вот про то что первые 4 параметра должны передаваться обязательно через регистры R0-R3(наверное так а не R0-R4), а остальные через стек - этого не знал.

Ещё вопрос smile.gif Вот так может быть?
Код
UINT32 function(a,b);
result = function(1,2);

mov r3, #2
str r3, [sp]
mov r2, #1
bl function
add r0, r1;т.е. r0 и r1 используется не для вызова функции, а для чего-либо другого

т.е. _обязательно_ ли первый параметр в r0, второй в r1? Ведь внутри функции function можно и не работать с R0-R3, а только со стеком. Или так нельзя?

Добавил:
Думаю что можно, просто описание функции тогда будет вида:
Код
UINT32 function(unused_var1, unused_var2, a, unused_var3, b);


Сообщение отредактировал Dex9999 - 26.5.2008, 10:23
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 26.5.2008, 19:47


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Цитата(Dex9999 @ Сегодня, 14:02)

обязательно через регистры R0-R3(наверное так а не R0-R4)
*

Да, сорри, описался smile.gif Уже исправил
Цитата(Dex9999 @ Сегодня, 14:02)

r0 и r1 используется не для вызова функции, а для чего-либо другого
*

Компилер всегда считает, что R0-R3 используется для передачи параметров, поэтому для хранения данных их не использует.
Цитата(Dex9999 @ Сегодня, 14:02)

Код
mov r3, #2
str r3, [sp]
mov r2, #1
bl function

*

Но ведь в регистрах R0 и R1 уже что-то есть до этого кода, не так ли? Вот этот "мусор" и передастся в качестве параметров.
Вообще, конвенций вызова не одна. Та, что я назвал идёт по умолчанию во всех известных мне компиляторах под ARM. Можно указать например, чтобы все параметры передавались через стек... Но текущая конвенция мне кажется очень даже удобной и эффективной
Цитата(Dex9999 @ Сегодня, 14:02)

т.е. _обязательно_ ли первый параметр в r0, второй в r1?
*

Вообще говоря, нет smile.gif
Пример такого случая:
Код
typedef struct {
UINT32 x,y;
}Vector2D;
void function(Vector2D vec, UINT32 r);
...
Vector2D v;
v.x = 10;
v.y = 15;
function(v,0);

Откомпилится, скорее всего, как-то так:
Код
;v.x = 10;
mov r0, #10
str r0, [sp, var_v_x]
;v.y = 15;
mov r0, #15
str r0, [sp, var_v_y]
;function(v,0);
add r0, sp, var_v_x
ldmia r0, {R0-R1}
mov r2, #0
bl function

Тоесть, в первых двух регистрах передастся первый параметр, т.к. он длинный, в R2 - второй.
Ещё пример - вызов метода класса в c++ (указатель на класс - через R0);
И ещё один любопытный пример-исключение. Если интересно - попробуй сам это откомпилить и посмотреть, что получится wink.gif
Код
Vector2D function(Vector2D  vec) {
   vec.y++;
   return vec;
}

Vector2D caller()
{
  Vector2D v, res;
  v.x = 10;
  v.y = 15;
  res = function(v);
  res.x++;
  return res;
}

Я добавил всякого ненужного кода, вроде res.x++, чтобы интересный код не был срезан оптимизатором.
Код
tcc -c -bigend -apcs /interwork test.c

Что касается твоего вопроса, то, конечно, порядок всегда сохраняется.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Dex9999
сообщение 27.5.2008, 5:03


Интересующийся
**

Группа: Пользователи
Сообщений: 67
Регистрация: 18.6.2005
Пользователь №: 44 478
Модель телефона: V500
Прошивка: V500->V620->E1 (R373_G_0E.30.45R)

Рейтинг: 14



Цитата(Andy51 @ 26.5.2008, 23:47) *

Код
;v.x = 10;
mov r0, #10
str r0, [sp, var_v_x]
;v.y = 15;
mov r0, #15
str r0, [sp, var_v_y]
;function(v,0);
add r0, sp, var_v_x
ldmia r0, {R0-R1}
mov r2, #0
bl function


За объяснения "+" конечно же. Я вот сначала всё прочел и понял, а потом подумал: var_v_y должна следовать сразу за var_v_x чтобы в R1 попали правильные данные( #15 ). Допустим var_v_x = 20 (не важно чему лишь бы стек не испортить) тогда var_v_y = var_v_x+___ плюс сколько? +1? Или же +2 если ARM(16) и +4 если THUMB(32)?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 27.5.2008, 12:04


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Цитата(Dex9999 @ Сегодня, 9:03)

Допустим var_v_x = 20 (не важно чему лишь бы стек не испортить) тогда var_v_y = var_v_x+___ плюс сколько?
*


Это, конечно, зависит от настроек компилятора. Недавно с om2804 обсуждали эту проблему, кстати.
Например,
Код
typedef struct {
   UINT16 x;
   UINT32 y;
}Vector2D;

Пусть у нас есть указатель на некоторый экземпляр Vector2D, var_v_x. Вопрос - чему будет равен var_v_y и какой размер структуры Vector2D?
Ответ: var_v_y = var_v_x+4, а размер будет 8 байт, как если бы Vector2D был объявлен как в предыдущих примерах.
Почему так происходит - на arm-процессорах, в отличии от, к примеру, x86, очень большое значение играет выравнивание данных. Объяснить это не трудно. У любого процессора есть набор команд для работы с данными в памяти, и в arm процессорах они следующие(для загрузки данных из памяти):
Код
LDR LDM LDRH LDRB
Так вот первые две загружают в регистр 32-битное слово и требуют, чтобы адрес чтения был кратен 32 битам, третья - загружает 16-битное слово и требует, чтобы адрес чтения был кратен 16 битам. Последняя - аналогично для загрузки байта. Это означает, что за один "присест" считать 32-битное слово с адреса 0x10080001 не получится.
Тем не менее, можно указать компилятору, что тебе нужна максимально компактная структура, и причём с таким расположением, какое ты указал.
Код
typedef __packed struct { //Для ADS only!
   UINT16 x;
   UINT32 y;
}Vector2D;
Ну и, исходя из предыдущих рассуждений, работа с такой структурой происходит на порядок медленнее, чем с обычной, так что я не рекомендую использование этой возможности. Вместо этого лучше просто поменять местами некоторые поля в структуре - чаще всего помогает wink.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 2.6.2008, 9:55


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



Osta,
Мде... обьяснения - жуть.
Сразу могу описать ф-цию JsaSuitesList_SwitchStorage. Она же в таблице обработчиков событий. Описание обработчиков событий уже есть в SDK и примерах эльфов.
Код
UINT32 JsaSuitesList_SwitchStorage( EVENT_STACK_T * ev_st, void * app );

в ней R0 и R1 не менялись, а значит они передались в JsaSuitesList_SimpleEventProcess. Также не сложно описать и эту ф-цию.
Код
UINT32 JsaSuitesList_SimpleEventProcess( EVENT_STACK_T * ev_st, void * app, UINT32 ev_code );

UINT32 ev_code потому, что это код события (смотреть хотябы по значению).
Ниписать на Си ф-цию JsaSuitesList_SwitchStorage также просто:
Код
UINT32 JsaSuitesList_SwitchStorage( EVENT_STACK_T * ev_st, void * app )
{
    return JsaSuitesList_SimpleEventProcess( ev_st, app, 0x82555 );
}


Большинство ф-ций в synergy возвращают статус ( RESULT_OK / RESULT_FAIL / возможно_код_ошибки )

Вообще не рекомендую вызывать JsaSuitesList_SimpleEventProcess из своих эльфов т.к. в нее передается указатель на приложение, которое ее вызвало, а тот, кто написал эту ф-цию не предполагал, что ее вызовет другое приложение. Вобщем ребут очень вероятен ;).



Цитата
Ты, наверно, имел в виду UINT64? Я не помню точно, но то ли оно передаётся через R0+R1, толи через указатель... В любом случае, в прошивке оно очень редко встречается.

UINT64 и структуры, такого размера, возвращаются через R0+R1

Сообщение отредактировал G-XaD - 2.6.2008, 9:57
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
kadukmm
сообщение 4.6.2008, 4:12


Интересующийся
**

Группа: Разработчики
Сообщений: 83
Регистрация: 23.2.2007
Из: Украина, г. Винница
Пользователь №: 123 713
Модель телефона: Samsung SGH-I400
Прошивка: R373_49R&Symbian 9.1

Рейтинг: 120



Может не совсем в тему...
Случайно наткнулся на компилятор FreePascal для ARM.
http://www.freepascal.org/down/arm/linux-russia.var

Ну, так вот, вопрос к знающим: Есть ли возможность написания эльфов на языке Pascal?

И еще вопросчег: Ставить этот FreePascal (что для ARM) я так понял можно только на Linux ?

Сообщение отредактировал kadukmm - 4.6.2008, 4:25
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DmT
сообщение 4.6.2008, 4:49


Мото-Портной
******

Группа: Разработчики
Сообщений: 1 175
Регистрация: 31.3.2007
Пользователь №: 129 181
Модель телефона: LG GW620, L7e и др.
Победитель конкурса 2008

Рейтинг: 680



kadukmm,
Надо бы скачать да посмотреть как он устроен.
Ну с cygwin'ом можно и на венде запустить.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 4.6.2008, 20:44


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Цитата(kadukmm @ Вчера, 8:12)

Есть ли возможность написания эльфов на языке Pascal?
*

Полагаю, что да, раз есть линуксовый компилятор. Однако хочу предупредить, что во втором эльфпаке поддерживаются только эльфы из-под GCC.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 5.6.2008, 10:25


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



/me просит помощи у разработчиков эльфов, для создания эльфпака v2.0
Всех разработчиков, кому небезразлична судьба эльфпака, прошу обратить внимание smile.gif
Мы с вами имеем проблему с номерами ивентов. Объясню подробнее.
У нас резервируется для одного эльфа 64 номера ивентов для внутреннего использования, например для использования в диалогах List:
Код
/* reserve - выделенная база eventcode-ов (зарезервировано 64 значения)*/
UINT32 Register( char* file_uri,  char* param,  UINT32 reserve )

Также у нас есть некоторый набор "внешних" ивентов, которые мы хотим использовать в нашем эльфе. Как показала практика, этот набор может значительно различаться не только на разных платформах, но и на разных прошивках одной платформы.
Таким образом встают две задачи формирования таблиц обработки ивентов.
1) Заполнить таблицу внутренними ивентами, и как-то дальше с ними работать (получать обратно)
2) Заполнить таблицу внешними ивентами

Я предложил решение первой задачи в примере ListTest в SDK (функции LdrInitEventHandlersTbl и LdrFindEventHandlerTbl). У этой системы есть значительный недостаток - она не работает, если на несколько внутренних ивентов стоит один обработчик. Можно конечно сделать так, чтобы LdrFindEventHandlerTbl возвращал n-ый по счёту подходящий ивент, но тогда разработчику надо будет следить ещё и за этим.

Текущее решение второй задачи мне кажется не слишком удобным - ивенты объявляются как переменные. Есть предложение сделать функцию наподобие LdrInitEventHandlersTbl, а в таблицу сначала заносить не сами ивенты, а их условные идентификаторы, чтобы эта функция их заменяла на реальные номера ивентов для данной прошивки. Это решение мне лично не очень нравится, т.к. возникает ещё и проблема создания и обновления базы идентификаторов.

В общем, жду ваших предложений и размышлений на эту тему

Сообщение отредактировал Andy51 - 5.6.2008, 10:26
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Osta
сообщение 25.6.2008, 8:49


Freestyler
********

Группа: Легенды MotoFan.Ru
Сообщений: 10 329
Регистрация: 20.7.2004
Пользователь №: 8 235
Модель телефона: Moto
Прошивка: *#9999#


Настроение:
Все невыспавшиеся в следующей жизни будут котами



Рейтинг: 4362



во .. вроде отсюда пост не выкинут..

просто нашёл прогу :-) Прикрепленное изображение

hex-редактор HTE, готовую сборку которого можно бесплатно скачать с http://hte.sourceforge.net. Он "переваривает" ELF-формат, в нем есть мощный ассемблер и прочие вкусности.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
sasha45
сообщение 25.6.2008, 15:42


Ветеран
*****

Группа: Пользователи
Сообщений: 580
Регистрация: 13.7.2005
Из: Санкт-Петербург
Пользователь №: 46 095
Модель телефона: Motorola RIZR Z3

Рейтинг: 56



А что надо знать для написания эльфов? Я имею ввиду язык программирования. С/С++ или Java?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
om2804
сообщение 25.6.2008, 15:59


МотоКодер
******

Группа: Разработчики
Сообщений: 786
Регистрация: 14.8.2006
Из: Архангельск
Пользователь №: 95 055
Модель телефона: E398
Прошивка: DaR
Победитель конкурса 2008

Рейтинг: 1650



Вообще пишем на Си. Да и все перечисленные являются родственниками

Сообщение отредактировал om2804 - 25.6.2008, 16:01
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
sasha45
сообщение 25.6.2008, 16:11


Ветеран
*****

Группа: Пользователи
Сообщений: 580
Регистрация: 13.7.2005
Из: Санкт-Петербург
Пользователь №: 46 095
Модель телефона: Motorola RIZR Z3

Рейтинг: 56



Извиняюсь еще раз за флуд, а какой тип программирования тут нужен? Просто хочу присоединиться.
Я в универе учусь на 2 курсе. Изучаю структурное программирование. На данный момент изучил способы создания структур данных на языке Си и битовые операции. Этого хватит, или это вообще ни о чем?

P.S. Еще раз извиняюсь
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 25.6.2008, 16:33


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Цитата(sasha45 @ Сегодня, 20:11)

На данный момент изучил способы создания структур данных на языке Си и битовые операции.
*


Если знаешь только это - то не достаточно smile.gif Шучу, посмотри примеры из SDK - и поймёшь, хватает тебе знаний по языку или нет. В общем-то, там никаких сложных возможностей языка не задействовано

Сообщение отредактировал Andy51 - 25.6.2008, 16:35
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Osta
сообщение 26.6.2008, 6:47


Freestyler
********

Группа: Легенды MotoFan.Ru
Сообщений: 10 329
Регистрация: 20.7.2004
Пользователь №: 8 235
Модель телефона: Moto
Прошивка: *#9999#


Настроение:
Все невыспавшиеся в следующей жизни будут котами



Рейтинг: 4362



Цитата(sasha45 @ Вчера, 18:11)

Просто хочу присоединиться.
*


О, супер ! я тоже хочу, вчера только об этом говорили с Andy51
я себе скачал самоучитель по этому языку в html - формате
Прикрепленный файл KERNIGHAN_RITCHIE_C_PROGRAMMING.7z   ( 286.56 килобайт ) Кол-во скачиваний: 285


надеюсь эта тема теперь оживёт :-)
Прикрепленный файл KERNIGHAN_RITCHIE_C_PROGRAMMING.7z   ( 286.56 килобайт ) Кол-во скачиваний: 285
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
om2804
сообщение 27.6.2008, 20:38


МотоКодер
******

Группа: Разработчики
Сообщений: 786
Регистрация: 14.8.2006
Из: Архангельск
Пользователь №: 95 055
Модель телефона: E398
Прошивка: DaR
Победитель конкурса 2008

Рейтинг: 1650



Может уже кто-то знает об этом ресурсе, но всё же http://sobakator.samsfan.ru/

Информация в основном для патчеров на самсунги, но кое что и нам пригодится.
Анализ кода ARM процессоров - http://sobakator.samsfan.ru/knows_dissasembly.html
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
rex
сообщение 2.7.2008, 18:09


Мастер
****

Группа: Пользователи
Сообщений: 162
Регистрация: 10.5.2007
Из: Украина,Винницкая область
Пользователь №: 134 392
Модель телефона: L7/L9/Z3/E1
Прошивка: У меня их много :)

Рейтинг: 25.5



Думаю поучить си нетак он вроде и сложный. Смотрел исходники сложновато но время покажет . прекрепляю учебника для тех кто нифига не знает (за учебника спачибо om2804).

Сообщение отредактировал rex - 2.7.2008, 19:17
Прикрепленный файл _.rar   ( 32.78 килобайт ) Кол-во скачиваний: 197
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Osta
сообщение 10.7.2008, 8:22


Freestyler
********

Группа: Легенды MotoFan.Ru
Сообщений: 10 329
Регистрация: 20.7.2004
Пользователь №: 8 235
Модель телефона: Moto
Прошивка: *#9999#


Настроение:
Все невыспавшиеся в следующей жизни будут котами



Рейтинг: 4362



Цитата(svpFido @ Сегодня, 9:05)

может ктонить написать эльф , который при запуске выводил белый фон на весь экран и какой либо текс и выходил по *
*


я брал helloworld_gui.c и правил на
Код

UIS_MakeContentFromString(
        "MBa0Ns1LNt2Nd3",
        &content,
        0x1200021B,
        0x010000BF,
        current_time,
        current_date);
    
    dialog = UIS_CreateTransientNotice( &port, &content, 0x1D );
        
    if(dialog == 0) return RESULT_FAIL;

    papp->dialog = dialog;

    return RESULT_OK;

ну а обработка нажатия на * есть в другом примере , его выкладывали в этой ветке
с исходниками под названием event.elf
Эльф предназначен для поиска инвентов. Список инвентов выводится в лог мидвея.
Выход по * (звёздочке)
Код
/* Обработчик события, EV_KEY_PRESS в данном случае */
UINT32 HandleKeypress( EVENT_STACK_T *ev_st,  void *app )
{
    EVENT_T     *event = AFW_GetEv(ev_st);
    //APPLICATION_T           *papp = (APPLICATION_T*) app;    

    PFprintf("*ELF*  KeyPress = 0x%x\n", event->data.key_pressed);
    switch (event->data.key_pressed)
    {
        case KEY_STAR: // вот она , звездочка
            return destroyApp(ev_st, app);
        break;
    }
    
    return RESULT_OK;
}

Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 10.7.2008, 22:58


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Цитата(svpFido @ Вчера, 11:05)

может ктонить написать эльф , который при запуске выводил белый фон на весь экран и какой либо текс и выходил по *
*

Наверно, ты имеешь в виду рисование с Canvas-ом. Насколько я помню, om2804 выкладывал пример использования, когда добавлял его в SDK.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
RuslanchiK
сообщение 13.7.2008, 13:35


Мастер
****

Группа: Пользователи
Сообщений: 209
Регистрация: 4.11.2005
Из: Уфа
Пользователь №: 57 063
Модель телефона: E398, Zn5
Прошивка: E398-79R, Zn5-ZE0.9b


Настроение:
ИНЖЕНЕР!!!



Рейтинг: 44.5



Доброе время суток, вот решаил начать ковыряться в эльфостроении.
Для начала хочу написать эльф (чисто для себя), чтоб разбираться начать. Далее уже почти понял как прописывать эльф в автозагрузку.
Переписываю ТонеДБкиллер под себя. Пытаюсь удалить телефонную книгу. Не удаляет. Для тестинга переписываю под удаление фанлайта. Работает.
Внимание вопрос №1: Почему не удаляется DL_DMH_File? И еще, он кстати и вручную через Мотокоммандер не удаляется(((
Вопрос №2:
Код
DL_FsWriteFile(fname[index].fullname, 256, 1, f, &written );

Что за аргументы у этой функции??
Прошу сильно не бить, ковяряюсь в исходниках ОМа

Сообщение отредактировал RuslanchiK - 14.7.2008, 8:48
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
tim apple
сообщение 13.7.2008, 17:10


Мастер
****

Группа: Разработчики
Сообщений: 260
Регистрация: 13.7.2007
Из: РФ, Башкирия, Стерлитамак
Пользователь №: 141 375
Модель телефона: ---
Прошивка: ---

Рейтинг: 435



RuslanchiK, посоветовал бы тебе и всем кто хочет писать эльфы: посмотрите функции из стандартных библиотек языка С. я например использую справку от Borland C++ 5. можно и от VC++.

описание ф-ции есть в SDK, а именно в filesystem.h (в SDK от Ома точно есть)

UINT8 DL_FsWriteFile(
void* buffer, // данные для записи
UINT32 size, // размер одной записи (обычно размер записываемых данных)
UINT32 count, // количество записей (обычно 1)
FILE_HANDLE_T handle, // дескриптор файла, получают из DL_FsOpenFile
UINT32* written); // ф-ция возвращает кол-во успешно записанных данных

в случае успеха count == written

Сообщение отредактировал tim apple - 13.7.2008, 18:47
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Keannad
сообщение 13.7.2008, 17:20


Интересующийся
**

Группа: Пользователи
Сообщений: 40
Регистрация: 3.8.2005
Из: НиНо
Пользователь №: 47 743
Модель телефона: Samsung GALAXY S III

Рейтинг: 7



Если честно, более интересует ассемблер.
Есть по ниму какая нибудь инфа? Есть ли возможность использовать комманду asm{}?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 13.7.2008, 17:44


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



tim apple,
size и count придумали не просто так. Если мы записуем массив, то в size пишем размер в байтах одного элемента массива, а в count колличество элементов этого массива, сколько нужно записать в файл. Через written вернется не size*count, а кол-во успешно записанных элементов.

RuslanchiK,
А стоит ли пытаться не зная Си? Я лично несколько месяцев в 2004м или 2005м году учил С++, но реально понимать стал сравнительно недавно, когда изучал asm под ARM.

p.s.: Просмотрел недавно книжку по С++. Из полезного по Си там только синтаксис, остальное классы, перегруз, шаблоны... то, чего нет в Си. Хотя конечно для проекта посерьезнее (типа игры) лучше использовать вкусности С++.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
tim apple
сообщение 13.7.2008, 18:48


Мастер
****

Группа: Разработчики
Сообщений: 260
Регистрация: 13.7.2007
Из: РФ, Башкирия, Стерлитамак
Пользователь №: 141 375
Модель телефона: ---
Прошивка: ---

Рейтинг: 435



G-XaD, ты прав, я немного ступил , пост исправил.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 14.7.2008, 14:52


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Цитата(Keannad @ Вчера, 21:20)

Если честно, более интересует ассемблер.
Есть по ниму какая нибудь инфа? Есть ли возможность использовать комманду asm{}?
*

Инфы - завались! Тебе подойдёт любая информация, касающаяся 4-го поколения ARM ("armv4") или по ядру "ARM7" (только не путай индекс ядра с поколением). Например, Программная среда ARM (с) Mnemo - хорошее описание на русском языке, да ещё с примерами касательно дизассемблированного кода. Как справочник - рекомендую ARM Architecture Reference Manual ("ARMARM") by Addison Wesley, в ней каждая команда разжёвана побитно и вплоть до псевдокода.
Ну, а если тебя интересуют различные хитрости, уловки и приёмы на ассемблере для ARM - то на gbadev.org. На GBA такое же ядро как у нас, так что можно смело пользоваться большей частью информации, почерпнутой на их форуме. Однако иногда необходимо делать поправку на то, что у них - LittleEndian процессор, а у нас - BE.
Да, и asm{} можно и иногда даже нужно использовать wink.gif Иначе Screener.elf работал бы раза в два медленнее.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
nixel
сообщение 21.7.2008, 18:04


Интересующийся
**

Группа: Пользователи
Сообщений: 87
Регистрация: 19.8.2007
Из: Барнаул
Пользователь №: 144 977
Модель телефона: L7
Прошивка: ACR_RB

Рейтинг: 67.5



Чем дальше развиваю Инфограф, тем больше возникает вопросов ( хотя с функцией MsgUtilGetUnreadMsgsInAllFolders разобрался самостоятельно). Например:

1 каким образом можно скрыть статус-строку на рабочем столе?
2 как я понял, функция EV_MISSEDCALLS возвращает количество пропущенных звонков или я ошибаюсь?

И еще вопрос. Каким образом в Си можно присвоить символьной переменной символ с кодом (x+10)? Необходимо для оптимизации кода

Сообщение отредактировал nixel - 21.7.2008, 18:08
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 22.7.2008, 7:35


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



nixel,
1. Патчем убрать ее отрисовку. Подробнее - незнаю. Другой вариант - убрать из DRM картинки из статус строки. Это наверное возможно эльфом.
2. EV_MISSEDCALLS - это не ф-ция. Это адресс в прошивке откуда нужно прочитать данные уникальные для каждой прошивки, но одинаковые по использованию. Для чего именно это я не знаю, спроси у того, кто просил добавить это в либу. Например код события, которое нужно добавить с стэк для вызова приложения, которое передает файлы по БТ, уникален для каждой прошивки (разработчики в Motorola не добавляли в конец перечисления и чтото изменили в середине), но его можно прочитать в прошивке (ах да, адресс откуда его можно прочитать также уникален), поэтому в либу был добавлен адресс.
Реализация на примере EVENT_BT:

Код
// Глобальная переменная
// Ивент передачи по БТ
extern const UINT32 *            EVENT_BT;
// Указатель, на беззнаковую 32 битную переменную
/* В процессе загрузки эльфа в память elfloader заметит, что в эльфе
используется глобальная переменная с таким же именем, которое есть в
либе и исправит на значение из либы. const потому, что это адресс на
ROM (Read Only Memory) и изменять нельзя, если что компилятор укажет на ошибку */
{
    // переменная EVENT_BT - адресс
    // ...
    // юзаем гдето в теле ф-ции
    UINT32 ev_code = *EVENT_BT;
    // теперь знаем правильный код ивента и можем его использовать
    AFW_CreateInternalQueuedEvAux( ev_code, FBF_FREE, /* ... дальше то, что нужно */ );
    // ...
}
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Dex9999
сообщение 23.7.2008, 7:00


Интересующийся
**

Группа: Пользователи
Сообщений: 67
Регистрация: 18.6.2005
Пользователь №: 44 478
Модель телефона: V500
Прошивка: V500->V620->E1 (R373_G_0E.30.45R)

Рейтинг: 14



Подскажите как в ADS собрать библиотеку(хххх.о) из исходников. Какие ключи компиляции использовать?

Пока что делал:
Код

tcc -I../SDK -o my_lib.o -bigend -apcs /interwork table.c zex.c lib.o


Выдает ошибки:
Код

Undefined symbol __call_via_r2 (referred from zex.o).
Undefined symbol __call_via_r5 (referred from zex.o).
Undefined symbol __call_via_r6 (referred from zex.o).
Undefined symbol __call_via_r7 (referred from zex.o).
Undefined symbol __call_via_r3 (referred from zex.o).
Undefined symbol __call_via_r1 (referred from zex.o).
Undefined symbol __rt_memclr_w (referred from zex.o).
Undefined symbol Register (referred from lib.o).


Компиляция через armcc убирает ошибки с __call_via_r* но остаются
Код

Undefined symbol __rt_memclr_w (referred from zex.o).
Undefined symbol Register (referred from lib.o).

Нет у меня никакого __rt_memclr_w в исходниках

Сообщение отредактировал Dex9999 - 23.7.2008, 7:13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Osta
сообщение 24.7.2008, 8:39


Freestyler
********

Группа: Легенды MotoFan.Ru
Сообщений: 10 329
Регистрация: 20.7.2004
Пользователь №: 8 235
Модель телефона: Moto
Прошивка: *#9999#


Настроение:
Все невыспавшиеся в следующей жизни будут котами



Рейтинг: 4362



прочёл в одной теме
Цитата(nixel @ Сегодня, 7:57)

Поддержку выбора скинов эльфом считаю не нужной и для меня это будет сложновато, уйдет очень много времени.
*



немного развить хотел .. как считаете , может добавить в либу несколько функций
UIS_GetCurrentSkinIndex ; чтение номера активного скина
UIS_GetSkinName( UINT16 skinIndex); имя активного скина

да кто-то покажет пример получения пути ..
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
G-XaD
сообщение 24.7.2008, 10:04


Мастер
****

Группа: Разработчики
Сообщений: 171
Регистрация: 6.11.2007
Из: Donetsk City / Ukraine
Пользователь №: 153 083
Модель телефона: E1, k810
Прошивка: r373_g_0e.30.79r

Рейтинг: 323



Dex9999,
Цитата(Dex9999 @ Вчера, 10:00)

tcc -I../SDK -o my_lib.o -bigend -apcs /interwork table.c zex.c lib.o
*


А зачем обьектный файл компилятору подсовывать?
А вот ошибки выдаются линкером.
ф-ции __call_via_r* вызывают функцию, адресс которой прописан в регистре. Могу предположить, что ты пытался вызывать ф-цию, адресс которой задается в переменной. Наверное arm компилятор не использует эти ф-ции, а подставляет регистры прямо в коде (В arm режиме доступно раза в 2 больше регистров чем в тумбе).
__rt_memclr_w - это тоже самое, что memclr. Это стандартная библиотечная ф-ция. Компилятор сам подставляет ее где нужно также, как он подставляет ф-ции деления, сравнения переменных типа long long, сдвига переменных типа long long, etc...
Register - точка входа в эльф (аналогично main). Она прописана в Lib.o (этот файл нужно подлинковать к проекту для загрузчика от Andy51).


Osta,
Я себе добавлять не буду. Мне это просто не нужно (пока?). Но если это комуто нужно добавь, заодно и Set-теры добавь.

Сообщение отредактировал G-XaD - 24.7.2008, 10:05
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DmT
сообщение 24.7.2008, 18:36


Мото-Портной
******

Группа: Разработчики
Сообщений: 1 175
Регистрация: 31.3.2007
Пользователь №: 129 181
Модель телефона: LG GW620, L7e и др.
Победитель конкурса 2008

Рейтинг: 680



к этим ещё пожалуй стоит добавить
void UIS_SetSkin(UINT16 skin_index);
UINT16 UIS_GetNumSkins();
UINT16 UIS_GetDefaultSkinIndex();

А получения пути вообще нет.
Папка скинов - константа(SKINSFOLDER).
Путь это SKINSFOLDER + UIS_GetSkinName( UINT16 skinIndex);

PS как удачно совпало: я буквально сегодня 4 часа назад добавил эти функции себе в SDK

Пример использования
Получение папки текущего скина.
Код
WCHAR* GetCurrentSkinFolder()
{
       WCHAR SkinFolder[256];
       UINT8 SkinID=UIS_GetCurrentSkinIndex();
       SkinFolder:=L"file://c/mobile/skins/";
       u_strcat(SkinFolder,UIS_GetSkinName(SkinID));
       return SkinFolder;
}

Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
nixel
сообщение 28.7.2008, 17:29


Интересующийся
**

Группа: Пользователи
Сообщений: 87
Регистрация: 19.8.2007
Из: Барнаул
Пользователь №: 144 977
Модель телефона: L7
Прошивка: ACR_RB

Рейтинг: 67.5



Кто мне сможет подсказать в чем проблема? 3 день уже не могу реализовать аналог простейшей функции a=char(x) - символьной переменной а присваивается символ с кодом x ASCII
Изображение
Код
CLK_TIME_T Time(char *buf_time)
{
    WCHAR s[]= { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    CLK_TIME_T time;
    UINT32 h, m;
  
    DL_ClkGetTime( &time);
    h=time.hour;
    m=time.minute;

    strcpy(buf_time, "");

    if (h <= 9)
     {
       strcat(buf_time, s[0]);
      }

    strcat(buf_time, s[h]);
    strcat(buf_time, ":");

    if (m <= 9)
     {
        strcat(buf_time, s[0]);
      }

    strcat(buf_time, s[m]);
          
    return time;
}


Сообщение отредактировал nixel - 28.7.2008, 17:43
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Chik_v
сообщение 28.7.2008, 17:55


Опытный
***

Группа: Разработчики
Сообщений: 107
Регистрация: 13.1.2007
Из: Херсон
Пользователь №: 116 653
Модель телефона: Samsung i5700
Прошивка: i570EXXJH7
Победитель конкурса 2008

Рейтинг: 174.5



Цитата(nixel @ Сегодня, 20:29)

strcat(buf_time, s[h]);
*



Помойму тут у тебя ошибка, ты с помощью strcat пытаешься слить ascii строку и unicode символ. И естественно из этого не выйдет ничего, т.к. unicode символы двухбайтные, и в начале каждого символа идёт ноль (например для цифры 1 ascii код будет 31h, а в unicode это 00h 31h). Т.к. с-строки оканчиваются нулём, то у тебя ничего не сливается. Тебе надо обьявить s[] как
Код
char s[]= { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

Помойму так smile.gif

Сообщение отредактировал Chik_v - 28.7.2008, 17:56
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
nixel
сообщение 28.7.2008, 18:02


Интересующийся
**

Группа: Пользователи
Сообщений: 87
Регистрация: 19.8.2007
Из: Барнаул
Пользователь №: 144 977
Модель телефона: L7
Прошивка: ACR_RB

Рейтинг: 67.5



Chik_v, исправил, ошибки те же самые smile.gif Буду делать обходным путем, а ведь хотел этим методом немного код оптимизировать.

PS фигово писать на языке, который не знаешь... (с)


[om2804]
Может тогда стоит изучить? Я не понял, что требуется, но грубые ошибки на лицо. Да, и ещё в Си нет типа Строка. Строка - это всего лишь массив кодов символов, заканчивающийся нулём


Сообщение отредактировал om2804 - 28.7.2008, 18:19
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
om2804
сообщение 28.7.2008, 18:36


МотоКодер
******

Группа: Разработчики
Сообщений: 786
Регистрация: 14.8.2006
Из: Архангельск
Пользователь №: 95 055
Модель телефона: E398
Прошивка: DaR
Победитель конкурса 2008

Рейтинг: 1650



Вот так

Код
CLK_TIME_T Time(char *buf_time)
{
    CLK_TIME_T   time;
    UINT32          h, m;

             // Получаем время
    DL_ClkGetTime( &time);
    h=time.hour;
    m=time.minute;

            buf_time[0] = 0;

    if (h <= 9)
    {
       strcat(buf_time, "0"); // добавляем 0 если меньше 9
    }

            _itoa(h,  buf_time+strlen(buf_time), 10); // преобразуем число в строку
            strcat(buf_time, ":");


    if (m <= 9)
    {
         strcat(buf_time, "0");
    }

    _itoa(m,  buf_time+strlen(buf_time), 10);
          
    return time;
}


Сообщение отредактировал om2804 - 28.7.2008, 18:38
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Nur87
сообщение 28.7.2008, 18:57


Мастер
****

Группа: Пользователи
Сообщений: 298
Регистрация: 17.10.2005
Из: Татарстан
Пользователь №: 54 836
Модель телефона: E398

Рейтинг: 100



разбираюсь с сдк, там есть функция
Код
/* Создаёт диалог-запрос */
UIS_DIALOG_T UIS_CreateConfirmation( SU_PORT_T *port,  CONTENT_T *content );

пробую делать так. что я неправильно делаю?
Код
UINT32 HandleKeypress( EVENT_STACK_T *ev_st,  void *app )
{
    EVENT_T     *event = AFW_GetEv(ev_st);
    APPLICATION_T           *papp = (APPLICATION_T*) app;
    SU_PORT_T               port = papp->port;
    CONTENT_T content;
    UtilLogStringData(" *** ELF *** HelloWorld: key pressed 0x%X", event->data.key_pressed);
    
    if(event->data.key_pressed == 0) DAL_DisableDisplay( 0 );
    if(event->data.key_pressed==1) DAL_EnableDisplay( 0 );
    if(event->data.key_pressed==2) UIS_CreateConfirmation( &port,  &content );

    return RESULT_OK;
}

и что за типы такие UINT32, ....
я чуток знаю с++, там с такими не встречался. в эльфах есть int, AnsiString, char?


[om2804]
Забыл создать content, который передаёшь диалогу. Делается это с помощью функции UIS_MakeContentFromString.
UINT32 и прочие объявлены в SDK в хидере typedefs.h


И AnsiString в эльфах нет ни в каком виде, если только ты не решишься написать smile.gif A51

Сообщение отредактировал Andy51 - 30.7.2008, 17:25
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 31.7.2008, 9:31


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255

Рейтинг: 1224



Цитата(om2804 @ 28.7.2008, 22:36)

CLK_TIME_T Time(char *buf_time)
{
CLK_TIME_T time;
UINT32 h, m;

// Получаем время
DL_ClkGetTime( &time);
h=time.hour;
m=time.minute;

buf_time[0] = 0;

if (h <= 9)
{
strcat(buf_time, "0"); // добавляем 0 если меньше 9
}

_itoa(h, buf_time+strlen(buf_time), 10); // преобразуем число в строку
strcat(buf_time, ":");


if (m <= 9)
{
strcat(buf_time, "0");
}

_itoa(m, buf_time+strlen(buf_time), 10);

return time;
}
*



Я как оптимизатор не могу на это смотреть без слёз x_x
Предложу сразу два варианта, как сделать намного лучше.
Оптимайз по скорости:
Код
CLK_TIME_T Time(char *buf_time)
{
    CLK_TIME_T    time;
    UINT32        t, r;

    // Получаем время
    DL_ClkGetTime( &time );

    for( r='0',t=time.hour; t>9; t-=10,r++ ); // Считаем десятки и остаток для часов сразу

    // Пользуемся заранее известной длиной строки
    buf_time[0] = r;
    buf_time[1] = '0'+t; // Используем факт, что коды цифр идут последовательно
    
    buf_time[2] = ':';
    
    // То же самое, но для минут
    for( r='0',t=time.minute; t>9; t-=10,r++ );

    buf_time[3] = r;
    buf_time[4] = '0'+t;
          
    return time;
}


И оптимайз по спейсу smile.gif
Код
CLK_TIME_T Time(char *buf_time)
{
    CLK_TIME_T    time;

    // Получаем время
    DL_ClkGetTime( &time );
    
    // Получаем нужную строку
    sprintf(buf_time, "%.2i:%.2i", time.hour, time.minute);
          
    return time;
}
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DmT
сообщение 2.8.2008, 16:39


Мото-Портной
******

Группа: Разработчики
Сообщений: 1 175
Регистрация: 31.3.2007
Пользователь №: 129 181
Модель телефона: LG GW620, L7e и др.
Победитель конкурса 2008

Рейтинг: 680



Дорогие друзья, с подачи Andy51 мною был найден способ написания эльфа который может работать и в фоновом режиме и в режиме работы с ГУИ.
Для этого надо:
1. Вызывать функцию:
Код
    APP_ChangeRoutingStack( app,
                            ev_st,
                            (void *)EventsMonitor,
                            (isShow ? 1 : 0),
                            0,
                            1,
                            2);

при каждом изменении состояния(фон/нефон) приложения.

2. Должна быть объявлена функция
Код
UINT32 EventsMonitor( EVENT_STACK_T *ev_st, APPLICATION_T *app, APP_ID_T app_id, REG_ID_T reg_id )
{
    EVENT_T     *event;
    UINT32 i;

    if(event->code == EV_KEY_PRESS)
    {
        HandleKeypress( ev_st, app );
     HandleEventX( ev_st, app, app_id, reg_id );
        return RESULT_OK;
    }

    HandleEventX( ev_st, app, app_id, reg_id );
    return RESULT_OK;
}

это собственный обработчик событий. для примера написал ивент EV_KEY_PRESS.
нужен потому что я не знаю как делать иначе (=

3. Должна быть объявлена функция
Код
UINT32 HandleEventX( EVENT_STACK_T *ev_st, APPLICATION_T *app, APP_ID_T app_id, REG_ID_T reg_id )
{
    if(isShow)APP_HandleEvent( ev_st, app, app_id, reg_id );
    else APP_HandleEventPrepost( ev_st, app, app_id, reg_id );
    return RESULT_OK;
}

это переключатель стандартных обработчиков событий. нужен чтобы передавайть события дальше прошивке.

4. В функции startApp должно быть
Код
        app = (APP_HELLOWORLD_T*)APP_InitAppData( (void *)EventsMonitor,
                                                  sizeof(APP_HELLOWORLD_T),
                                                  reg_id,
                                                  0, 1,
                                                  1,
                                                  2, (isShow ? 1 : 0), 0 );


* isShow - TRUE если в режиме ГУИ, FALSE если в режиме фоновой работы

Вот и все!!! Всем удачи!
Саму функцию смотрим тут
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Учимся писать эльфов вместе, Обсуждение процесса кодинга · Эльфы, их разработка и портирование · Forum
 

16 страниц V < 1 2 3 4 > » 
Ответ в темуСоздание новой темы
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 18.9.2025, 9:11

Форум живёт: