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 килобайт ) Кол-во скачиваний: 1155
  3. "Язык программирования C"
    Прикрепленный файл C_book.zip   ( 220.86 килобайт ) Кол-во скачиваний: 899
Исходники эльфов
  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 килобайт ) Кол-во скачиваний: 2174
Прикрепленный файл C_book.zip   ( 220.86 килобайт ) Кол-во скачиваний: 899
Прикрепленный файл Spr_po_C.rar   ( 934.62 килобайт ) Кол-во скачиваний: 1155
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 17.2.2008, 14:51


0xFFFF
******

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

Рейтинг: 1224



MONSTER92, покажи полный код функции
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
MONSTER92
сообщение 17.2.2008, 14:58


Мастер
****

Группа: Пользователи
Сообщений: 224
Регистрация: 19.11.2006
Пользователь №: 107 368
Модель телефона: ROKR e6
Прошивка: Неважно

Рейтинг: 9.5



Я просто эксперементирую с helloWorld Gui , покачто хочу чтоб время вывелось, потом наверно буду делать время до ближайшего звонка smile.gif
Код

UINT32 MainStateEnter( EVENT_STACK_T *ev_st,  void *app,  ENTER_STATE_TYPE_T type )
{
    APPLICATION_T           *papp = (APPLICATION_T*) app;
    SU_PORT_T               port = papp->port;
    CONTENT_T               content;
    UIS_DIALOG_T            dialog = 0;


TIME timenow;
UINT8 hoursnow;
DL_ClkGetTime(&timenow);
hoursnow = timenow.hour;

int i=100;

WCHAR msg[100] = L"Hello world!";
char msg2[100];
  sprintf(msg2,"i=%i",i);
   u_atou(msg2, msg);
        
        
//------------ дальше без изменений

    if(type!=ENTER_STATE_ENTER) return RESULT_OK;
    
    UIS_MakeContentFromString("MCq0", &content, msg); //Создаём контент из строки
    
    dialog = UIS_CreateTransientNotice( &port, &content, 4/* NOTICE_TYPE_DEFAULT */);
    
    UtilLogStringData(" *** ELF *** HelloWorld: MainStateEnter 0x%X", dialog);
    
    if(dialog == 0) return RESULT_FAIL;

    papp->dialog = dialog;

    return RESULT_OK;
}
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 17.2.2008, 15:01


0xFFFF
******

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

Рейтинг: 1224



Цитата(MONSTER92 @ Сегодня, 17:58)

int i=100;

WCHAR msg[100] = L"Hello world!";
char msg2[100];
*


ads почему-то требует, чтобы все переменные объявлялись в начале функции, ДО всякого кода
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Dex9999
сообщение 7.5.2008, 10:47


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

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

Рейтинг: 14



Я сам только начал разбираться с эльфами и возникли след. вопросы:
1) Событие EV_MME_CLOSE_COMPLETE должно срабатывать при закрытии ранее открытого файла т.е. после выполнения MME_GC_playback_delete()? У меня пока что не получается.
2) Можно ли одновременно открыть несколько файлов через MME_GC_playback_create() для их последующего воспроизведения через вызов MME_GC_playback_start()? Опять же у меня прокатывает только с одним открытым файлом в данный момент.
3) Дайте линк на "p2k Data loger" с помощью которой можно читать лог команды UtilLogStringData() - это написано в SDK в trace.h но самой програмы я найти нигде не могу. Через лог мидвея неудобно отлаживать - приходится отключать мидвей чтобы залить пересобраный эльф, потом заново коннектить мидвей, перетыкая провод.

Спасибо.

UPD:
Так и знал что сюда никто не заглянет sad.gif А тем временем вопросов всё больше - может кто научит определять количество параметров свеженайденных в прошивке функций, я бы СДК помог пополнять? А то нахожу функцию, смотрю на код в IDA и не доходит как определить кол-во и тип параметров и возварщаемое значение. Опыт в программировании есть и не маленький так что можно объяснять без азов, кратенько.

Сообщение отредактировал Dex9999 - 8.5.2008, 14:18
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Morpheuz
сообщение 21.5.2008, 2:54


Опытный
***

Группа: Пользователи
Сообщений: 109
Регистрация: 17.6.2006
Из: Харьков
Пользователь №: 88 149
Модель телефона: L7e NS2.0+Elf

Рейтинг: 3.5



serzh44
Как продвигаються дела с классами?
Как я понял для того чтобы использовать какую-то ф-ю нужно сначала ее "найти" в прошившке? или что-то не так понял?
p.s.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
kadukmm
сообщение 23.5.2008, 23:54


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

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

