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

 
 
> Помогите советом. I2C, Мож кто сталкивался.
SasaVitebsk
сообщение Jun 17 2007, 13:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



У меня есть в устр-ве шина I2C. На ней сидит мастер - atmega640(I2C софтовый) пару микрух памяти 24с512 и atmega48(I2C аппаратный слэйв). Всё это подпёрто резисторами 3.9кОм. Общая протяжённость шины составляет ~30см.

Изначально работал побайтно с 24с512 и блоком с mega48. Всё работало суперустойчиво. Сутками. Ни единого сбоя. С какого-то момента я попытался значительно повысить скорость на чтение (а заодно на запись) с 24с512. Для этого я ввёл буфер на 32 байта и начал писать/читать блоками по 32 байта. В принципе всё работает, но периодически возникают сбои. Я выяснил. Сбои возникают как при чтении, так и при записи. Их характер - случайный и хаотический. Создаётся ощущение, что сбои - результат помех. Увеличение задержек - не дало результата.

Может кто сталкивался с чем-нибудь подобным и может подсказать? Пока не знаю куда рыть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mrcashe
сообщение Jul 1 2007, 08:35
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 21-07-06
Из: Владивосток
Пользователь №: 18 987



Цитата
Подскажите спецы кто как работает в Си. Можно работать с массивами и указателями. Что эффективней?

Я стараюсь работать только с указателями. При программировании для МК это несколько экономит ресурсы. Допустим, есть некая структура:
Код
typedef struct { int id; void * p; } some_struct_t;


и есть некая константа, задающая размер буфера (читай: массива):
Код
enum { some_buffer_size = 20 };


Разместим сам буфер:
Код
some_struct_t some_buffer[some_buffer_size];


Теперь вариант перебора с применением индекса:
Код
int i;
for (i = 0; i < some_buffer_size; ++i) {
        printf("%i %p\n", some_buffer[i].id, some_buffer[i].p);
}


Перебор с применением указателя:
Код
some_struct_t * p;
for (p = some_buffer; p < some_buffer+some_buffer_size; ++p) {
        printf("%i %p\n", p->id, p->p);
}


Как видим, в первом случае индексирование выполняется дважды за цикл, т.е. всего 40 раз! А что есть индексирование? Это умножение(!) индекса на размер элемента массива и суммирование его с указателем на массив. Конечно, в случае массива символов размер элемента массива == 1, так что можно просто прибавлять индекс к адресу массива, но в случае массивов с размером элементов в 5 байт придётся именно умножать.
Во втором же случае размер элемента массива просто прибавляется к текущему значению указателя, что может быть на порядок (а то и 2 порядка) эффективнее.
С другой стороны, если не требуется итерация по всему буферу, а нужен именно произвольный доступ к элементу с определённым индексом, то можно с одинаковым успехом воспользоваться обоими методами, как и показал sensor_ua.

Цитата
Массив имеет длину и её можно узнать.

Это что-то новое. Размер массива в Си, вообще говоря, невозможно узнать динамически. Соответственно, код, сгенерированный компилятором, не имеет возможности детектировать выход за пределы массива. Если Вы имеете ввиду sizeof() , то он возвращает размер объекта в байтах, что обычно не то, что нужно в повседневной жизни. Более того, полагаться на этот оператор просто опасно. В различных компиляторах он может выдавать различные значения благодаря различному выравниванию элементов. Если массив размещается статически, то всегда заводите константу, содержащую его размер и пользуйтесь только ею для задания и определения размера массива. Если массив размещается динамически, то определите переменную (а ещё лучше - функцию) для определения его размера. Для изменения размера определите соотвествующую функцию.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 1 2007, 13:09
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(mrcashe @ Jul 1 2007, 11:35) *
В различных компиляторах он может выдавать различные значения благодаря различному выравниванию элементов. Если массив размещается статически, то всегда заводите константу, содержащую его размер и пользуйтесь только ею для задания и определения размера массива.


Как уже отметил sensor_ua, не надо заводить никаких констант.
Гораздо безопаснее применять макрос
#define COUNT( arr ) ( sizeof( arr ) / sizeof( (arr)[0] ) )


Цитата
Как видим, в первом случае индексирование выполняется дважды за цикл, т.е. всего 40 раз!

для процессоров таких как AVR, компилятор соптимизирует операции индексирования. (добавит неявный указатель на структуру)

Для процессоров с индексной адресацией, абсолютно не важно сколько раз происходит индексирование:

MOV eax, [ebx + esi * x + offset]
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 1 2007, 13:31
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(defunct @ Jul 1 2007, 16:09) *
Для процессоров с индексной адресацией, абсолютно не важно сколько раз происходит индексирование:
MOV eax, [ebx + esi * x + offset]

