Здравствуйте.
Наконец-таки начал переползать с ассемблера на Си и возникла следующая проблем. Имеется код (приведены только отрывки на которых спотыкается компилятор):
Код
//изменение скорости обмена
void SetBRate(unsigned brate)
{
....
}
//отправка данных
void SendByte(unsigned brate,unsigned char data)
{
SetBRate(brate);
....
}
//отправка данных на индикатор
static void _send_byte(unsigned char data)
{
....
SendByte(br_19200,data);
....
SetBRate(br_1200);
}
//вывод символа на индикатор
void WriteChar(unsigned char chr)
{
//корректировка кода для русских букв
if (chr >= 0xC0 && chr <= 0xEF)
chr -= 0x40;
else
if (chr >= 0xF0)
chr -= 0x10;
_send_byte(chr);
}
//обработчик прерываний от Timer 0
void INT_TMR0(void)
{
static int cnt = 0;
if (++cnt >= 10)
{
WriteChar('1');
cnt = 0;
}
T0IF = 0;
}
//обработчик прерываний
void interrupt INTHandler(void)
{
if (T0IF) INT_TMR0(); //прерывание от Timer 0
if (RCIF) INT_RxD(); //прерывание от приемника EUSART
}
При комплияции выдаются следующие сообщения об ошибках:
Код
Error [472]; . non-reentrant function "__send_byte" appears in multiple call graphs: rooted at "_INTHandler" and "_main"
Error [472]; . non-reentrant function "_SendByte" appears in multiple call graphs: rooted at "_INTHandler" and "_main"
Error [472]; . non-reentrant function "_SetBRate" appears in multiple call graphs: rooted at "_INTHandler" and "_main"
В документации на HI-TECH написано, что:
(472) non-reentrant function "*" appears in multiple call graphs: rooted at "*" and "*" (Linker)
This function can be called from both main-line code and interrupt code. Use the reentrant keyword, if this compiler supports it, or recode to avoid using local variables or parameters, or duplicate the function, e.g.:Однако из описания ошибки я так и не понял, как ее исправить. Подскажить, на какие грабли я наступил?
P.S. Используется MPLAB 8.00 + HI-TECH 9.60 LITE (который идет вместе с MPLAB 8.00). Контроллер PIC16F690.