[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
когда функция не возвращает значения, но использует локальные переменные. Вот, например :
//--------------------------------------------
unsigned char massiv[ 10] ;
void f1( void) ;
void interrupt __INT( void) {
f1() ;
}
void f1( void) {
unsigned char k ;
for( k = 0 ; k < 10 ; k ++) {
massiv[ k] = 0 ;
}
}
void main( void) {
f1() ;
do ; while( 1) ;
}
//---------------------------------------------------
В этом случае линкер (а не компилятор) выдаст ошибку :
"function _f1 appears in multiple call graphs: rooted at ___INT and _main (error)"
Потому что локальные переменные у HI-TECH статически распределяются, а не динамически (я считаю, что это очень правильно для PIC-ской архитектуры) и компилятор генерирует код, а затем линкер туда "прописывает" адреса переменных и генерирует выходной файл. Т. е. адрес локальной переменной "k" будет задан статически, а не динамически вычислен при входе в функцию. И поэтому линкер проверяет, нет ли рекурсии или, например, вызова функции из обработчика прерывания и откуда-нибудь из фона - потому что получится, что одна и та же переменная с фиксированным адресом используется в нескольких ветках одновременно, что приведет к ее "порче".
E-mail: info@telesys.ru