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

 
 
> Прошу совета по индексам массивов
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
Ответов
rezident
сообщение Nov 6 2006, 10:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А тип самого буфера наверное unsigned int? А попробуйте-ка разбить код на две операции
Код
usb_buffer[usb_txtail]=0x05;
usb_txtail++;

и сообщите что получается.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 6 2006, 12:00
Сообщение #3


Гуру
******

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



Скомпилил вот такой код:
Код
UCHAR bfr[300];
UCHAR indx;

void main(void)
{
   indx = 0;
   for(UINT i = 0; i < 300; i++)
       bfr[indx++] = 5;
}
Так вот, после значения 255 переменная indx принимает значение НОЛЬ. Ищите косяки в программе. НИКОГДА, если переменная объявлена как CHAR, компилятор не переделает ее в INT, LONG, LONLONG или FLOAT, если вы прямо ему об этом не укажите...


--------------------
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 6 2006, 12:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(prottoss @ Nov 6 2006, 17:00) *
НИКОГДА, если переменная объявлена как CHAR, компилятор не переделает ее в INT, LONG, LONLONG или FLOAT, если вы прямо ему об этом не укажите...

"Никогда не говори ''никогда''" smile.gif А про приведение типов в языке СИ вы знаете? И что бывает в случае арифметических операций с числами разной разрядности, надеюсь тоже в курсе?
Цитата из K&R (переводная, из библиотеки Мошкова). Глава 1.6. Массивы
Цитата
По определению перед проведением арифметических опера-
ций, вовлекающих переменные типа CHAR и INT, все они преоб-
разуются к типу INT, TAK что в арифметических выражениях пе-
ременные типа CHAR по существу идентичны переменным типа
INT.

Еще раз предлагаю инкремент индекса вынести как отдельную операцию. У меня нет IAR for AVR, чтобы проверить получившийся результат на ассемблере.
Go to the top of the page
 
+Quote Post
sz36
сообщение Nov 9 2006, 23:58
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668



Цитата(rezident @ Nov 6 2006, 15:57) *
Цитата(prottoss @ Nov 6 2006, 17:00) *

НИКОГДА, если переменная объявлена как CHAR, компилятор не переделает ее в INT, LONG, LONLONG или FLOAT, если вы прямо ему об этом не укажите...

"Никогда не говори ''никогда''" smile.gif

Именно так.

Цитата(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;
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
|- - 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


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

 


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


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