Рейтинг: 120



Цитата(Dex9999 @ 7.5.2008, 13:47) *

А то нахожу функцию, смотрю на код в IDA и не доходит как определить кол-во и тип параметров и возварщаемое значение. Опыт в программировании есть и не маленький так что можно объяснять без азов, кратенько.

Я так понимаю, судя по логике, нада смотреть именно асмовый код для опрееделения параметров... Т.е. нада знать какая конвенция вызова функций (типа какой параметр в каком регистре передаеться), а дальше уже просто по коду смотришь какие регистры считываються...

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


Freestyler
********

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


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



Рейтинг: 4362



Цитата(kadukmm @ Сегодня, 1:54)

Я так понимаю, судя по логике, нада смотреть именно асмовый код для опрееделения параметров... Т.е. нада знать какая конвенция вызова функций (типа какой параметр в каком регистре передаеться), а дальше уже просто по коду смотришь какие регистры считываються...
*


я попробую привести пример , а вы скажите верен ли он:
открываем в ida эльф прошивки Е398, идём например в jsa_suiteslist_agent_dialog_ev_table
судя по названию, это контекстное меню в списке java - приложений , смотрим таблицу
Код
CORE_APPS:10413E2C jsa_suiteslist_agent_dialog_ev_table
CORE_APPS:10413E2C                 DCD 0x2043
CORE_APPS:10413E2C                 DCD JsaSuitesList_Navigate+1
CORE_APPS:10413E2C                 DCD 0x2020
CORE_APPS:10413E2C                 DCD JsaSuitesList_Done+1
CORE_APPS:10413E2C                 DCD 0x202C
CORE_APPS:10413E2C                 DCD JsaSuitesList_GetData+1
CORE_APPS:10413E2C                 DCD 0x2058
CORE_APPS:10413E2C                 DCD JsaSuitesList_Select+1
CORE_APPS:10413E2C                 DCD 0x8254B
CORE_APPS:10413E2C                 DCD JsaSuitesList_Delete+1
CORE_APPS:10413E2C                 DCD 0x8254D
CORE_APPS:10413E2C                 DCD JsaSuitesList_Details+1
CORE_APPS:10413E2C                 DCD 0x82551
CORE_APPS:10413E2C                 DCD JsaSuitesList_Permissions+1
CORE_APPS:10413E2C                 DCD 0x82552
CORE_APPS:10413E2C                 DCD JsaSuitesList_SecDetails+1
CORE_APPS:10413E2C                 DCD 0x8254C
CORE_APPS:10413E2C                 DCD JsaSuitesList_TellAFriend+1
CORE_APPS:10413E2C                 DCD 0x82556
CORE_APPS:10413E2C                 DCD JsaSuitesList_SortByName+1
CORE_APPS:10413E2C                 DCD 0x82557
CORE_APPS:10413E2C                 DCD JsaSuitesList_SortBySize+1
CORE_APPS:10413E2C                 DCD 0x82558
CORE_APPS:10413E2C                 DCD JsaSuitesList_Protect+1
CORE_APPS:10413E2C                 DCD 0x20C5
CORE_APPS:10413E2C                 DCD JsaSuitesList_Shortcut+1
CORE_APPS:10413E2C                 DCD 0x82555
CORE_APPS:10413E2C                 DCD JsaSuitesList_SwitchStorage+1
CORE_APPS:10413E2C                 DCD 0xFFFFFFFF
CORE_APPS:10413E2C                 DCD 0

видим , что тут коды клавиш и другие коды, которые передаются в определённые функции.
рассмотрим к примеру участок смены места хранения java
CORE_APPS:10413E2C DCD 0x82555
CORE_APPS:10413E2C DCD JsaSuitesList_SwitchStorage+1
тоесть код 82555 передаётся в процедуру JsaSuitesList_SwitchStorage
лезем и смотрим эту процедуру
Код
CORE_APPS:1039522E JsaSuitesList_SwitchStorage
CORE_APPS:1039522E                 LDR     R2, =0x82551   ; Load from Memory
CORE_APPS:10395230                 PUSH    {R7,LR}        ; Push registers
CORE_APPS:10395232                 ADD     R2, #4         ; Rd = Op1 + Op2
CORE_APPS:10395234                 BL      JsaSuitesList_SimpleEventProcess; Branch with Link
CORE_APPS:10395238                 POP     {R7}           ; Pop registers
CORE_APPS:1039523A                 POP     {R3}           ; Pop registers
CORE_APPS:1039523C                 BX      R3             ; Branch to/from Thumb mode
CORE_APPS:1039523C; End of function JsaSuitesList_SwitchStorage

