|
Массив портов ввода PINx, вопрос к знатокам GCC |
|
|
|
Nov 27 2006, 21:57
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Контроллеры от ATmega8 до Atmega128, и т.д. Есть такой массив: Код BYTE PIN_[3]={ (BYTE)(&PINB), (BYTE)(&PINF), (BYTE)(&PING) }; Доступ к нему присходит вот так: Код PIN_tmp=_SFR_IO8(PIN_[0]-0x20); ...... PIN_tmp=_SFR_IO8(PIN_[2]-0x20); Все работает, более того мне даже нравится код который генерит при этом GCC, НО, осадок остается Собствено вопросы: 1. Есть ли в GCC другие варианты доступа к массиву PINx, без использования _SFR_IO8 ? 2. Насколько такой вариант портируем на более старые/новые реализации GCC AVR ? 3. 0x20 режет глаз, а что с этим делать ?
|
|
|
|
|
 |
Ответов
|
Nov 28 2006, 17:25
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aesok @ Nov 28 2006, 00:35)  Цитата(Lem @ Nov 28 2006, 01:06)  сделайте структуру Код typedef struct { unsigned char *pinr; ..... } PIN; НЕВЕРНО. pinr, port и ddr - ДОЛЖНЫ обязательно быть volatile!!! Цитата(aesok @ Nov 28 2006, 01:04)  Цитата(singlskv @ Nov 28 2006, 01:55)  Цитата(aesok @ Nov 28 2006, 00:35)  Он выкинит первую запись в порт. Оставит только вторую. Для обычных переменых это правильная оптимизация, но доступ к портам оптимизироваться не должен.
а должно ли PINx быть volatile ? ??? avr/port_def.h .... #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) #define _SFR_MEM8(mem_addr) _MMIO_BYTE(mem_addr) ..... Как видете все SFR обявлены как volatile. Обявлять структуру или массив в которых хранятся адреса портов volatile НЕТ никакой необходимости. И даже более того вредно. Нужно обявлять доступ к порту как volatile, то есть так как сделано в _SFR... (*(volatile uint8_t *)(mem_addr))
|
|
|
|
|
Nov 28 2006, 18:10
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(singlskv @ Nov 28 2006, 18:25)  Обявлять структуру или массив в которых хранятся адреса портов volatile НЕТ никакой необходимости. И даже более того вредно. В чем вред? Пример. ADD: Не правильно прочитал вашу фразу. Я не предлагал обьявлять структуру как volatile, а только те члены структуры в которых храняться ссылки на порты. Цитата Нужно обявлять доступ к порту как volatile, то есть так как сделано в _SFR... (*(volatile uint8_t *)(mem_addr)) Главное чтобы весь доступ к портам был помечен как 'volatile'. А как - это без разницы. Анатолий.
Сообщение отредактировал aesok - Nov 28 2006, 18:25
|
|
|
|
|
Nov 28 2006, 18:23
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(aesok @ Nov 28 2006, 18:10)  Цитата(singlskv @ Nov 28 2006, 18:25)  Обявлять структуру или массив в которых хранятся адреса портов volatile НЕТ никакой необходимости. И даже более того вредно.
В чем вред? Пример. Вам какой результат компиляции нравится больше ? Вот этот, с volatile при объявлении массива Код volatile BYTE PIN_[2]={ (BYTE)(&PINB), (BYTE)(&PIND) };
tmp1= *(volatile BYTE *)((WORD)PIN_[0]); tmp2= *(volatile BYTE *)((WORD)PIN_[0]); результат компиляции Код 160: tmp1= *(volatile BYTE *)((WORD)PIN_[0]); +0000020A: 91800100 LDS R24,0x0100 Load direct from data space +0000020C: 2FE8 MOV R30,R24 Copy register +0000020D: 27FF CLR R31 Clear Register +0000020E: 8180 LDD R24,Z+0 Load indirect with displacement 161: tmp2= *(volatile BYTE *)((WORD)PIN_[0]); +0000020F: 91800100 LDS R24,0x0100 Load direct from data space +00000211: 2FE8 MOV R30,R24 Copy register +00000212: 27FF CLR R31 Clear Register +00000213: 8180 LDD R24,Z+0 Load indirect with displacement или этот, без volatile ? Код BYTE PIN_[2]={ (BYTE)(&PINB), (BYTE)(&PIND) };
tmp1= *(volatile BYTE *)((WORD)PIN_[0]); tmp2= *(volatile BYTE *)((WORD)PIN_[0]); результат компиляции Код 160: tmp1= *(volatile BYTE *)((WORD)PIN_[0]); +0000020A: 91800100 LDS R24,0x0100 Load direct from data space +0000020C: 2FE8 MOV R30,R24 Copy register +0000020D: 27FF CLR R31 Clear Register +0000020E: 8180 LDD R24,Z+0 Load indirect with displacement 161: tmp2= *(volatile BYTE *)((WORD)PIN_[0]); +0000020F: 8180 LDD R24,Z+0 Load indirect with displacement
|
|
|
|
Сообщений в этой теме
singlskv Массив портов ввода PINx Nov 27 2006, 21:57 aesok Во первых посмотрите в avr-libc-user-manual: FAQ -... Nov 27 2006, 23:06 singlskv Цитата(aesok @ Nov 27 2006, 23:06) Во пер... Nov 27 2006, 23:45  aesok Я бы сделал чтото вроде этого:
1. Объявил структу... Nov 28 2006, 00:04   singlskv Цитата(aesok @ Nov 28 2006, 00:04) Я бы с... Nov 28 2006, 14:40    singlskv На первый вопрос отвечу сам себе
Цитата(singlskv ... Nov 28 2006, 16:56    IgorKossak Цитата(singlskv @ Nov 28 2006, 13:40) Цит... Nov 28 2006, 18:05 Lem сделайте структуру
Кодtypedef struct
{
unsigned... Nov 28 2006, 00:06 aesok Цитата(Lem @ Nov 28 2006, 01:06) сделайте... Nov 28 2006, 00:35  singlskv Цитата(aesok @ Nov 28 2006, 00:35) НЕВЕРН... Nov 28 2006, 00:55   aesok Цитата(singlskv @ Nov 28 2006, 01:55) Цит... Nov 28 2006, 01:04    singlskv чтение и запись(volatile переменных) - это две бол... Nov 28 2006, 01:12     aesok Цитата(singlskv @ Nov 28 2006, 02:12) чте... Nov 28 2006, 02:06      Lem Да нет, в процедуре доступа (обработки) обращения ... Nov 28 2006, 10:38       aesok Цитата(Lem @ Nov 28 2006, 11:38) Да нет, ... Nov 28 2006, 13:33       IgorKossak Цитата(Lem @ Nov 28 2006, 09:38) Да нет, ... Nov 28 2006, 13:52    singlskv Цитата(aesok @ Nov 28 2006, 18:49) Созрел... Nov 28 2006, 19:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|