Справедливости ради smile.gif x может быть только степеню двойки sad.gif, ну и такты кушает такая адресация.
Ну а с оптимизацией, действительно дело обстоит в большинстве случаев действительно хорошо.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SasaVitebsk   Помогите советом. I2C   Jun 17 2007, 13:20
- - singlskv   Цитата(SasaVitebsk @ Jun 17 2007, 17:20) ...   Jun 17 2007, 13:37
- - zltigo   То:singlskv - насточтельная просьба избегать совер...   Jun 17 2007, 14:04
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 18:04) То:si...   Jun 17 2007, 14:18
|- - zltigo   Цитата(singlskv @ Jun 17 2007, 17:18) Ну ...   Jun 17 2007, 16:40
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 20:40) У LPC...   Jun 17 2007, 16:46
|- - zltigo   Цитата(singlskv @ Jun 17 2007, 19:46) Ну ...   Jun 17 2007, 17:00
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 21:00) Никак...   Jun 17 2007, 17:24
|- - zltigo   Цитата(singlskv @ Jun 17 2007, 20:24) но ...   Jun 17 2007, 18:13
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 22:13) Норма...   Jun 17 2007, 18:44
||- - zltigo   Цитата(singlskv @ Jun 17 2007, 21:44) ......   Jun 17 2007, 18:53
||- - singlskv   Цитата(zltigo @ Jun 17 2007, 22:53) А чег...   Jun 17 2007, 19:31
||- - zltigo   Цитата(singlskv @ Jun 17 2007, 22:24) ......   Jun 17 2007, 19:36
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 22:13) Норма...   Jun 17 2007, 18:58
|- - zltigo   Цитата(singlskv @ Jun 17 2007, 21:58) есл...   Jun 17 2007, 19:14
- - SasaVitebsk   Экспериментировал от 1МГц до 100кГц. На высоких ск...   Jun 17 2007, 16:15
|- - singlskv   Цитата(SasaVitebsk @ Jun 17 2007, 20:15) ...   Jun 17 2007, 16:33
- - bodja74   А софтовый I2C следит за SCL при растяжке ACK слей...   Jun 17 2007, 17:04
|- - SasaVitebsk   Цитата(bodja74 @ Jun 17 2007, 20:04) А со...   Jun 17 2007, 18:54
|- - Dog Pawlowa   Цитата(SasaVitebsk @ Jun 17 2007, 21:54) ...   Jun 17 2007, 20:38
- - SasaVitebsk   Я, к примеру, совершенно не удивился сообщению zlt...   Jun 17 2007, 20:23
|- - zltigo   Цитата(SasaVitebsk @ Jun 17 2007, 23:23) ...   Jun 17 2007, 20:38
|- - SasaVitebsk   Цитата(zltigo @ Jun 17 2007, 23:38) Увы, ...   Jun 17 2007, 20:46
|- - zltigo   Цитата(SasaVitebsk @ Jun 17 2007, 23:46) ...   Jun 17 2007, 21:19
|- - SasaVitebsk   Цитата(zltigo @ Jun 18 2007, 00:19) Можно...   Jun 17 2007, 21:55
|- - zltigo   Цитата(SasaVitebsk @ Jun 18 2007, 00:55) ...   Jun 17 2007, 22:21
|- - SasaVitebsk   Цитата(zltigo @ Jun 18 2007, 01:21) Да, п...   Jun 17 2007, 23:18
|- - defunct   Цитата(SasaVitebsk @ Jun 18 2007, 02:18) ...   Jun 17 2007, 23:51
|- - Dog Pawlowa   Цитата(SasaVitebsk @ Jun 18 2007, 02:18) ...   Jun 18 2007, 07:24
|- - zltigo   Цитата(SasaVitebsk @ Jun 18 2007, 02:18) ...   Jun 18 2007, 07:37
|- - SasaVitebsk   Цитата(zltigo @ Jun 18 2007, 10:37) Нет, ...   Jun 18 2007, 08:43
|- - defunct   Цитата(zltigo @ Jun 18 2007, 10:37) Какой...   Jun 18 2007, 11:04
|- - zltigo   Цитата(defunct @ Jun 18 2007, 14:04) в пр...   Jun 18 2007, 12:21
|- - defunct   Цитата(zltigo @ Jun 18 2007, 15:21) (а ме...   Jun 18 2007, 22:06
- - SasaVitebsk   Кое что прояснилось. Буду, конечно ещё дальше копа...   Jun 18 2007, 21:35
- - SasaVitebsk   Код //Инициализация порта TWI void TWI_Init(v...   Jun 18 2007, 22:42
|- - defunct   Цитата(SasaVitebsk @ Jun 19 2007, 01:42) ...   Jun 18 2007, 23:37
- - singlskv   1. нужно обязательно добавить обработку состояния ...   Jun 18 2007, 23:57
- - mrcashe   Кстати говоря, на такой шине при поллинге надо обя...   Jun 19 2007, 04:54
|- - SasaVitebsk   Цитата(mrcashe @ Jun 19 2007, 07:54) Кста...   Jun 19 2007, 08:19
|- - singlskv   Цитата(SasaVitebsk @ Jun 19 2007, 12:19) ...   Jun 19 2007, 08:41
- - SasaVitebsk   Всем спасибо за участие. В любом случае я узнал но...   Jun 30 2007, 00:37
|- - defunct   Цитата(SasaVitebsk @ Jun 30 2007, 03:37) ...   Jun 30 2007, 01:07
|- - Dog Pawlowa   Цитата(SasaVitebsk @ Jun 30 2007, 03:37) ...   Jun 30 2007, 04:15
- - sensor_ua   ЦитатаМожно работать с массивами и указателями. Чт...   Jul 1 2007, 06:26
- - sensor_ua   ЦитатаЭто что-то новое. Размер массива в Си, вообщ...   Jul 1 2007, 10:36
- - SasaVitebsk   Спасибо. Доступно, внятно и чётко. Короче похоже э...   Jul 1 2007, 15:47


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

 


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


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