Я предполагаю, что вы работаете на голом металле без каких-либо требований к экономии заряда батареи. Я предполагаю, что теперь вы можете написать программу, загрузить ее на свое устройство и запустить. То, что я предлагаю вам сделать, это примерно так.
Эта программа должна иметь основной цикл, который в простейшем случае будет выглядеть так:
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 (нажатие кнопки, байт от последовательного порта и т. Д.). И т. Д. В верхней части этого добавления добавлена полноценная операционная система, но для простых вещей действительно достаточно того, что я написал выше.