Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Массив указателей на функции расположеный во флеше
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
DeXteR
Добрый день

Хочу расположить указатели на функции во флеш
в определенном порядке

И иметь доступ к ним как к массиву - по индексу

Пытаюсь написать вот такой кусочек кода

Код
static void F1(void)
{
NUM++;
NUM2--;
}

__flash const void(*Ps[4])(void) =
{
  F1,
  0,
  0,
  0
};


IAR ругает меня

Warning[Pe815]: type qualifier on return type is meaningless C:\MODBUS\IAR\main.c 21
Error[Pe144]: a value of type "void (*)()" cannot be used to initialize an entity of type "void const (*__flash)()" C:\MODBUS\IAR\main.c 23

Если __flash const убрать то все компилируется нормально

Что сдесь нетак ??

Помогите пожалуйста разобраться
DeXteR
Ура

Все заработало

__flash void(*Ps[4])(void) =
{
F1,
0,
0,
0
};

Убрал конст
prottoss
Цитата(DeXteR @ Jul 31 2006, 22:25) *
Ура
Это все, конечно, здорово. Но, если функций не так уж и много, то лучше сделать цикл switch...case. Вы ведь хотите добиться бОльшей скорости? Вы видели в ассемблере, КАК происходит прыжок по указателю на функцию?.. Кроме того, когда количество функций в цикле switch...case много (сколько не знаю), компилятор IAR сам формирует таблицу с адресами функций. Вот так то.
DeXteR
Цитата(prottoss @ Aug 1 2006, 11:53) *
Цитата(DeXteR @ Jul 31 2006, 22:25) *
Ура
Это все, конечно, здорово. Но, если функций не так уж и много, то лучше сделать цикл switch...case. Вы ведь хотите добиться бОльшей скорости? Вы видели в ассемблере, КАК происходит прыжок по указателю на функцию?.. Кроме того, когда количество функций в цикле switch...case много (сколько не знаю), компилятор IAR сам формирует таблицу с адресами функций. Вот так то.


Код
12:         Ps[0]();
+0000002E:   E5E4        LDI     R30,0x54         Load immediate
+0000002F:   E0F0        LDI     R31,0x00         Load immediate
@00000030: _..X_RSTACK_BASE
+00000030:   9105        LPM     R16,Z+           Load program memory and postincrement
+00000031:   9114        LPM     R17,Z            Load program memory
+00000032:   01F8        MOVW    R30,R16          Copy register pair
+00000033:   9509        ICALL                    Indirect call to (Z)


Вроде не так уж и медленно
На ассемблере быстрее небудет

case конечно быстрее работает но в этом месте программы особого быстродействия мне ненадо
Она достаточно редко вызывается (гдето раз в 0.1 с)

Зато запись удобней и приятней

Если несложно - приведите листинг case - хотелось бы поразглядовать для сравнения =)
andrvisht
Цитата(DeXteR @ Aug 1 2006, 11:36) *
Вроде не так уж и медленно
На ассемблере быстрее небудет
Зато запись удобней и приятней


А вот где switch действительно поможет, так это при вызове функции по таблице из прерывания.Вариант со Swich не будет сохранять все рабочие регистры, а только нужные. Разумеется если эти функции #pragma inline = forced и оптимизация вкл.
IgorKossak
Цитата(&-rey @ Aug 1 2006, 12:11) *
... Разумеется если эти функции #pragma inline = forced и оптимизация вкл.

И не вызывают никаких других (в том числе библиотечных) функций.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.