Доброго времени суток!
Не так давно - убил три часа чтобы разобраться... да так и не нашел "прямого" решения. Может быть вы подскажете ?
Есть Codevidsion AVR 1.24.6
Есть некоторое количество глобальных функций типа:
void set_date(int param); void set_time(int param);
Есть структура, членом которой является указатель на функцию:
flash struct _ITEM{ flash char *name; void (*item_func)(int param); // вот этот указатель flash struct _LIST *enter; };
Далее идет массивчик из этих структур:
flash struct _ITEM setngs_items[]={ {"DATE",set_date,0}, {"TIME",set_time,0} };
И шо вы думаете ?
Компилится это без проблем. А вот при ассемблировании - "не могу найти функцию set_date".
Всю голову себе сломал. "Оказывается" этот #### Codevision так "оптимизирует". Пока он не увидит "реальное" использование функции в программе, ее код он не включит в итоговый asm-файл. В итоге - asm не может найти ссылку на идентификатор...
Решил я это тупо - завел переменную-указатель, которой явно присваиваю адреса используемых функций:
void (*func)(int); func = set_date; func = set_time;
Надеюсь, кому-то помог, а может быть и мне кто-то поможет - расскажет как сделать это более прямым способом.
|