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

 
 
> Массив указателей на функции расположеный во флеше, Можно ли это сделать и как ???
DeXteR
сообщение Jul 31 2006, 13:32
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Добрый день

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

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

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

Код
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 - Jul 31 2006, 13:34
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
DeXteR
сообщение Jul 31 2006, 14:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Ура

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

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

Убрал конст
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 1 2006, 07:53
Сообщение #3


Гуру
******

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



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


--------------------
Go to the top of the page
 
+Quote Post
DeXteR
сообщение Aug 1 2006, 08:36
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



Цитата(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 - хотелось бы поразглядовать для сравнения =)
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Aug 1 2006, 09:11
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



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


А вот где switch действительно поможет, так это при вызове функции по таблице из прерывания.Вариант со Swich не будет сохранять все рабочие регистры, а только нужные. Разумеется если эти функции #pragma inline = forced и оптимизация вкл.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 9 2006, 14:12
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(&-rey @ Aug 1 2006, 12:11) *
... Разумеется если эти функции #pragma inline = forced и оптимизация вкл.

И не вызывают никаких других (в том числе библиотечных) функций.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:37
Рейтинг@Mail.ru


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