:::: MENU ::::

Последовательность действий при инициализации RTOS

Данная серия статей посвящена описанию работы RTOS– написанной на основе TNKernel. Исходники вы можете скачать по этой ссылке.

Если вы хотите написать свою RTOS или разобраться в TNKernel читайте так-же:

Последовательность действий при инициализации

Первым действием необходимо отключить все прерывания.

arm_disable_interrupts();

Настроить цикл переключения задач.

/* переключение контекста каждую миллисекунду*/
SysTick_Config(SystemCoreClock/1000); 

Вызвать функцию включения RTOS.

start_myrtos();

В функции start_myrtos происходит сброс очереди планировщика.

// сброс очереди приоритетов
for(i = 0; i < NUM_PRIORITY; i++)
{
    reset_queue_priority(i);
}

ris2

Сброс очереди планировщика — первый элемент связанного списка(очередь) указывает сам на себя, как следующий и предыдущий элемент.

void reset_queue_priority(uint8_t priority)
{
    task_queue_priority[priority].next = &task_queue_priority[priority];
    task_queue_priority[priority].prev = &task_queue_priority[priority];
}

Создание задач ОС (это не задачи пользователя) timer_task и idle_task. idle_task — задача простоя, поэтому имеет самый низкий приоритет и выполняется только в том случае если все задачи уже выполнены. timer_task — основная задача планирования имеет самый высокий приоритет и вызывается каждый раз после других задача(более подробно см. в статье про работу планировщика).

task_create(&timer_task,
            timer_task_func,
            NULL,
            0,
            &timer_task_stack[0],
            128); 

task_create(&idle_task,
            idle_task_func,
            NULL,
            31,
            &idle_task_stack[0],
            128);

Создание задач пользователя при помощи вызова start_user_tasks (см. ст. Задачи).

start_user_tasks();

Установка текущей и следующей задачи (необходимо по алгоритму работы данной RTOS).

curr_run_task = &timer_task;
next_task_to_run = &idle_task;  

Непосредственный запуск RTOS.

start_exe();

Код start_exe написан на ассемблере и находится в myrtos_cortex_m3.s. Данная функция загружает контекст новых задач.

Note: Подробное описание данной функции смотрите в статье про ассемблерные функции данной RTOS.