84
правкиИзменения
Нет описания правки
Application - приложение для системы [[AFW]]. Приложение это именно то, что взаимодействует с пользователем (драйвера, в отличие от приложений, обычно не взаимодействуют с пользователем, они работают с железом и приложениями или [[OS|операционной системой]]).
Приложение для AFW разрабатывалось таким, чтобы работать из [[ROM]]'а, поэтому приложение может вообще не иметь глобальных переменных, все данные приложения должны храниться в структуре приложения, в которой первой должна быть структура [[APPLICATION_T]], указатель . Указатель на экземпляр текущего приложения передаётся в каждом обработчике событий, из которых по сути и состоит приложение. В приложениях из эльфов немного иначе, как минимум таблица ивентов регистрации должна быть в [[RAM]]'е, т.к. база ивентов выделяется динамически. В прошивке коды ивентов назначаются автоматически в процессе компиляции.
== Таблица [[Event|ивентов]] регистрации ==
Массив кодов ивентов на которые стартует приложение. На эти ивенты , регистрируется функция старта приложения. Для эльфов это обычно один единственный ивент код которого записывается в глобальной структуре [[ldrElf]].
== Регистрация ==
Приложение должно быть зарегестрировано в системе [[AFW]], делается это функцией [[APP_Register]]. Её параметры:
Регистрируется приложение один раз и удалить регистрацию потом будет невозможно, а эльф обычно должен выгружаться из памяти, поэтому нужно исключить совпадение ивентов для выгружаемого эльфа, для этого используется функция [[ldrRequestEventBase]], которая каждый раз возвращает уникальный свободный код ивента который можно использовать как "свои" ивенты. Даже более, следующие 63 кода тоже свободны и никогда не встретятся. При регистрации система запоминает не ивенты, а адресс таблицы, а т.к. память эльфа может быть освобождена данные могут быть изменениы и это может быть источником глюков, от этого никуда не деться.
== Состояния Таблица состояний ({{lang-en|states}}) ==
В один момент времени приложение в целом может находиться в одном из состояний, за исключением зарезервированного ANY под индексом 0. От стэйта зависит поведение приложения. Когда на стандартный обработчик событий приложением (задается первым параметром в [[APP_InitAppData]] при старте приложения) поступает ивент он ищет код этого ивента в таблице обработчиков ивентов, которая записана под ANY стэйтом, если там не находит, то ищет в таблице под текущим стэйтом и вызывает обработчик события. Если обработчик ивента вернул чтото отличное от RESULT_OK вызывается функция выхода из приложения.
Одно состояние должно иметь: