Архив SieDevelop · Оглавление и файлы · О восстановлении · Что не найдено

Ранняя редакция: текст отличается от последней сохранившейся страницы.

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 0xFFFFFFFF
NU_Receive_Signals 0xFFFFFFFF
NU_Register_Signal_Handler 0xFFFFFFFF
NU_Send_Signals 0xFFFFFFFF
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 0xA020DA30
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 - Процессы


Источник страницы: 2012-02-22. Открыть в Wayback Machine