[an error occurred while processing this directive] [an error occurred while processing this directive]
И еще возможная причина (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Беня 24 января 2002 г. 11:14
В ответ на: HI-Tech генерит нереентерабельный код... отправлено Михаил Евстафьев 24 января 2002 г. 04:03

когда функция не возвращает значения, но использует локальные переменные. Вот, например :
//--------------------------------------------
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