8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
прерывания конкретно от
; UART, чем запрещать вообще
все.
LDI XL,low(IN_buff) ; Берем адрес начала буффера
LDI XH,high(IN_buff)
LDS R16,IN_PTR_E ; Берем смещение точки записи
LDS R18,IN_PTR_S ; Берем смещение точки чтения
LDS R19,IN_FULL ; Берм флаг переполнения
CPI R19,1 ; Если буффер переполнен, то
BREQ NeedPop ; Равен указателю конца. Это
надо учесть.
CP R18,R16 ; Указатель чтения достиг
BRNE NeedPop ; Нет! Буффер не пуст.
Работаем дальше
LDI R19,1 ; Код ошибки - пустой буффер!
RJMP _TX_OUT ; Выходим
NeedPop: CLR R17 ; Получаем ноль
STS IN_FULL,R17 ; Сбрасываем флаг переполнения
ADD XL,R18 ; Сложением адреса со
смещением
ADC XH,R17 ; получаем адрес точки чтения
LD R17,X ; Берем байт из буффера
CLR R19 ; Сброс кода ошибки
INC R18 ; Увеличиваем смещение
CPI R18,MAXBUFF_OUT ; Достигли конца
кольца?
BRNE _TX_OUT ; Нет?
CLR R18 ; Да? Сбрасываем, переставляя
на 0
_TX_OUT: STS IN_PTR_S,R18 ; Сохраняем указатель
SEI ; Разрешаем прерывания
RET
Тут только один момент хитрый. Если у нас буфер переполнился, но не
перехлестнулся, то его начало и конец совпадают, что как бы сигнализирует
о том, что буфер пуст. Но на самом деле он полон непрочитанных данных и