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

 
 
> Массив портов ввода PINx, вопрос к знатокам GCC
singlskv
сообщение Nov 27 2006, 21:57
Сообщение #1


дятел
*****

Группа: Свой
Сообщений: 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,
НО, осадок остается sad.gif smile.gif

Собствено вопросы:

1. Есть ли в GCC другие варианты доступа к массиву PINx, без использования _SFR_IO8 ?

2. Насколько такой вариант портируем на более старые/новые реализации GCC AVR ?

3. 0x20 режет глаз, а что с этим делать ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
singlskv
сообщение Nov 28 2006, 17:25
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 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))
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 28 2006, 18:10
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 28 2006, 18:23
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 28 2006, 18:49
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Созрело 2 решения:

1. Ваше.
BYTE PIN_[2]={
(BYTE)(&PINB),
(BYTE)(&PIND)
};

tmp1= *(volatile BYTE *)((WORD)PIN_[0]);
tmp2= *(volatile BYTE *)((WORD)PIN_[0]);

Минусы: Не забывать писать "*(volatile..." при каждом обращении к порту!!!
Плюсы: Экономия 1 байта RAM на каждий порт.

2. Моё.

struct __port {
volatile uint8_t *port;
unsigned char pin;
};


struct __port ports[3] = {
{&PINB, 1<<PINB5},
{&PINF, 1<<PINF2},
{&PING, 1<<PING1}
};


PIN_tmp=*(ports[0].port);
tmp=PIN_tmp & ports[0].pin;

Минусы: Потеря 1 байта RAM на каждий порт.
Плюсы: Более понятная и постая запись. (моё личное мнение)



Анатолий.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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