одновременные задачи с 8051 - PullRequest
       66

одновременные задачи с 8051

0 голосов
/ 12 октября 2019

Есть ли способ запустить две задачи с 8051 мкК одновременно? Например,

Задача первая

Delay 1 sec
P2.B2 = 1
Delay 1 sec
P2.B2 = 0

Задача 2

If P1.B0 = 1
P2.B3=1

Так что в любой момент нажмите на переключатель, подключенный к P2.0, значение 1, светодиод на P2.3 = ВКЛ, и P2.2 продолжает мигать светодиодом на P2.2.

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Я предполагаю, что вы работаете на голом металле без каких-либо требований к экономии заряда батареи. Я предполагаю, что теперь вы можете написать программу, загрузить ее на свое устройство и запустить. То, что я предлагаю вам сделать, это примерно так.

Эта программа должна иметь основной цикл, который в простейшем случае будет выглядеть так:

MAX_TIME is the largest possible value of system clock, should never be reached

task_table is table with 
    next execution time as system clock time (MAX_TIME means disabled)
    function pointer

initialize task-table with the three tasks below

forever
  for each task with time 0
    set task time MAX_TIME (disable)
    call task function (task probably enables itself or other task)

  find a task with lowest non-zero time in task_queue 
  if task time is in past or now
    set task time MAX_TIME (disable)
    call task function (task probably enables itself or other task)

Задачи со временем 0 проверяются отдельно, а затем задачи со временем, так что время0 задач не блокируют друг друга или задачи со временем от того, что они были вызваны. То же самое может быть достигнуто различными способами, это всего лишь пример.

Тогда ваши требования действительно требуют 3 «задач»:

task_p2_b2_0:
  P2.B2 = 0
  enable task task_p2_b2_1 at current_time + 1 second


task_p2_b2_1:
  P2.B2 = 1
  enable task task_p2_b2_0 at current_time + 1 second


task_p1_b0_poll:
  If P1.B0 = 1
    P2.B3=1
  enable task task_p1_b0_poll at time 0 (or current time + 10 ms or whatever)

Будущее развитие: выше длянебольшое количество статических задач. Итерация до ... 5-10 элементов таблицы настолько быстра, что нет смысла ее оптимизировать. Если у вас есть больше задач, чем это, вы должны рассмотреть возможность использования кучи приоритетов для хранения задач. Тогда вы можете также рассмотреть возможность отключения основного цикла, когда он не имеет ничего общего, и использовать прерывание для его активации (прерывание по таймеру, прерывание последовательного порта, прерывание активации контакта и т. Д.). Кроме того, у вас могут быть разные типы задач, например, задачи, которые активируются при некотором IO (нажатие кнопки, байт от последовательного порта и т. Д.). И т. Д. В верхней части этого добавления добавлена ​​полноценная операционная система, но для простых вещей действительно достаточно того, что я написал выше.

0 голосов
/ 12 октября 2019

A task - это то, что обычно предоставляется базовой ОС. Если вы работаете в «голой железной» системе без какой-либо ОС, у вас нет задач на первом этапе.

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

Это именно то, что может сделать для вас библиотека типа FreeRTos. Насколько я знаю, есть порт для 8051. Поиск в Интернете возвращает множество ссылок на 8051 FreeRtos. Может быть, есть еще несколько библиотек, которые предлагают задачи для вас.

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

...