|
Прошу совета по индексам массивов |
|
|
|
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 6 2006, 12:57
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(prottoss @ Nov 6 2006, 17:00)  НИКОГДА, если переменная объявлена как CHAR, компилятор не переделает ее в INT, LONG, LONLONG или FLOAT, если вы прямо ему об этом не укажите... "Никогда не говори ''никогда''"  А про приведение типов в языке СИ вы знаете? И что бывает в случае арифметических операций с числами разной разрядности, надеюсь тоже в курсе? Цитата из K&R (переводная, из библиотеки Мошкова). Глава 1.6. МассивыЦитата По определению перед проведением арифметических опера- ций, вовлекающих переменные типа CHAR и INT, все они преоб- разуются к типу INT, TAK что в арифметических выражениях пе- ременные типа CHAR по существу идентичны переменным типа INT. Еще раз предлагаю инкремент индекса вынести как отдельную операцию. У меня нет IAR for AVR, чтобы проверить получившийся результат на ассемблере.
|
|
|
|
|
Nov 9 2006, 23:58
|
Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668

|
Цитата(rezident @ Nov 6 2006, 15:57)  Цитата(prottoss @ Nov 6 2006, 17:00)  НИКОГДА, если переменная объявлена как CHAR, компилятор не переделает ее в INT, LONG, LONLONG или FLOAT, если вы прямо ему об этом не укажите...
"Никогда не говори ''никогда''"  Именно так. Цитата(rezident @ Nov 6 2006, 15:57)  Еще раз предлагаю инкремент индекса вынести как отдельную операцию. У меня нет IAR for AVR, чтобы проверить получившийся результат на ассемблере. У меня IAR есть, и по эти граблям я уже ходил в точно такой же ситуации - записи в кольцевой буфер. Индекс массива у IAR - int, даже если он объявлен как char[256]. В данном случае нужно писать так (если usb_txtail объявлен как char): usb_txtail++; usb_buffer[usb_txtail]=0x05; или так: usb_buffer[(usb_txtail++) & 0xff]=0x05;
|
|
|
|
Сообщений в этой теме
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   prottoss Цитата(rezident @ Nov 6 2006, 19:57) Цита... Nov 6 2006, 16:27    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 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|