Цитата(Сергей Борщ @ Mar 20 2010, 18:08)

А если весь фрейм не лезет, что будем делать?
Лично у меня в большинстве случаев буфера разумно-большие и отсутствие места для фрейма это аварийное состояние. Предпринимаются разборки, торможение уровней и встечной стороны... Если это просто отладочная печать захлебывается, то тем более, ждать нечего - как мы начали идти до жизни такой уже видно в начале буфера, остальное в мусорник.
Цитата
..чтобы избежать пауз в потоке?
Понятие фрейма само по себе не завязано на непрерывность потока. Иногда даже наоборот
Цитата
С чего бы это? В одном случае сравнисаются две переменные, во втором - их разность сравнивается с константой. Очевидно, что второй ввариант требует больше команд.
На ШЕСТЬ байт больше??? Кроме вышеуказанного сравнения остальные действия достаточно равнозначны, даже для AVR различие в 6 байт это проблемы компилятора

. Для ARM, полагаю, как минимум, что в лоб, что по лбу.
P.S.
Глянул для AVR IAR.
"Плохой" вариант с константой
Код
82 void send1( BYTE ch )
\ send1:
83 {
\ 00000000 .... LDI R30, LOW(TxTail)
\ 00000002 .... LDI R31, (TxTail) >> 8
\ 00000004 8121 LDD R18, Z+1
84 while( (BYTE)(TxHead - TxTail) >= UART_TX_BUFF_SIZE)
\ ??send1_0:
\ 00000006 8130 LD R19, Z
\ 00000008 2F12 MOV R17, R18
\ 0000000A 1B13 SUB R17, R19
\ 0000000C 3410 CPI R17, 64
\ 0000000E F7D8 BRCC ??send1_0
85; // Buffer full
86
87 TxBuffer[ TxTail++ & (UART_TX_BUFF_SIZE - 1) ] = ch;
\ 00000010 8120 LD R18, Z
\ 00000012 2F12 MOV R17, R18
\ 00000014 9513 INC R17
\ 00000016 8310 ST Z, R17
\ 00000018 E0F0 LDI R31, 0
\ 0000001A 732F ANDI R18, 0x3F
\ 0000001C 2FE2 MOV R30, R18
\ 0000001E .... SUBI R30, LOW((-(TxBuffer) & 0xFFFF))
\ 00000020 .... SBCI R31, (-(TxBuffer) & 0xFFFF) >> 8
\ 00000022 8300 ST Z, R16
88 }
\ 00000024 9508 RET
"Хороший" вариант:
Код
91 void send2( BYTE ch )
\ send2:
92 {
\ 00000000 2F3B MOV R19, R27
\ 00000002 2F4A MOV R20, R26
93 BYTE Tmp = ( TxTail + 1 )&(UART_TX_BUFF_SIZE - 1);
\ 00000004 .... LDI R30, LOW(TxTail)
\ 00000006 .... LDI R31, (TxTail) >> 8
\ 00000008 8110 LD R17, Z
\ 0000000A 9513 INC R17
\ 0000000C 731F ANDI R17, 0x3F
\ 0000000E 8121 LDD R18, Z+1
94
95 while( TxHead == Tmp )
\ ??send2_0:
\ 00000010 1721 CP R18, R17
\ 00000012 F3F1 BREQ ??send2_0
96; // Buffer full
97
98 TxBuffer[ TxTail ] = ch;
\ 00000014 81A0 LD R26, Z
\ 00000016 E0B0 LDI R27, 0
\ 00000018 .... SUBI R26, LOW((-(TxBuffer) & 0xFFFF))
\ 0000001A .... SBCI R27, (-(TxBuffer) & 0xFFFF) >> 8
\ 0000001C 930C ST X, R16
99 TxTail = Tmp;
\ 0000001E 8310 ST Z, R17
100 }
\ 00000020 2FA4 MOV R26, R20
\ 00000022 2FB3 MOV R27, R19
\ 00000024 9508 RET
Где 6 байт проигрыша?
P.P.S.
Это была оптимизация по скорости. При оптимизации по размеру "Плохой" выиграл два байта у "Хорошего"
Код
82 void send1( BYTE ch )
\ send1:
83 {
\ 00000000 .... LDI R30, LOW(TxTail)
\ 00000002 .... LDI R31, (TxTail) >> 8
84 while( (BYTE)(TxHead - TxTail) >= UART_TX_BUFF_SIZE)
\ ??send1_0:
\ 00000004 8111 LDD R17, Z+1
\ 00000006 8120 LD R18, Z
\ 00000008 1B12 SUB R17, R18
\ 0000000A 3410 CPI R17, 64
\ 0000000C F7D8 BRCC ??send1_0
85 ; // Buffer full
86
87 TxBuffer[ TxTail++ & (UART_TX_BUFF_SIZE - 1) ] = ch;
\ 0000000E 8120 LD R18, Z
\ 00000010 2F12 MOV R17, R18
\ 00000012 9513 INC R17
\ 00000014 8310 ST Z, R17
\ 00000016 E0F0 LDI R31, 0
\ 00000018 732F ANDI R18, 0x3F
\ 0000001A 2FE2 MOV R30, R18
\ 0000001C .... SUBI R30, LOW((-(TxBuffer) & 0xFFFF))
\ 0000001E .... SBCI R31, (-(TxBuffer) & 0xFFFF) >> 8
\ 00000020 8300 ST Z, R16
88 }
\ 00000022 9508 RET
Код
91 void send2( BYTE ch )
\ send2:
92 {
\ 00000000 2F3B MOV R19, R27
\ 00000002 2F4A MOV R20, R26
93 BYTE Tmp = ( TxTail + 1 )&(UART_TX_BUFF_SIZE - 1);
\ 00000004 .... LDI R30, LOW(TxTail)
\ 00000006 .... LDI R31, (TxTail) >> 8
\ 00000008 8110 LD R17, Z
\ 0000000A 9513 INC R17
\ 0000000C 731F ANDI R17, 0x3F
94
95 while( TxHead == Tmp )
\ ??send2_0:
\ 0000000E 8121 LDD R18, Z+1
\ 00000010 1721 CP R18, R17
\ 00000012 F3E9 BREQ ??send2_0
96 ; // Buffer full
97
98 TxBuffer[ TxTail ] = ch;
\ 00000014 81A0 LD R26, Z
\ 00000016 E0B0 LDI R27, 0
\ 00000018 .... SUBI R26, LOW((-(TxBuffer) & 0xFFFF))
\ 0000001A .... SBCI R27, (-(TxBuffer) & 0xFFFF) >> 8
\ 0000001C 930C ST X, R16
99 TxTail = Tmp;
\ 0000001E 8310 ST Z, R17
100 }
\ 00000020 2FA4 MOV R26, R20
\ 00000022 2FB3 MOV R27, R19
\ 00000024 9508 RET
В общем, как и ожидалось, веских причин генерировать сильно отличающийся по размеру код у компиляторов нет.