она проста : в процедуру JsaSuitesList_SimpleEventProcess передаётся значение R2
тоесть мы можем сделать эльф , который по зажатию к примеру зелёной кнопки вызова
передаст значение 82555 в процедуру JsaSuitesList_SimpleEventProcess и тем самым
переключит или вызовет диалог переключения устройств хранения java
Для этого нам нужно кроме написания эльфа добавить в elfloader.lib процедуру JsaSuitesList_SimpleEventProcess

вот так вообщем...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Dex9999
сообщение 26.5.2008, 4:37


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

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

Рейтинг: 14



Цитата(Osta @ 24.5.2008, 11:20) *

Код
CORE_APPS:1039522E JsaSuitesList_SwitchStorage
CORE_APPS:1039522E                 LDR     R2, =0x82551; Load from Memory
CORE_APPS:10395230                 PUSH    {R7,LR}; Push registers
CORE_APPS:10395232                 ADD     R2, #4; Rd = Op1 + Op2
CORE_APPS:10395234                 BL      JsaSuitesList_SimpleEventProcess; Branch with Link
CORE_APPS:10395238                 POP     {R7}        ; Pop registers
CORE_APPS:1039523A                 POP     {R3}        ; Pop registers
CORE_APPS:1039523C                 BX      R3    ; Branch to/from Thumb mode
CORE_APPS:1039523C; End of function JsaSuitesList_SwitchStorage

она проста : в процедуру JsaSuitesList_SimpleEventProcess передаётся значение R2
тоесть мы можем сделать эльф , который по зажатию к примеру зелёной кнопки вызова
передаст значение 82555 в процедуру JsaSuitesList_SimpleEventProcess и тем самым
переключит или вызовет диалог переключения устройств хранения java
Для этого нам нужно кроме написания эльфа добавить в elfloader.lib процедуру JsaSuitesList_SimpleEventProcess


Замечательно. Наверное еще было бы хорошо не просто использовать в своем эльфе найденную функцию, а еще добавить ее в SDK и для остальных. Судя по асм-коду надо будет добавить
Код

void saSuitesList_SimpleEventProcess(int event);

потому что я не вижу чтобы какой-то регистр возвращал что-нибудь(по идее надо вернуть bool-успешно или нет прошел вызов; наверное в телефоне система не имеет "привычки" делать подобное).
А может тип передаваемого параметра не int, а скажем DWORD? Как это определить?
И второе что не понятно лично мне: а если в функции saSuitesList_SimpleEventProcess используется некий регистр (допустим там ADD R5, R2 есть) который был задан ранее чем мы видим в выше приведенных участках кода? Быть может он тоже есть параметр для вызова функции?

Сообщение отредактировал Dex9999 - 26.5.2008, 4:42
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Мачо
сообщение 26.5.2008, 5:01


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

Группа: Легенды MotoFan.Ru
Сообщений: 456
Регистрация: 26.7.2004
Из: Киров
Пользователь №: 8 569
Модель телефона: Е398 (умер), E6
Прошивка: Dream A Reality 2.0
Финалист Конкурса 2010

Рейтинг: 1410



А не проще просто послать этот эвент из эльфа. И прошивка сама запустит эту функцию.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 26.5.2008, 6:49


0xFFFF
******

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

Рейтинг: 1224



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

потому что я не вижу чтобы какой-то регистр возвращал что-нибудь(по идее надо вернуть bool-успешно или нет прошел вызов; наверное в телефоне система не имеет "привычки" делать подобное).
*

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

Видишь, перед выходом в R0 кладётся какое-то значение из внутреннего регистра, оно и будет так же возвращаемым значением в JsaSuitesList_SwitchStorage.
Цитата(Dex9999 @ Сегодня, 8:37)

А может тип передаваемого параметра не int, а скажем DWORD? Как это определить?
*

Ты, наверно, имел в виду UINT64? Я не помню точно, но то ли оно передаётся через R0+R1, толи через указатель... В любом случае, в прошивке оно очень редко встречается.
Цитата(Dex9999 @ Сегодня, 8:37)

И второе что не понятно лично мне: а если в функции saSuitesList_SimpleEventProcess используется некий регистр (допустим там ADD R5, R2 есть) который был задан ранее чем мы видим в выше приведенных участках кода? Быть может он тоже есть параметр для вызова функции?
*

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

Сообщение отредактировал Andy51 - 26.5.2008, 19:04
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
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
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Учимся писать эльфов вместе, Обсуждение процесса кодинга · Эльфы, их разработка и портирование · Forum
 

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

 



Текстовая версия Сейчас: 18.8.2025, 2:31

Форум живёт: