|
Помогите советом. I2C, Мож кто сталкивался. |
|
|
|
 |
Ответов
|
Jul 1 2007, 08:35
|
Участник

Группа: Участник
Сообщений: 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() , то он возвращает размер объекта в байтах, что обычно не то, что нужно в повседневной жизни. Более того, полагаться на этот оператор просто опасно. В различных компиляторах он может выдавать различные значения благодаря различному выравниванию элементов. Если массив размещается статически, то всегда заводите константу, содержащую его размер и пользуйтесь только ею для задания и определения размера массива. Если массив размещается динамически, то определите переменную (а ещё лучше - функцию) для определения его размера. Для изменения размера определите соотвествующую функцию.
|
|
|
|
|
Jul 1 2007, 13:09
|

кекс
     
Группа: Свой
Сообщений: 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]
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|