2015-04-24 5 views
-2

Теперь я пытаюсь написать RTOS самостоятельно. У меня вопрос: в концепции RTOS у нас есть теория переключения контекста. Из того, что я знаю, контекстный переключатель предназначен для описания того, что когда какая-то задача выполняется, а другая задача имеет более высокий приоритет, запускается задача с более высоким приоритетом и текущая задача будет сохранена ее состояние и продолжит работу после завершения более высокой задачи , Чтобы сделать эту концепцию, я думаю, что задача с более высоким приоритетом будет выполняться в функциях прерывания, так как функции прерывания имеют более высокий приоритет, чем другие инструкции, верно? Если я прав, так что мне не нужно писать код, чтобы сохранить состояние текущей задачи, так как я знаю, что после прерывания программа вернется туда, где она прерывается. Если я ошибаюсь, как я могу сохранить состояние текущей задачи? Нужно ли писать код сборки для этого, так как я вижу, что галоген генерирует файл кода сборки, чтобы сделать это для FreeRTOS?построить операционную систему реального времени на микроконтроллере

+1

Существует множество операционных систем с открытым исходным кодом и многопроцессорной системой, в которых вы можете переключиться на задачу. –

ответ

0

Переключатель контекста не имеет ничего общего с приоритетом задачи. Это просто означает, что вы сэкономите все состояние процессора одной задачи и загрузите состояние другой задачи. Да, это будет записано в сборке, так как вам нужно сохранить регистры.

Если вы попытаетесь пойти своим текущим подходом, вы сразу же потерпите неудачу. Если в обработчике прерываний выполняется приоритетная задача Хью, как ваше ядро ​​будет обрабатывать следующее прерывание? Низкая задержка прерывания является ключом к успешной ОСРВ (или любой ОС).

0

RTOS, который заслуживает названия RTOS, должен иметь еще несколько функций, чем только упреждающее планирование. Другие проектные решения заключаются в том, следует ли использовать вложенные прерывания или нет, если он применяет схему обработки отложенных прерываний, если разрешена инверсия приоритета или как ее обрабатывать, если есть временное разбиение или выполнение до завершения (или оба) и многие другие аспекты ,

Ваш процессор имеет набор регистров, таких как аккумулятор и другие рабочие регистры процессора, указатель стека, возможно, регистры с плавающей запятой и, возможно, больше регистров.

Чтобы реализовать коммутатор контекста, вам необходимо определить набор состояний выполняемой задачи, которые необходимо сохранить, чтобы впоследствии продолжить.

Как правило, это сохранение государственной части выполняется на ассемблере или с использованием встроенных функций ассемблера из кода C.

Ни в коем случае задачи RTOS не выполняются в контексте прерывания.

Если вы реализуете обработчик прерываний, вы просто программу с обработчика прерываний и не RTOS;)

0

Пишем ОСРВ является непростой задачей взять на вашей собственной личности, и учитывая состояние ваших вопросов , Я бы порекомендовал вам сначала попробовать что-то более простое. Однако, если вы решите попробовать сделать свой собственный RTOS, вот некоторые указатели.

Часть RTOS - это возможность создавать систему для превентивного планирования (выполнять несколько задач и переключаться между ними на основе кодов, таких как время и приоритет). Hardcoding ваш код приложения с более высоким приоритетом в прерывание не делает этого. Скорее всего, вы должны иметь таймер-прерывание с постоянной скоростью. В прерывании вы должны сохранить текущий контекст, отслеживать свое системное время (сделать некоторые функции, чтобы установить/получить системное время в вашей ОС и обновить время для каждого прерывания), проверить, вызвал ли новый тик задержка другой задачи истекает и, если это так, переключается на контекст этой задачи.

Если вы сделаете все это, вы хотите иметь возможность отслеживать макет памяти для каждой задачи, так как вам нужно дать каждой задаче определенное количество стека. Вы хотите реализовать управление-структуру для отслеживания состояний всех ваших задач:

  • Сколько задач вы в настоящее время есть?
  • Что представляет собой каждый сегмент памяти задач?
  • Задача АКТИВНАЯ, ГОТОВА ИЛИ БЛОКИРОВАНА?
  • Если BLOCKRED, в какое время каждая задача должна быть ГОТОВА снова?

И вы наверняка не обойдетесь, используя хотя бы немного ассемблера для ваших контекстных переключателей.

Я могу порекомендовать вам взглянуть на FreeRTOS.org, так как они описывают все функции ядра FreeRTOS. Maby начинает смотреть на: http://www.freertos.org/implementation/a00014.html

0

Я думаю, что задача с более высоким приоритетом будет выполняться в функциях прерывания, поскольку функции прерывания имеют более высокий приоритет, чем другие инструкции, верно?

Нет, обработчики прерываний работают в своем собственном контексте. Переключение контекста и приоритет прерываний (обычно) обрабатываются аппаратным обеспечением процессора, в то время как потоки RTOS (опять же нормально) переключаются программными механизмами, включающими сохранение состояний регистров текущей задачи, восстановление состояний регистра новой задачи, восстановление последнего регистра являющийся программным счетчиком, так что выполнение продолжается из сохраненного местоположения новой задачи.

Невозможно выполнить контекстный переключатель полностью в высокоуровневом коде на языках, которые не поддерживают потоковую передачу по существу, поскольку набор регистров является специфичным для архитектуры, а языки уровня системы, такие как C, не являются специфичными для архитектуры, а не обеспечить доступ на уровне регистра.

Один из лучших ресурсов для детального изучения того, как RTOS работает внутри, - это Jean Labrosse's book MicroC/OS-II (теперь он свободно доступен в PDF от Micrium); начиная с главы 2, для обзора концепций RTOS, а в главе 3 описывается реализация ядра (переключение контекста в разделе 3.06) - вам нужно будет посмотреть различные доступные порты, чтобы увидеть точную реализацию OS_TASK_SW() для конкретных архитектур; в книге он представлен как псевдокод.

Несмотря на то, что коммерческая RTOS сама по себе (в значительной степени заменена MicroC/OS-III), MicroC-OS/II изначально была доступна только при покупке этой книги и предназначалась специально для обучения концепциям и реализации ОСРВ. С другой стороны, FreeRTOS (рекомендованный другими в качестве примера) имеет то преимущество, что является открытым исходным кодом, но не настолько хорошо документирован на уровне реализации и, возможно, является несколько нетрадиционной реализацией RTOS (хотя и не обязательно в контексте уровень переключения).

MicroC/OS-II, пожалуй, необычен тем, что не поддерживает задачи с равным приоритетом (все задачи должны иметь другой приоритет) и, следовательно, не поддерживает циклическое планирование; это чистый превентивный, основанный на приоритетах RT-планировщик - это позволяет очень быстро и быстро переключать время переключения контекста. MicroC/OS-III более условен в этом смысле, но за счет времени переключения контекста.

Смежные вопросы