Nucleus PLUS
Nucleus PLUS в Siemens.
Итак, надо наконец-то уяснить, что у нас в телефоне не просто прошивка, у нас в телефоне целая операционная система реального времени Nucleus RTOS, причём многозадачная. Эта самая многозадачность никак не связана, например с CSM, многозадачность это параллельное выполнение задач, т.е. паралельное исполнение машинного кода со всеми вытекающими. Параллельное исполнение это тревиально, конечно, так как основной процессор один, но, тем не менее, получается такой эффект.
На SGold, в частности в CX75 стоит вот такая версия:
"Copyright MGC 2002 - Nucleus PLUS - Integrator ADS v. 1.14.8"
А вот на E71 посвежее версия:
"Copyright MGC 2004 - Nucleus PLUS - Integrator RVCT v. 1.15"
В имеющихся исходниках мы имеем вот такую версию:
"Copyright MGC 2002 - Nucleus PLUS - ARM925 Code Composer v. 1.14.1"
Описание
Операционная система Nucleus, разработанная корпорацией Accelerated Technology, предназначена для встраиваемых приложений. Nucleus является кросс-системой, т.е. программный продукт создается на одной программно-аппаратной платформе, а выполняется на другой. ОСРВ Nucleus поставляется вместе с открытым кодом.
Ядро ОСРВ Nucleus, Nucleus PLUS, обеспечивает многозадачную обработку, является переносимым и масштабируемым.
Ядро реализовано как библиотека функций на языке C. Nucleus PLUS предоставляет такие возможности, как управление взаимодействием задач (почтовые ящики, очереди, каналы, семафоры, события, сигналы), а также управление памятью, таймерами, прерываниями. Планирование задач осуществляется на основе приоритетов, а также
по алгоритму FIFO. При выполнении системного вызова выполнение задачи может приостанавливаться на неопределенное время, на заданный интервал, или не приостанавливаться. Все объекты в системе могут создаваться и удаляться динамически.
Сама операционная система воплощает в себе несколько методов по использованию RAM и процессорного времени:
- Управление задачами (Task Control)
- Динамически распределяемая память (Dynamic Memory)
- Фрагментная память (Partition Memory)
- Почтовые ящики (MailBoxes)
- Каналы (Pipes)
- Очереди (Queues)
- Семафоры (Semaphores)
- Группы событий (Event Groups)
- Сигналы (Signals)
- Таймеры (Timers)
- Прерывания (Interrupts)
- Драйвера (I/O Drivers)
----------------------------------
Управление задачами (Task Control)
----------------------------------
Задачи это полунезависимые программные сегменты с определённым назначением.
Большинство современных приложений реального времени (ПО в целом) требуют много задач. Заодно эти задачи часто используются с варьируемым приоритетом, т.е. с разной степенью важности. Управление ими, исполнение их исходя из приоритета задачи есть самая главная цель операционной системы реального времени Nucleus PLUS.
----------------------------------
Динамически распределяемая память (Dynamic Memory)
----------------------------------
Область динамической памяти содержит фрагменты памяти, размер которых выбирается пользователем. Т.е., мы можем выделить нужный нам размер памяти для программы. Адресация этих фрагментов автоматическая. Собственно, захват памяти разного размера и ёё освобождение обеспечивается областью динамической памяти. Если размер захватываемого фрагмента превышает размер самого большего свободного блока, то захват не состоится в принципе, ошибка передастся приложению. Даже если показатель свободной памяти во много превышает размер захватываемого блока, это не означает что память всегда выделится, т.е. свободная память разбита на блоки. Величина самого большего блока есть максимальный размер захватываемого фрагмента памяти.
----------------------------------
Фрагментная память (Partition Memory)
----------------------------------
Область фрагментной памяти содержит определённое количество фрагментов памяти с одинаковыми размерами. Достоинство такой памяти по сравнению с динамически выделямой очевидно, - это отсутствие фрагментации памяти, т.е. память можно забить "под завязку". Недостаток: здесь пользователь не может выбирать любой размер фрагмента, он настраивается при создании области такой памяти.
----------------------------------
Почтовые ящики (Mailboxes)
----------------------------------
Почтовые ящики это механизм передачи простых междупроцессных сообщений. Каждый почтовый ящик вмещает сообщение размером в четыре 32-битных слова. Сообщения принимаются и отправляются по значению. Передача сообщения требует его копию в почтовом ящике, тогда как приём требует копию извне.
----------------------------------
Очереди (Queues)
----------------------------------
Очереди обеспечивают передачу нескольких сообщений подряд. Передача сообщения требует его
копию в очереди, тогда как приём требует копию извне. Сообщения могут размещаться
как в конце очереди, так и в её начале. Очереди содержат сообщения размером одного или
нескольких 32-битных слов. Длина сообщения может быть как фиксированной, так и варьироваться.
Формат сообщений определяется при создании очереди.
----------------------------------
Каналы (Pipes)
----------------------------------
Каналы обеспечивают передачу нескольких сообщений подряд. Передача сообщения требует его
копию в канале, тогда как приём требует копию извне. Сообщения могут размещаться
как в конце канала, так и в его начале. Каналы содержат сообщения размером одного или
нескольких байт. Длина сообщения может быть как фиксированной, так и варьироваться.
Формат сообщений определяется при создании канала.
----------------------------------
Семафоры (Semaphores)
----------------------------------
Семафоры обеспечивают механизм запрета одновременного выполнения заданных участков кода и поочерёдный доступ к критическому ресурсу (важному ресурсу, для которого невозможен
одновременный доступ). Nucleus PLUS обеспечивает подсчет семафоров, которые варьируются
в диапазоне от 0 до 4294967294.
----------------------------------
Группа событий (Event groups)
----------------------------------
Группа событий обеспечивает механизм индикации произошедших системных событий.
Событие определяется одним битом в группе событий. Этот бит называется флаг события (Event flag). В каждой группе событий имеются 32 таких флага. Флаги могут быть установлены или сброшены при использовании логических поразрядных операций (AND/OR).
----------------------------------
Сигналы (Signals)
----------------------------------
Сигналы это тоже что-то вроде флагов событий. Однако есть серьёзные различия. Задачи
игнорируют флаги событий, а вот когда сигнал установлен, запускается специальная процедура
обработки сигналов, они то и определяют, когда задача выполняется, а когда нет.
Одна задача вмещает 32 сигнала, один сигнал представлен одним битом.
----------------------------------
Таймеры (Timers)
----------------------------------
Большинство приложений реального времени требуют использования обработки процедур в одинаковый период времени. Каждая задача в Nucleus PLUS RTOS имеет встроенный таймер. Этот таймер используется для активации и дезактивации (сна) задачи.
----------------------------------
Прерывания (Interrupts)
----------------------------------
Прерывания это механизм немедленного отклика на внутренние или внешние события.
Когда прерывание случилось, процессор приостанавливает своё текущее действие и передаёт управление в процедуру обработки прерываний (Interrupt Service Routine (ISR)).
----------------------------------
Драйверы (I/O Drivers)
----------------------------------
Большинство приложений реального времени требуют ввод и вывод данных на различную периферию. Управление вводом и выводом в обеспечивается за счёт драйверов устройств.
Информация для разработчиков
Задать вопрос, отписаться о тестировании ф-ий, поделится наработками вы можете на форуме.
Разрабатываемый проект IAR'a, пока просто пример вы можете скачать здесь.
Он содержит исходники для компиляции этой RTOS на IAR в ELF или BIN файл, для изучения Assembler кода.
На сегодняшний день найдены следующие ф-ии для SGold X75 (адреса ф-ий (не переменных) должны совпадать на этой платформе, исходная прошивка CX75v25). Сразу обрадую, при ненахождении ф-ии в прошивке, её можно спокойно дописать и вставить патчем, если будет такая необходимость.
| Название функции или переменной | Адрес |
| Task control functions | |
| NU_Create_Task | 0xA020D6CC |
| NU_Delete_Task | 0xA020D7E8 |
| NU_Reset_Task | 0xA020D844 |
| NU_Terminate_Task | 0xA020D864 |
| NU_Resume_Task | 0xA020D92C |
| NU_Suspend_Task | 0xA020D974 |
| NU_Relinquish | 0xA020D9B0 |
| NU_Sleep | 0xA020D9D4 |
| NU_Change_Priority | 0xA0214068 |
| NU_Change_Preemption | 0xA0214080 |
| NU_Change_Time_Slice | 0xA021409C |
| NU_Check_Stack | 0xA021A3C4 |
| NU_Current_Task_Pointer | 0xA0213CE4 |
| NU_Established_Tasks | 0xA020DA94 |
| NU_Task_Information | 0xA020DD68 |
| NU_Task_Pointers | 0xA020DABC |
| Mailbox management functions | |
| NU_Create_Mailbox | 0xA020D2E4 |
| NU_Delete_Mailbox | 0xA020D310 |
| NU_Reset_Mailbox | 0xFFFFFFFF |
| NU_Send_To_Mailbox | 0xA020D330 |
| NU_Broadcast_To_Mailbox | 0xFFFFFFFF |
| NU_Receive_From_Mailbox | 0xA020D394 |
| NU_Established_Mailboxes | 0xFFFFFFFF |
| NU_Mailbox_Information | 0xFFFFFFFF |
| NU_Mailbox_Pointers | 0xFFFFFFFF |
| Queue management functions | |
| NU_Create_Queue | 0xA0215ECC |
| NU_Delete_Queue | 0xA0215F6C |
| NU_Reset_Queue | 0xFFFFFFFF |
| NU_Send_To_Front_Of_Queue | 0xFFFFFFFF |
| NU_Send_To_Queue | 0xA0215F8C |
| NU_Broadcast_To_Queue | 0xFFFFFFFF |
| NU_Receive_From_Queue | 0xA0216030 |
| NU_Established_Queues | 0xA02160E0 |
| NU_Queue_Information | 0xA0216164 |
| NU_Queue_Pointers | 0xA02160F4 |
| Pipe management functions | |
| NU_Create_Pipe | 0xFFFFFFFF |
| NU_Delete_Pipe | 0xFFFFFFFF |
| NU_Reset_Pipe | 0xFFFFFFFF |
| NU_Send_To_Front_Of_Pipe | 0xFFFFFFFF |
| NU_Send_To_Pipe | 0xFFFFFFFF |
| NU_Broadcast_To_Pipe | 0xFFFFFFFF |
| NU_Receive_From_Pipe | 0xFFFFFFFF |
| NU_Established_Pipes | 0xFFFFFFFF |
| NU_Pipe_Information | 0xFFFFFFFF |
| NU_Pipe_Pointers | 0xFFFFFFFF |
| Semaphore management functions | |
| NU_Create_Semaphore | 0xA02130C4 |
| NU_Delete_Semaphore | 0xA02130FC |
| NU_Reset_Semaphore | 0xFFFFFFFF |
| NU_Obtain_Semaphore | 0xA021311C |
| NU_Release_Semaphore | 0xA021316C |
| NU_Established_Semaphores | 0xFFFFFFFF |
| NU_Semaphore_Information | 0xFFFFFFFF |
| NU_Semaphore_Pointers | 0xFFFFFFFF |
| Event Group management functions | |
| NU_Create_Event_Group | 0xA0212704 |
| NU_Delete_Event_Group | 0xA0212720 |
| NU_Set_Events | 0xA0212740 |
| NU_Retrieve_Events | 0xA0212774 |
| NU_Established_Event_Groups | 0xFFFFFFFF |
| NU_Event_Group_Information | 0xFFFFFFFF |
| NU_Event_Group_Pointers | 0xFFFFFFFF |
| Signal processing functions | |
| NU_Control_Signals | 0xA02140B4 |
| NU_Receive_Signals | 0xA02140D4 |
| NU_Register_Signal_Handler | 0xA02140F4 |
| NU_Send_Signals | 0xA0214120 |
| Partition memory management functions | |
| NU_Create_Partition_Pool | 0xA020D3FC |
| NU_Delete_Partition_Pool | 0xA020D480 |
| NU_Allocate_Partition | 0xA020D4A0 |
| NU_Deallocate_Partition | 0xA020D504 |
| NU_Established_Partition_Pools | 0xA020D53C |
| NU_Partition_Pool_Information | 0xA020D5C0 |
| NU_Partition_Pool_Pointers | 0xA020D550 |
| Dynamic memory management functions | |
| NU_Create_Memory_Pool | 0xA020CFF0 |
| NU_Delete_Memory_Pool | 0xA020D080 |
| NU_Allocate_Memory | 0xA020D0A0 |
| NU_Deallocate_Memory | 0xA020D12C |
| NU_Established_Memory_Pools | 0xA020D164 |
| NU_Memory_Pool_Information | 0xA020D1E8 |
| NU_Memory_Pool_Pointers | 0xA020D178 |
| Interrupt management functions | |
| NU_Control_Interrupts | 0xA021A200 |
| NU_Local_Control_Interrupts | 0xA021A22C |
| NU_Restore_Interrupts | 0xA021A248 |
| NU_Setup_Vector | 0xFFFFFFFF |
| NU_Register_LISR | 0xA0213F74 |
| NU_Activate_HISR | 0xA020820C |
| NU_Create_HISR | 0xA020D778 |
| NU_Delete_HISR | 0xA020D824 |
| NU_Current_HISR_Pointer | 0xA0213D0C |
| NU_Established_HISRs | 0xA020DAA8 |
| NU_HISR_Information | 0xA020DC88 |
| NU_HISR_Pointers | 0xA020DB2C |
| NU_Protect | 0xA021A61C |
| NU_Unprotect | 0xA021A6A8 |
| Timer management functions | |
| NU_Create_Timer | 0xA020DDF4 |
| NU_Delete_Timer | 0xA020DE68 |
| NU_Reset_Timer | 0xA020DE88 |
| NU_Control_Timer | 0xA020DEEC |
| NU_Established_Timers | 0xA0214148 |
| NU_Timer_Information | 0xA02141CC |
| NU_Timer_Pointers | 0xA021415C |
| NU_Set_Clock | 0xA021AC2C |
| NU_Retrieve_Clock | 0xA021AC38 |
| Development support functions | |
| NU_Release_Information | 0xA02184E0 |
| NU_License_Information | 0xA0217B70 |
| NU_Disable_History_Saving | 0xFFFFFFFF |
| NU_Enable_History_Saving | 0xFFFFFFFF |
| NU_Make_History_Entry | 0xFFFFFFFF |
| NU_Retrieve_History_Entry | 0xFFFFFFFF |
| Input/Output Driver functions | |
| NU_Create_Driver | 0xFFFFFFFF |
| NU_Delete_Driver | 0xFFFFFFFF |
| NU_Request_Driver | 0xFFFFFFFF |
| NU_Resume_Driver | 0xFFFFFFFF |
| NU_Suspend_Driver | 0xFFFFFFFF |
| NU_Established_Drivers | 0xFFFFFFFF |
| NU_Driver_Pointers | 0xFFFFFFFF |
| Supervisor and User mode functions | |
| NU_IS_SUPERVISOR_MODE | 0xFFFFFFFF |
| NU_SUPERVISOR_MODE | 0xA021A0A8 |
| NU_USER_MODE | 0xA021A148 |
| NU_SUPERV_USER_VARIABLES | 0xA851B13C |
| Переменные | |
| INC_Initialize_State | 0xA877FB00 |
| ERD_Error_Code | 0xA877FAFC |
| HID_History_Enable | 0xA87A5A34 |
| HID_Write_Index | 0xA87A5A38 |
| HID_Read_Index | 0xA87A5A3C |
| HID_Entry_Count | 0xA87A5A40 |
| HID_History_Protect | 0xA87A5A44 |
| TCD_Created_Tasks_List | 0xA851ACE4 |
| TCD_Total_Tasks | 0xA851ACE8 |
| TCD_Priority_List | 0xA851ACEC |
| TCD_Priority_Groups | 0xA851B0EC |
| TCD_Sub_Priority_Groups | 0xA851B0F0 |
| TCD_Highest_Priority | 0xA851B110 |
| TCD_Execute_Task | 0xA851B114 |
| TCD_Execute_HISR | 0xA851B138 |
| TCD_Current_Thread | 0xA851B13C |
| TCD_Created_HISRs_List | 0xA851B118 |
| TCD_Total_HISRs | 0xA851B11C |
| TCD_Active_HISR_Heads | 0xA851B12C |
| TCD_Active_HISR_Tails | 0xA851B120 |
| TCD_Registered_LISRs | 0xA851B144 |
| TCD_LISR_Pointers | 0xA851B15C |
| TCD_Interrupt_Count | 0xA851B180 |
| TCD_Stack_Switched | 0xA851B184 |
| TCD_List_Protect | 0xA851B188 |
| TCD_System_Protect | 0xA851B190 |
| TCD_LISR_Protect | 0xA851B198 |
| TCD_HISR_Protect | 0xA851B1A0 |
| TCD_Interrupt_Level | 0xA851B1A8 |
| TCD_Lowest_Set_Bit | 0xA87E0CD0 |
| MBD_Created_Mailboxes_List | 0xA877FB04 |
| MBD_Total_Mailboxes | 0xA877FB08 |
| MBD_List_Protect | 0xA877FB0C |
| QUD_Created_Queues_List | 0xA879A7C4 |
| QUD_Total_Queues | 0xA879A7C8 |
| QUD_List_Protect | 0xA879A7CC |
| PID_Created_Pipes_List | 0xA87A5A5C |
| PID_Total_Pipes | 0xA87A5A60 |
| PID_List_Protect | 0xA87A5A64 |
| SMD_Created_Semaphores_List | 0xA879A7D4 |
| SMD_Total_Semaphores | 0xA879A7D8 |
| SMD_List_Protect | 0xA879A7DC |
| EVD_Created_Event_Groups_List | 0xA879A7B4 |
| EVD_Total_Event_Groups | 0xA879A7B8 |
| EVD_List_Protect | 0xA879A7BC |
| PMD_Created_Pools_List | 0xA85C0AE4 |
| PMD_Total_Pools | 0xA85C0AE8 |
| PMD_List_Protect | 0xA85C0AEC |
| DMD_Created_Pools_List | 0xA85C0AD4 |
| DMD_Total_Pools | 0xA85C0AD8 |
| DMD_List_Protect | 0xA85C0ADC |
| TMD_Created_Timers_List | 0xA85C0AF4 |
| TMD_Total_Timers | 0xA85C0AF8 |
| TMD_Active_Timers_List | 0xA85C0AFC |
| TMD_Active_List_Busy | 0xA85C0B00 |
| TMD_Created_List_Protect | 0xA85C0B04 |
| TMD_System_Clock | 0xA85C0B14 |
| TMD_Timer | 0xA85C0B20 |
| TMD_HISR | 0xA85C0B30 |
| TMD_HISR_Stack_Ptr | 0xA85C0B94 |
| TMD_HISR_Stack_Size | 0xA85C0B98 |
| TMD_HISR_Priority | 0xA85C0B9C |
| IOD_Created_Drivers_List | 0xA87A5A4C |
| IOD_Total_Drivers | 0xA87A5A50 |
| IOD_List_Protect | 0xA87A5A54 |
Предыдущая страница: Структура EEPROM
Следующая страница: GBS - Процессы
Источник страницы: 2014-06-25. Открыть в Wayback Machine · Редакция 2012-02-22