roboforum.ru

Технический форум по робототехнике.

"Слабое" объявление функций в AVRGCC

"Слабое" объявление функций в AVRGCC

Michael_K » 08 янв 2011, 23:34

Есть ли оно?

Добавлено спустя 3 часа 59 минут 36 секунд:
В общем, оказалось, что есть, только какое-то ущербное.
Баг признан.
http://www.nongnu.org/avr-libc/bugs.html
http://sourceware.org/bugzilla/show_bug.cgi?id=1038

Re: "Слабое" объявление функций в AVRGCC

blindman » 09 янв 2011, 06:22

Как я понял, баг этот касается лишь объявления вершины стэка, с собственно слабыми символами он общего не имеет

Re: "Слабое" объявление функций в AVRGCC

Michael_K » 09 янв 2011, 06:52

Ну, значит я что-то делаю не так...

Не могу переопределить существующую слабую функцию новой.
Вот объявленную (но неопределенную) переопределить могу, и посмотреть в программе, определена ли она - могу. А если она уже определена, то никак - либо компилятор ругается (причем иногда непонятные ошибки выдает), либо не работает...

Примера нигде не нашел.
Пробовал аттрибуты weak и alias, и вместе, и по отдельности и т.п.

Re: "Слабое" объявление функций в AVRGCC

blindman » 09 янв 2011, 08:42

Show me the code :)

Re: "Слабое" объявление функций в AVRGCC

Romikgy » 09 янв 2011, 14:35

как отстал я от новшеств((( а что есть слабая функция?

Re: "Слабое" объявление функций в AVRGCC

Michael_K » 09 янв 2011, 16:00

blindman писал(а):Show me the code :)

Хорошая шутка - там кода-то две с половиной строчки.

В общем заработало вот в таком варианте:

Код: Выделить всёРазвернуть
weak.c
==============================================
#include <avr/io.h>
void __attribute__((weak)) f(unsigned char c)
{
   PORTB = c;
}

strong.c
==============================================
#include <avr/io.h>
void f(unsigned char c)
{
   PORTС = c;
}

main.c
==============================================
extern void f(unsigned char c);
void main(void)
{
   f(10);
}


в варианте из даташита:
Код: Выделить всёРазвернуть
void f (unsigned char c) __attribute__ ((weak, alias ("__f")))

ругается на синтаксис.

Romikgy писал(а): а что есть слабая функция?

Слабое определение - это когда ты определяешь функцию (или переменную) "слабо" - например в библиотеке. А другой программист может прицепить эту твою библиотеку, но определить свою функцию с тем же именем, и линкер не будет ругаться, а будет использовать новую функцию...

Ну, как-то так :)
(Я не программист, если что - в точных терминах могу путаться.)

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

Re: "Слабое" объявление функций в AVRGCC

Duhas » 09 янв 2011, 16:14

жосский офф, но таки:

я вот балдею с сей и прочего.. напридумывали столько, что изучать будешь всю жизнь.. не знаю прав я или нет.. но мне такой путь усложнения языка кажется мертвым...

Re: "Слабое" объявление функций в AVRGCC

Michael_K » 09 янв 2011, 16:44

А мне кажется мертворожденными современные дергания.
Вот пока эд будет под "android 2.1" что-то ковырять, у всех уже будет "humanoid 3.5" :)
А время жизни проекта в непотребительских областях (вояки, пром, СХ) - хоть и сокращается, но все равно это десятки лет.

Считаю, что нужно качественно научиться хотя бы чему-то одному, а не бросаться на каждую блестящую рекламку. Помните, как все рекламировали Джаву для интернет-приложений? и где она теперь? Флэш ее вытеснил. А до этого, если помните, был макромедиа шоквейв... и где теперь тот шоквейв. Сейчас майкрософт двигает Сильверлайт, но где он будет, когда прийдет HTML5?

Точно так же перспективы андроида, например, по-моему крайне туманны.

Добавлено спустя 4 минуты 9 секунд:
Duhas писал(а):но мне такой путь усложнения языка кажется мертвым...

А какой путь усложнения языка вам кажется живым? :wink: :D

Re: "Слабое" объявление функций в AVRGCC

Grem » 09 янв 2011, 17:17

Помните, как все рекламировали Джаву для интернет-приложений? и где она теперь?

Бугагашеньки, у меня аж слезы от смеха потекли, а от сравнерия JEE и флеша - ресницы поседели. Где она? Вы серьезно? Она натянула все другие _недоязыки_ в этой области.
И да, хтмл5 уже несколько лет есть, вот что вы под этими буквами подразумеваеие - другое дело.
На мое сообщение отвечать не надо - отвечать не стану. Просто очень забавно вы сравнили тостер с мазератти, а потом с оставшимся хламом в гараже.

Re: "Слабое" объявление функций в AVRGCC

Виталий » 09 янв 2011, 18:28

