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

 
 
 
Reply to this topicStart new topic
> Передача указателя на IO порт в функцию...., существует ли такая возможность...
XsanyaX
сообщение Nov 27 2006, 13:38
Сообщение #1


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

Группа: Свой
Сообщений: 75
Регистрация: 7-04-05
Из: Украина
Пользователь №: 3 948



Возможно ли как нибудь передать в функцию адрес порта? Насколько мне известно, IAR не поддерживает указатели в __io области и при компиляции такого кода:
Код
1   void  MyFunc( uchar in_pin, unsigned char volatile __io * in_port)
2   {
3       .....................
4    }

5   ............

6   int main()
7   {
     ............................

8   MyFunc(PB1,&PINB);
    
     .................................
9   }


компилятор ругается на строку 1:

Цитата
Error[Ta034]: __io pointer/reference is not allowed.

т.е. указатели на __io переменные не разрешенны

Есть ли механизмы обхода этого ограничения? (кроме макросов ..... ). Поделитесь опытом.... плизз.... help.gif help.gif help.gif

Сообщение отредактировал XsanyaX - Nov 27 2006, 13:43


--------------------
Метрология - наука о достаточной точности.
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 27 2006, 14:45
Сообщение #2


Гуру
******

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



Извиняюсь, что не совсем по теме, но мне интересно, а каков смысл передачи в функцию указателя на порт, а не собственно самого значения для порта?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 27 2006, 15:10
Сообщение #3


Гуру
******

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



Можно попробовать переводить порт в адрес памяти (или в указатель, если Вам так угодно). Фактически все порты распологаются в младших адресах памяти данных и номер порта (представленный его именем-макросом) соответсвует ячейке памяти SRAM с номером на 0х20 больше. Даже к регистрам r0-r31 можно обращаться как к ячейкам памяти с адреса 0х00 по 0х1F...


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 27 2006, 16:59
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(XsanyaX @ Nov 27 2006, 16:38) *
Возможно ли как нибудь передать в функцию адрес порта? Насколько мне известно, IAR не поддерживает указатели в __io области и при компиляции такого кода:
Error[Ta034]: __io pointer/reference is not allowed.

т.е. указатели на __io переменные не разрешенны

Есть ли механизмы обхода этого ограничения? (кроме макросов ..... ). Поделитесь опытом.... плизз.... help.gif help.gif help.gif

Вообще-то, все можно. Не знаю, про какой проц идет речь, для AVR еще с версий 2.2х можно было. Хоть указатели, хоть ссылки.

Код
#include <iom128.h>

typedef unsigned char byte;
typedef byte volatile __tiny IO_REG;

void f(IO_REG* r, byte mask)
{
    *r |= mask;
}

// --------------------------------------------------------------------------
void main(void)
{
    f(&PORTB, 0x55);
}
// --------------------------------------------------------------------------


Или со ссылками (только тут обязательно включить ++, т.к. в простом С ссылок никаких нет):

Код
#include <iom128.h>

typedef unsigned char byte;
typedef byte volatile __tiny IO_REG;

void f(IO_REG& r, byte mask)
{
    r |= mask;
}

// --------------------------------------------------------------------------
void main(void)
{
    f(PORTB, 0x55);
}
// --------------------------------------------------------------------------


Все работает.

Цитата(rezident @ Nov 27 2006, 17:45) *
Извиняюсь, что не совсем по теме, но мне интересно, а каков смысл передачи в функцию указателя на порт, а не собственно самого значения для порта?

Иногда это бывает полезным - например, если хочется сделать библиотеку, которая что-то делает с портом. При использовании указывается адрес порта и вуаля. Ну, и еще есть пара случаев. Почти всегда такие финты оказываются более оверхедными - на AVR есть спец. инструкции для доступа в IO область, а при косвенном обращении придется как в обычную память лезть, что несклько медленнее. Но если это некритично, то почему бы и нет.

Добавление. На более "прямой" и "правильной" архитектуре MSP430 никаких таких извратов не требуется. smile.gif Я когда с MSP430 начал работать, так просто отдыхал после финтов ушами типа вышеописанного или подобных, где завязки на __flash. biggrin.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
XsanyaX
сообщение Nov 27 2006, 18:29
Сообщение #5


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

Группа: Свой
Сообщений: 75
Регистрация: 7-04-05
Из: Украина
Пользователь №: 3 948



Спасибо dxp... воспользовался вашим примером - ВСЁ РАБОТАЕТ!!!!!


--------------------
Метрология - наука о достаточной точности.
Go to the top of the page
 
+Quote Post

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

 


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


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