Данная серия статей посвящена описанию работы RTOS– написанной на основе TNKernel. Исходники вы можете скачать по этой ссылке.
Если вы хотите написать свою RTOS или разобраться в TNKernel читайте так-же:
- Задачи
- Работа планировщика
- Последовательность действий при инициализации
- Assembler, переключение контекста
- Чередование задач при помощи отправки задачи в конец очереди для данного приоритета
- Отправление задачи в режим ожидания на определенное время
- Простой семафор
Последовательность действий при инициализации
Первым действием необходимо отключить все прерывания.
arm_disable_interrupts();
Настроить цикл переключения задач.
/* переключение контекста каждую миллисекунду*/
SysTick_Config(SystemCoreClock/1000);
Вызвать функцию включения RTOS.
start_myrtos();
В функции start_myrtos происходит сброс очереди планировщика.
// сброс очереди приоритетов
for(i = 0; i < NUM_PRIORITY; i++)
{
reset_queue_priority(i);
}
Сброс очереди планировщика — первый элемент связанного списка(очередь) указывает сам на себя, как следующий и предыдущий элемент.
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.