|
Прошу совета по индексам массивов |
|
|
|
Nov 6 2006, 03:02
|
Местный
  
Группа: Свой
Сообщений: 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, начинается какая-то свистопляска, оно выводит содержимое буфера еще раз... Есть какие-нить идеи на эту тему?
|
|
|
|
|
 |
Ответов
|
Nov 13 2006, 15:38
|
Местный
  
Группа: Свой
Сообщений: 255
Регистрация: 17-08-06
Из: Москва
Пользователь №: 19 646

|
Цитата(aaarrr @ Nov 13 2006, 17:57)  Цитата(king2 @ Nov 13 2006, 17:26)  "ОНО" не должно выводить буфер еще раз, потому что вывод написан вот так... ...Даже если заполнять буфер просто инкрементом, то оно потихонечку досчитывает до 255, потом быстро выводит буфер еще раз (уже заполненный) и продолжает.
То есть выходит, что проблема имеет место при выводе данных, а не при вводе? Получается, что так. Фишка в том, что блоки и ввода и вывода одинаковые, индекс вывода "догоняет" индекс ввода, пока они не станут равны. И тот и другой только увеличивается, так что по идее, если индекс ввода поменялся 255->0, то и индекс вывода должен поменяться так же (и вывести байтик). А оно так не происходит, вместо этого оно каким-то образом проскакивает через проверку равенства индексов и выводит по-новой весь буфер..
|
|
|
|
|
Nov 13 2006, 16:01
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(king2 @ Nov 13 2006, 22:38)  А оно так не происходит, вместо этого оно каким-то образом проскакивает через проверку равенства индексов и выводит по-новой весь буфер..  Люди! так и не возьму в толк что ВАМ не понятного? ЕСЛИ и индекс обьявлен, как 8-разрядная переменная, то, естественно, какой бы ни был длины массив, хоть 160 гбайт,выше границы 256 элементов массива, ВЫ не выйдите ни когда) Компилятор будет тупо увеличивать разрядность индекса, дополнением его до нужной разрядности дополнением нулей ПРИ ВЫЧИСЛЕНИИ АБСОЛЮТНОГО АДРЕСА ЭЛЕМЕНТА МАССИВА, НО при выходе индекса (при его инкременте-декременте) за пределы объявленной разрядности, индекс будет урезан до той разрядности, которую ВЫ указали компилятору. В крайнем случае, если компилятор посчитает, что есть НЕОДНОЗНАЧНОСТЬ, он (компилятор) предупредит ВАС соответсвующим предупреждением. Ну.
--------------------
|
|
|
|
Сообщений в этой теме
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 А как при условии равенства индексов определить, с... Nov 13 2006, 16:04 king2 Посылательный код:
Код //! writes byte in FIFO... Nov 13 2006, 21:25 _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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|