Доступ к внешней периферии
Рассмотрим сценарий, когда две задачи — задача А и задача Б —
выводят информацию на ЖКИ-дисплей. Задача А ответственна
за вывод значения каких-либо параметров на дисплей. Задача Б от-
вечает за вывод экстренных сообщений об авариях:
Выполняется задача А и начинает выводить очередной параметр
•
на дисплей: «Температура = 25 °C».
Задача А вытесняется задачей Б в момент, когда на дисплей вы-
•
ведено лишь «Темпе».
Задача Б выводит на дисплей экстренное сообщение «Превышено
•
давление!!!», после чего переходит в блокированное состояние.
Задача А возобновляет свое выполнение и выводит оставшуюся
•
часть сообщения на дисплей: «ратура = 25 °C».
В итоге на дисплее появится иска женное сообщение:
«ТемпеПревышено давление!!! ратура = 25 °C».
Неатомарные операции чтение/модификация/запись
Пусть стоит задача установить (сбросить, инвертировать —
не имеет значения) один бит в регистре специальных функций, в дан-
ном случае — в регистре порта ввода/вывода микроконтроллера.
Рассмотрим пример кода на языке Си и полученную в результате
компиляции последовательность инструкций ассемблера.
Для микроконтроллеров AVR:
/* Код на Си */
PORTG ^= (1 << PG3);
/* Скомпилированный машинный код и инструкции ассемблера */
544: 80 91 65 00
lds
r24, 0x0065
; Загрузить PORTG в регистр общего назначения
548: 98 e0
ldi
r25, 0x08
; Бит PG3 — в другой регистр
54a: 89 27
eor
r24, r25
; Операция Исключающее ИЛИ
54c: 80 93 65 00
sts
0x0065, r24
; Результат — обратно в PORTG
Для микроконтроллеров ARM7:
/* Код на Си. */
PORTA |= 0x01;
/* Скомпилированный машинный код и инструкции ассемблера */
0x00000264 481C LDR R0,[PC,#0x0070]
; Получить адрес PORTA
0x00000266 6801 LDR R1,[R0,#0x00]
; Считать значение PORTA в R1
0x00000268 2201 MOV R2,#0x01
; Поместить 1 в R2
0x0000026A 4311 ORR R1,R
; Лог. И регистра R1 (PORTA) и R2 (константа 1)
0x0000026C 6001 STR R1,[R0,#0x00]
; Сохранить новое значение в PORTA
И в первом, и во втором случае последовательность действий сводится:
к копированию значения порта микроконтроллера в регистр обще-
•
го назначения,
к модификации регистра общего назначения,
•
к обратному копированию результата из регистра общего назна-
•
чения в порт.
Такую последовательность действий называют операцией чте-
ния/модификации/записи.
Теперь рассмотрим случай, когда сразу две задачи выполняют опе-
рацию чтения/модификации/записи одного и того же порта.
1) Задача А загружает значение порта в регистр.
Достарыңызбен бөлісу: |