Считаю, что нужно качественно научиться хотя бы чему-то одному, а не бросаться на каждую блестящую рекламку.

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

но мне такой путь усложнения языка кажется мертвым...

Я считаю, что для встраиваемых систем уже пришло время более современных языков нежели чем Си.
Одним из самых удачных языков для реализации на микроконтроллере я считаю Оберон. Он очень компактен, позволяет использовать несколько парадигм программирования, имеет жесткую типизацию и автоматическую сборку мусора.

Хотя у меня есть некоторые соображения как модифицировать Оберон так, чтобы он был пригоден для реализации супер-надежных систем.

Добавлено спустя 1 минуту 17 секунд:
Она натянула все другие _недоязыки_ в этой области.

Видимо имелось ввиду технология JavaApplet.

Re: "Слабое" объявление функций в AVRGCC

Michael_K » 09 янв 2011, 19:42

Виталий писал(а):Но и все же появляются новые и интересные технологии, которые стоит брать на вооружение.

Конечно, просто они часто сырые или непродуманные, в результате запуск этих технологий получается "кривым", растянутым, невнятным. Часто ценные фишечки, находки, идеи просто гибнут под горой неудобств, багов, несовместимости и т.п.
Производители ставят цель быстро выйти на рынок - на полноценное тестирование уже просто откровенно забивают, ("кагбе" думая, что пользователи за них оттестируют и пришлют им репорты или багфиксы)... Но пользователь не торопится обкатывать, а тем более полноценно тестировать чужое г... у него есть выбор и ему тоже надо свой продукт на рынок выплюнуть - вот он и "голосует ногами"...

Одним из самых удачных языков для реализации на микроконтроллере я считаю Оберон.

Может быть. Тут нужно понимать, что микроконтреллеры - эта такое разношерстное понятие. И часто в одном и том же проекте приходится программировать на НУ ОЧЕНЬ разных уровнях. Где-то спускаться до ассемблера, переписывания стартап-кодов, низкоуровневых обработчиков и т.п. А где-то наоборот сильно абстрагироваться (например в пользовательском интерфейсе или сетевых протоколах).
Я не думаю, что можно предложить какое-то единое средство, си пока достаточно удачно спозиционировался для мелких применений с углублением к железу. Для более высокого уровня его, конечно, маловато (примочки, конечно, появляются, но, имхо, выглядят достаточно искуственными костылями).

Видимо имелось ввиду технология JavaApplet.

Да, конечно. То что на веб страничках исполняется в окне браузера.
Я и не спорю, что некоторые другие применения джавы - гораздо более успешны - те же телефоны, например. (Хотя там и всплывают свои проблемы).

Re: "Слабое" объявление функций в AVRGCC

blindman » 10 янв 2011, 07:47

Michael_K писал(а):там кода-то две с половиной строчки.

Можно и полстрочки по-разному написать

"В варианте из даташита" пишется вот так:
Код: Выделить всёРазвернуть
main.c
=================
extern void f(void);
int main(void)
{
   f();
   for(;;);
}

strong.c
=================
void f (void)
{
   PORTB = 0x55;
}

weak.c
=================
void f (void) __attribute__ ((weak, alias ("__f")));

void __f(void)
{
   PORTB = 0xAA;
}

Re: "Слабое" объявление функций в AVRGCC

Romikgy » 10 янв 2011, 13:47

Michael_K писал(а):Слабое определение - это когда ты определяешь функцию (или переменную) "слабо" - например в библиотеке. А другой программист может прицепить эту твою библиотеку, но определить свою функцию с тем же именем, и линкер не будет ругаться, а будет использовать новую функцию...

Ну, как-то так :)
(Я не программист, если что - в точных терминах могу путаться.)

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

имхо , то о чем вы говорите есть перегрузка функций , очень часто юзается в С++ (перегрузка методов)
если юзаете си ++ создавайте классы и полный вперед....
на чистом си используют подмену адреса самой ф-ции , как с тем же прерыванием.... пишем свою ф-цию , берем ее адрес, и записываем на место вектора прерывания, так же можно поступать и с другими ф-циями

Re: "Слабое" объявление функций в AVRGCC

blindman » 10 янв 2011, 14:16

не, Ромик, ты ничего не понял. "Слабые" символы разрешаются на этапе компоновки, с перегрузкой не имеют ничего общего

Re: "Слабое" объявление функций в AVRGCC

Michael_K » 10 янв 2011, 14:55

blindman писал(а):Можно и полстрочки по-разному написать

Можно - вот я их и переписывал по-разному. Только зачем же в данном случае на мои 50 неправильных вариантов смотреть?

Я бы понял, если б там было две страницы кода, в которые где-то вкралась маленькая ошибочка...

blindman писал(а):"В варианте из даташита" пишется вот так:

О! Спасибо!


cron
Rambler\'s Top100 Mail.ru counter