Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как перейти по ссылке на функцию в WinAVR?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Igor_U
У меня есть массив в которой находятся ссылки на функции.

void (*f[])(void)={func_1,func_2};

При вызове функции - (*f[1])() адрес берется из озу.

Как правильно вызвать функцию? pgm_read_word возвращает short. Как short преобразовать в ссылку на функцию?
prottoss
По идее строка f[1]() - есть вызов функции, зачем что то еще преобразовывать?
В ИАРЕ, например, работают вот такие конструкции:
Код
void f1(void)
{
}
void f2(void)
{
}

void f3(void)

{

}
__flash     void (*ff[])(void)={f1,f2};
__eeprom void (*ef[])(void)={f1,f2};
/*sram*/    void (*sf[])(void)={f1,f2};

void main(void)
{
   ff[0]();

   ef[1]();
   sf[2]();

...
}
vet
prottoss,
это же GCC, там у них всё непросто smile.gif

Igor_U
Код
void (*pf)();
short short_value;

...тут читаем адрес из FLASH в short_value...

pf = (void(*)())short_value;
(*pf)();


или же читаем напрямую в pf.
Igor_U
[quote name='prottoss' date='Jun 27 2006, 10:18' post='128391']
По идее строка f[1]() - есть вызов функции, зачем что то еще преобразовывать?
GCC не знает, что для доступа к разному типу памяти существуют разные команды (ldd, lpm). Поэтому для доступа к флеш используется макрос. Макрос возвращает unsigned short. Вопрос собственно в том, как тип unsigned short преобразовать в ссылочный тип на функцию.

[quote] (void(*)())[/quote]

ОК. Спасибо. С этими приоритетами и скобочками вечно путаюсь.
beer_warrior
Цитата
#define PGM_VOID_P const prog_void *
Used to declare a generic pointer to an object in program space

Код
PGM_VOID_P  handlers[] = {&func_1,&func_2};

if(handlers[1]) handlers[1]();
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.