Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: оптимизация Codevision ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
axis
Доброго времени суток!

Не так давно - убил три часа чтобы разобраться... да так и не нашел "прямого" решения. Может быть вы подскажете ?

Есть 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;

Надеюсь, кому-то помог, а может быть и мне кто-то поможет - расскажет как сделать это более прямым способом.
SlavaCh
Похоже кодевижн просто не понимает таких наворотов- я тоже долго мучался с аналогичной проблемой, но так и бросил. Не у кого спросить было. А сейсчас хочется сделать меню с такими структурами. Не подскажете поподробнее где надо явно присвоить имя функции чтоб такое прокатило? Можно кусок кода плиз?

PS - А еще заметил неприятную особенность кодевижна - он на неипс прерывания ставит RJMP 0 !!! То есть если случайно включить прерывание руками, не описав процедуру прерываания - программа просто будет сбрасыаться!! - Тоже целый день потратил на поиск глюка - плата сбрасывалась и все. А я думал что лезет помеха по питанию, все цепи перепаял возле сброса.
По идее надо везде ставить RETI, чтоб не было такого!
d__
Ужоснах! И не жалко вам своих молодых лет. Нет чтобы с какой симпатичной девченкой поиметь секс, так имеете секс с южно-карпатским ремесленным поделием... Бросайте пока не поздно, не покупайтесь на его визарда, никакой серьезной работы вы на нем не сделаете...
axis
[quote=SlavaCh,Aug 10 2005, 19:59]
Похоже кодевижн просто не понимает таких наворотов- я тоже долго мучался с аналогичной проблемой, но так и бросил. Не у кого спросить было. А сейсчас хочется сделать меню с такими структурами. Не подскажете поподробнее где надо явно присвоить имя функции чтоб такое прокатило? Можно кусок кода плиз?

Да тут даже примера кода не надо...
Надо просто тупо, в любой функции, которая вызывается явно (хоть в main)
взять и присвоить переменной-указателю на на функцию адрес "невидимой" функции.

У меня в проекте, действительно, есть система вложенных меню. При выборе конечных пунков которого, вызываются (неявно, через их адреса) обработчики. Так вот, чтобы Codevision "увидел" эти обработчики пришлось сделать такое тупое присваивание:

указатель на функцию = функция_1
указатель на функцию = функция_2
...
указатель на функцию = функция_N

С точки зрения банальной эрудиции эта террада никакого смысла не имеет ибо одной и тоже переменной последовательно присваивается некоторое количество значений... Однако помогает в борьбе с вышеназванным #### Codevision.
Вот так.
axis
Цитата(d__ @ Aug 10 2005, 20:27)
Ужоснах! И не жалко вам своих молодых лет. Нет чтобы с какой симпатичной девченкой поиметь секс, так имеете секс с южно-карпатским ремесленным поделием... Бросайте пока не поздно, не покупайтесь на его визарда, никакой серьезной работы вы на нем не сделаете...
*


Дорогой d__!

Видишь ли, в моем возрасте уже недостаточно просто секса с симпатичной девченкой smile.gif Это как раз на двадцатый смотреть "полицейскую академию" - все приколы уже в подсознании сидят...

И поэтому хочется разнообразия - секса с кем-нибудь другим. В данном случае, как ты правильно заметил, с "южно-карпатским ремесленным поделием".

И это было вступление. Теперь по существу:

Уважаемый d__!

Интуиция мне подсказывает, шо в интимных вопросах (внутреннее устройство) Codevision Вы являете экспертом.

И потому, очень прошу - расскажите нам, своим менее опытным коллегам, шоже там внутри происходит и почему вы не рекомендуете использовать этот красивый с виду инструмент в серьезных проектах.

Заранее благодарю за конструктив.
arttab
Эти грабли есть в любом компиляторе с оптимизацией. А не встречал кто документ про принципы оптимизации в разных прогах? По каким критериям он определяет что включатьв код, а что нет. Жить бы проще стало
d__
Уважаемые коллеги! Я извиняюсь за резкость выражений, но просто жаль вашего бесценного времени. Уже на протяжении 3-4х лет пытался внедрить его в повседневную практику для использования его в различных мелких поделках. Увы опыт печальный: как минимум два раза был вынужден переходить на другой компилятор прямо в середине проекта. Практика показывает: компилятор компилирует примерно 5-6 экранов исходника, после этого у него начинается судороги и конвульсии, выражающиеся в том, что он либо отказывается компилировать исходник, показывая ошибки, там где их нет, либо генерит нерабочий код. Особенно он вянет тогда, когда идет насыщенный операторами код(когда идут сложные вложенные и комплексные операторы). Хотя ИАРовский компилер тоже не подарок, но позволяет профессионально писать, используя особенности языка Ц по полной программе. Так что лучше разок помучиться и научиться работать на ИАРе, хотя там тоже есть пару глюков(они в основном торчат на уровне линкера) и спокойно работать постепенно оттачивая свои скиллы и создавая все более продвинутые продукты. И еще, с ИАРа вы без особенных проблем сможете перейти и на более продвинутые платформы (например на ARM), а с ЦВ вы никуда не перескочите...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.