Доброго времени суток!
Не так давно - убил три часа чтобы разобраться... да так и не нашел "прямого" решения. Может быть вы подскажете ?
Есть 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;
Надеюсь, кому-то помог, а может быть и мне кто-то поможет - расскажет как сделать это более прямым способом.