Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача указателя на IO порт в функцию....
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
XsanyaX
Возможно ли как нибудь передать в функцию адрес порта? Насколько мне известно, 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
rezident
Извиняюсь, что не совсем по теме, но мне интересно, а каков смысл передачи в функцию указателя на порт, а не собственно самого значения для порта?
prottoss
Можно попробовать переводить порт в адрес памяти (или в указатель, если Вам так угодно). Фактически все порты распологаются в младших адресах памяти данных и номер порта (представленный его именем-макросом) соответсвует ячейке памяти SRAM с номером на 0х20 больше. Даже к регистрам r0-r31 можно обращаться как к ячейкам памяти с адреса 0х00 по 0х1F...
dxp
Цитата(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
XsanyaX
Спасибо dxp... воспользовался вашим примером - ВСЁ РАБОТАЕТ!!!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.