реклама на сайте
подробности

 
 
> Прошу совета по индексам массивов
king2
сообщение Nov 6 2006, 03:02
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 255
Регистрация: 17-08-06
Из: Москва
Пользователь №: 19 646



Есть такой вот код:

Код
    171                usb_buffer[usb_txtail++]=0x05;
   \   00000094   9160....           LDS     R22, usb_txtail
   \   00000098   2F56               MOV     R21, R22
   \   0000009A   9553               INC     R21
   \   0000009C   9350....           STS     usb_txtail, R21
   \   000000A0   E055               LDI     R21, 5
   \   000000A2   E070               LDI     R23, 0
   \   000000A4   01FB               MOVW    R31:R30, R23:R22
   \   000000A6   ....               SUBI    R30, LOW((-(usb_buffer) & 0xFFFF))
   \   000000A8   ....               SBCI    R31, (-(usb_buffer) & 0xFFFF) >> 8
   \   000000AA   8350               ST      Z, R21


Изначально предполагалось, что так как usb_txtail unsigned char, то оно досчитает до 255 и начнет снова с нуля без всяких танцев с бубнами. А фиг...

Если после этого вставить строчку:
Код
if (usb_txtail == 255) usb_txtail = 0;

то все работает на ура. Если этой строчки нет - досчитав до 255, начинается какая-то свистопляска, оно выводит содержимое буфера еще раз...

Есть какие-нить идеи на эту тему? smile.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
king2
сообщение Nov 13 2006, 21:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 255
Регистрация: 17-08-06
Из: Москва
Пользователь №: 19 646



Посылательный код:
Код
    //! 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 smile.gif

Вопрос в том, почему при переходе через 0 оно посылает еще один раз весь буфер.

Отличать 0 от 256 символов в буфере не надо, предполагается, что такой ситуации не возникает, а если возникает, то и фиг с ней. В данном примере ее реально не возникает, всегда реальных данных меньше чем 64 байт.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- king2   Прошу совета по индексам массивов   Nov 6 2006, 03:02
- - aaarrr   Цитата(king2 @ Nov 6 2006, 06:02) Если по...   Nov 6 2006, 08:57
- - _Bill   Цитата(king2 @ Nov 6 2006, 06:02) Есть та...   Nov 6 2006, 09:38
- - aaarrr   ЦитатаЕсть два варианта: А Вас не смущает то, что ...   Nov 6 2006, 10:18
- - rezident   А тип самого буфера наверное unsigned int? А попро...   Nov 6 2006, 10:37
|- - prottoss   Скомпилил вот такой код: КодUCHAR bfr[300...   Nov 6 2006, 12:00
|- - rezident   Цитата(prottoss @ Nov 6 2006, 17:00) НИКО...   Nov 6 2006, 12:57
|- - prottoss   Цитата(rezident @ Nov 6 2006, 19:57) Цита...   Nov 6 2006, 16:27
|- - sz36   Цитата(rezident @ Nov 6 2006, 15:57) Цита...   Nov 9 2006, 23:58
|- - prottoss   Цитата(sz36 @ Nov 10 2006, 06:58) Цитата(...   Nov 10 2006, 12:19
- - aaarrr   Цитата(rezident @ Nov 6 2006, 15:57) Еще ...   Nov 6 2006, 13:11
- - rezident   Вот еще в Википедии отыскал существенное (по-моему...   Nov 6 2006, 13:51
- - IgorKossak   Цитата(king2 @ Nov 6 2006, 05:02) А фиг.....   Nov 6 2006, 14:50
- - aaarrr   Цитата(rezident @ Nov 6 2006, 16:51) Вот ...   Nov 6 2006, 14:56
|- - rezident   Цитата(aaarrr @ Nov 6 2006, 19:56) Цитата...   Nov 6 2006, 15:02
- - aaarrr   Цитата(rezident @ Nov 6 2006, 18:02) ОК ...   Nov 6 2006, 15:20
- - _Sam_   Я вообще не понял в чём проблема! Цитатаесли ...   Nov 8 2006, 08:06
|- - prottoss   Цитата(_Sam_ @ Nov 8 2006, 15:06) Цитатан...   Nov 8 2006, 08:30
- - ARIM   Цитата(king2 @ Nov 6 2006, 06:02) начинае...   Nov 8 2006, 12:01
- - king2   Отвечаю сразу всем. Если вынести инкремент в отдел...   Nov 13 2006, 14:26
- - aaarrr   Цитата(king2 @ Nov 13 2006, 17:26) ...   Nov 13 2006, 14:57
|- - king2   Цитата(aaarrr @ Nov 13 2006, 17:57) Цитат...   Nov 13 2006, 15:38
|- - prottoss   Цитата(king2 @ Nov 13 2006, 22:38) А оно ...   Nov 13 2006, 16:01
- - aaarrr   А как при условии равенства индексов определить, с...   Nov 13 2006, 16:04
- - _Sam_   ЦитатаВопрос в том, почему при переходе через 0 он...   Nov 14 2006, 06:48
|- - king2   Цитата(_Sam_ @ Nov 14 2006, 09:48) Цитата...   Nov 14 2006, 13:45
- - _Sam_   Могли бы и целиком код привести. И указать в этом ...   Nov 15 2006, 06:43
- - king2   Итак, проблема найдена, вопрос закрыт. Дело было ...   Nov 22 2006, 00:56


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 12:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016