|
Обработчик прерываний в HI-TECH, Вызов подпрограмм |
|
|
|
May 7 2008, 05:00
|
Участник

Группа: Участник
Сообщений: 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.
|
|
|
|
|
 |
Ответов
|
May 22 2008, 14:22
|

Участник

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

|
А кто может обьяснить назначение директивы хайтека #pragma inline func_name ? По логике С++ функци с этой директивой должны быть подобны макросам. И тогда обсуждаемая проблема отпадёт сама собой (и вырастет код  ). Но как - то непонятно эта директива описана в даташите и в своё время я с ней не разобрался...
Сообщение отредактировал asmon - May 22 2008, 14:23
|
|
|
|
|
May 22 2008, 15:16
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(asmon @ May 22 2008, 18:22)  А кто может обьяснить назначение директивы хайтека #pragma inline func_name ? По логике С++ функци с этой директивой должны быть подобны макросам. И тогда обсуждаемая проблема отпадёт сама собой (и вырастет код  ). Но как - то непонятно эта директива описана в даташите и в своё время я с ней не разобрался...  И не разбирайтесь - для мелких пиков не актуально. Из мануала к писс 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. 2 Grigorij: а зачем Вам что-то передавать не в прерывании? Положили все, что нужно, (через Ваш send_byte() или как-нибудь еще) в (кольцевой) буфер передачи, установили TXIE = 1, и контроллер, если не занят передачей, сразу попадает в прерывание УСАРТа. В прерывании кидаете очередной байт из буфера в TXREG. Когда все данные будут переданы, останется только сделать TXIE = 0. Нужда в дублировании функций и прочем геморе при этом не возникает. (кста, прошная версия писс сама сделает дубль функции, используемой и в прерываниях, и вне их). И дергать конфиг УСАРТа перед каждым байтом совершенно бессмысленно - один раз настроились (можно и автободом, если он нормально работает, т.е. сначала читаем ерраты на используемый кристалл) и забыли.
|
|
|
|
|
May 23 2008, 04:45
|
Участник

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

|
2xemul
Рассказываю. В моей программе USART используется для 2-х целей: управление индикатором GP1184A01A и связь с датчиком давления и температуры по RS-485. Скорость общения с датчиком 1200 бод (перенастроить нельзя никак). Минимальная скорость, на которой можно общаться с индикатором 9600 бод. В следствие все этого приходится время от времени перенастраивать USART. Сейчас я "минимизировал" кол-во перенастроек, т. к. всегда приходится отправлять не менее 4-х байт (т.е. не приходится "И дергать конфиг УСАРТа перед каждым байтом"). Если бы скорость была все время одна и таже проблем бы не было, то действительно "один раз настроились и забыли".
Что касается вызова ф-ций. У меня в основной ф-ции (то бишь в main) происходит настройка индикатора и для этого, естественно, используется ф-ция SendByte. При возникновении прерывания от таймера (с помощю таймера сделан RTC) необходимо отослать запрос на датчик с целью получения от него данных, опять же используется ф-ция SendByte. В итоге компилятор начинал ругаться. Конечно, можно и просто все складывать в буфер, как Вы и говорите, но, на мой взгля в программе потом очень легко будет запутаться.
|
|
|
|
Сообщений в этой теме
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   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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|