Посылательный код:
Код
//! writes byte in FIFO for current endpoint
#define Usb_write_byte(byte) (UEDATX = (U8)byte)
//! tests if endpoint write allowed
#define Is_usb_write_enabled() (UEINTX&(1<<RWAL))
412 while (Is_usb_write_enabled() && (usb_txhead != usb_txtail)) {
^
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
\ ??loop1:
\ 0000028E 910000E8 LDS R16, 232
\ 00000292 2F10 MOV R17, R16
\ 00000294 FF15 SBRS R17, 5
\ 00000296 C014 RJMP ??exit
\ 00000298 9100.... LDS R16, usb_txhead
\ 0000029C 9110.... LDS R17, usb_txtail
\ 000002A0 1701 CP R16, R17
\ 000002A2 F071 BREQ ??exit
413 Usb_write_byte(usb_buffer[usb_txhead++]);
\ 000002A4 9100.... LDS R16, usb_txhead
\ 000002A8 2F10 MOV R17, R16
\ 000002AA 9513 INC R17
\ 000002AC 9310.... STS usb_txhead, R17
\ 000002B0 E010 LDI R17, 0
\ 000002B2 01F8 MOVW R31:R30, R17:R16
\ 000002B4 .... SUBI R30, LOW((-(usb_buffer) & 0xFFFF))
\ 000002B6 .... SBCI R31, (-(usb_buffer) & 0xFFFF) >> 8
\ 000002B8 8100 LD R16, Z
\ 000002BA 930000F1 STS 241, R16
\ 000002BE CFE7 RJMP ??loop1
415 }
Вопрос нифига не в том, почему индекс становится 16-битным - тут-то понятно почему, потому что он становится индексом не массива, а памяти, а это как раз unsigned int

Вопрос в том, почему при переходе через 0 оно посылает еще один раз весь буфер.
Отличать 0 от 256 символов в буфере не надо, предполагается, что такой ситуации не возникает, а если возникает, то и фиг с ней. В данном примере ее реально не возникает, всегда реальных данных меньше чем 64 байт.