Компоненты и технологии • №2 '2011 компоненты


Доступ к внешней периферии



Pdf көрінісі
бет76/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   72   73   74   75   76   77   78   79   ...   129
Kurniz

Доступ к внешней периферии
Рассмотрим сценарий, когда две задачи — задача А и задача Б — 
выводят информацию на ЖКИ-дисплей. Задача А ответственна 
за вывод значения каких-либо параметров на дисплей. Задача Б от-
вечает за вывод экстренных сообщений об авариях:
Выполняется задача А и начинает выводить очередной параметр 

на дисплей: «Температура = 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) Задача А загружает значение порта в регистр.


Достарыңызбен бөлісу:
1   ...   72   73   74   75   76   77   78   79   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет