суббота, 26 января 2013 г.

Слабое связывание или weak linkage

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

foo.c
int foo(void)
{
// ...
return 1;
}

main.c
int foo(void);
int main(void)
{
foo();
while(1);
}

При линковки вы скорей всего увидите что-то похожее на это:
Error: Symbol foo multiply defined (by main.o and foo.o).
Target not created

Но почему же таких ошибок нет при компиляции проектов с этими SDK?

Потому что для реализации callback функций прерываний используется слабое связывание (weak linkage).

 - пример с weak функцией 
weak_foo.c
_weak int foo(void)
{
// ...
return 1;
}

main.c
int foo(void);
int main(void)
{
foo();
while(1);
}

теперь линковщик это спокойно проглотит и у нас будет реализация callback функции "по умолчанию" и в случае если мы захотим заменить эту реализацию на свою, то нам надобудет всего лишь реализовать эту функцию по своему

main.c
int foo(void)
{
  return 3;
}
int main(void)
{
  foo();
  while(1);
}

Комментариев нет:

Отправить комментарий