реклама на сайте
подробности

 
 
> Обработчик прерываний в HI-TECH, Вызов подпрограмм
Grigorij
сообщение May 7 2008, 05:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Здравствуйте.

Наконец-таки начал переползать с ассемблера на Си и возникла следующая проблем. Имеется код (приведены только отрывки на которых спотыкается компилятор):

Код
//изменение скорости обмена
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.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
asmon
сообщение May 22 2008, 14:22
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 20-03-07
Из: Днепродзержинск
Пользователь №: 26 344



А кто может обьяснить назначение директивы хайтека #pragma inline func_name ? 07.gif
По логике С++ функци с этой директивой должны быть подобны макросам.
И тогда обсуждаемая проблема отпадёт сама собой (и вырастет код smile.gif ). Но как - то непонятно эта директива описана в даташите и в своё время я с ней не разобрался... wassat.gif

Сообщение отредактировал asmon - May 22 2008, 14:23
Go to the top of the page
 
+Quote Post
xemul
сообщение May 22 2008, 15:16
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(asmon @ May 22 2008, 18:22) *
А кто может обьяснить назначение директивы хайтека #pragma inline func_name ? 07.gif
По логике С++ функци с этой директивой должны быть подобны макросам.
И тогда обсуждаемая проблема отпадёт сама собой (и вырастет код smile.gif ). Но как - то непонятно эта директива описана в даташите и в своё время я с ней не разобрался... wassat.gif

И не разбирайтесь - для мелких пиков не актуально. Из мануала к писс 9.60:
Цитата
The #pragma inline directive is used to indicate to the compiler that a function is to be inlined.
The directive is only able to be used on functions that are hard coded in the code generator of the
compiler. User defined and library function are not able to be inlinded.


2Grigorij: а зачем Вам что-то передавать не в прерывании? Положили все, что нужно, (через Ваш send_byte() или как-нибудь еще) в (кольцевой) буфер передачи, установили TXIE = 1, и контроллер, если не занят передачей, сразу попадает в прерывание УСАРТа. В прерывании кидаете очередной байт из буфера в TXREG. Когда все данные будут переданы, останется только сделать TXIE = 0. Нужда в дублировании функций и прочем геморе при этом не возникает. (кста, прошная версия писс сама сделает дубль функции, используемой и в прерываниях, и вне их).
И дергать конфиг УСАРТа перед каждым байтом совершенно бессмысленно - один раз настроились (можно и автободом, если он нормально работает, т.е. сначала читаем ерраты на используемый кристалл) и забыли.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Grigorij   Обработчик прерываний в HI-TECH   May 7 2008, 05:00
- - Vanizma   ты используешь одну функцию и в основном теле прог...   May 7 2008, 05:28
- - evc   Цитата(Grigorij @ May 7 2008, 09:00) ... ...   May 7 2008, 05:35
|- - DL36   Цитата(evc @ May 7 2008, 08:35) Компилер ...   May 7 2008, 05:56
|- - evc   Цитата(DL36 @ May 7 2008, 09:56) Ключевое...   May 7 2008, 07:12
|- - DL36   Цитата(evc @ May 7 2008, 10:12) это слово...   May 7 2008, 08:54
||- - Сергей Борщ   Цитата(DL36 @ May 7 2008, 11:54) Все прав...   May 7 2008, 10:13
||- - Vanizma   Цитата(Сергей Борщ @ May 7 2008, 14:13) Е...   May 7 2008, 15:10
||- - DL36   Цитата(Сергей Борщ @ May 7 2008, 13:13) Г...   May 7 2008, 19:34
|- - Grigorij   Цитата(evc @ May 7 2008, 11:12) это слово...   May 8 2008, 04:24
|- - DL36   Цитата(Grigorij @ May 8 2008, 07:24) К со...   May 8 2008, 05:19
|- - Grigorij   Цитата(DL36 @ May 8 2008, 09:19) Надо доб...   May 8 2008, 06:59
|- - DL36   Цитата(Grigorij @ May 8 2008, 09:59) Спас...   May 8 2008, 09:24
|- - Галстук   Цитата(DL36 @ May 8 2008, 13:24) ...у Вас...   May 8 2008, 10:16
|- - Grigorij   2DL36: Постараюсь в кратце описать программу. Она...   May 8 2008, 11:06
|- - DL36   Цитата(Grigorij @ May 8 2008, 14:06) В це...   May 8 2008, 11:38
- - Сергей Борщ   Цитата(Grigorij @ May 7 2008, 08:00) or r...   May 7 2008, 06:18
- - XVR   Цитата(Grigorij @ May 7 2008, 09:00) Здра...   May 8 2008, 06:46
|- - Grigorij   2xemul Рассказываю. В моей программе USART исполь...   May 23 2008, 04:45
|- - xemul   Цитата(Grigorij @ May 23 2008, 08:45) 2xe...   May 23 2008, 08:57
|- - Grigorij   Цитата(xemul @ May 23 2008, 12:57) Заведи...   May 23 2008, 10:54
|- - xemul   Цитата(Grigorij @ May 23 2008, 14:54) Нав...   May 24 2008, 12:45
- - Mad_max   Если еще, не решили свою проблему, то вот почитайт...   Jun 7 2008, 13:10
- - Grigorij   Цитата(Mad_max @ Jun 7 2008, 17:10) Если ...   Jun 10 2008, 05:31


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01415 секунд с 7
ELECTRONIX ©2004-2016