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

 
 
> PIC16, параллельный вызов функции из main() и обработчика прерываний не работ
Almaz1988
сообщение Feb 22 2013, 06:52
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Здравствуйте.
Пишу программу под PIC16f1825 в ( MPLAB X IDE v1.30 + HI-TECH PICC (v9.81) ).
Программа в общем виде состоит из двух блоков: главной функции main() и обработчика прерываний.
Так вот, столкнулся с такой проблемой, что не могу использовать функции параллельно в обоих блоках,
Функции эти:
Код
    itoa_al( char *buff, uint32_t data ); //саописный аналог функции sprintf() для преобразования числа в строку
    uartSendString( char *buff ); // функция отправки строки по uart


Т.е., если я в main() в бесонечном цикле преобразовываю любое число в строку и шлю его по uart'у, то в случае
определенного прерывания, вызывающего эти же две функции по uart'у отсылается не число а нули.

Если в main() эти две функции не использовать, то в обработчике прерывания они срабатывают нормально.

Код:
Код
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>

//.................

static void interrupt isr(void)
{
    //.......................
    itoa_al( buff, 34 );
    uartSendString( buff );
}

int main(int argc, char** argv)
{
    //.........................
    while(1)
    {
         delayMsTimer0( 2000 );
         itoa_al( buff, 34 );
         uartSendString( buff );
    }
}


В чем может быть проблема?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Almaz1988
сообщение Feb 22 2013, 07:40
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Цитата(xemul @ Feb 22 2013, 10:01) *
<ht_pic_install_path>/docs/manual.pdf, раздел 3.9.5 Function Duplication.
Завешивать прерывание на время xxxtoa и uartSendString() ... ССЗБ.


Спасибо за подсказку. Стало понятно - проблема в дублировании не реентерабельных функций.
Но не совсем понял какое решение этой проблемы предлагается в мануале:

Цитата
HI-TECH C PRO for the PIC18 MCU Family has a feature which will duplicate any function
called from more than one call tree in the program’s call graph. A duplicate will be made for each
call tree from which the function is called. The original and any duplicates contribute to the output.
These duplicate functions will have unique names for the assembly function labels themselves,
labels within the functions, and local variables defined in the functions.The name consists of the
usual name prefixed with in, where n is the level number of the interrupt function. The function
called from main-line code will retain its original name.


Функцию объявленную как function() вызывать в main() под именем function(), а в обработчике прерывания
как i1_function()? Компиллятор на это ругается.
Или создать дупликат функции и в обработчике прерываний вызывать дупликат?
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 22 2013, 08:11
Сообщение #3



*****

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



Цитата(Almaz1988 @ Feb 22 2013, 11:40) *
Но не совсем понял какое решение этой проблемы предлагается в мануале:

Не совсем понял, почему, пользуясь HI-TECH PICC (v9.81), Вы цитируете ман HI-TECH C PRO for the PIC18.
Цитата
Функцию объявленную как function() вызывать в main() под именем function(), а в обработчике прерывания
как i1_function()? Компиллятор на это ругается.

Согласно мана, именно так для "compiler-generated duplicate". Компилятор в ПРО режиме?
Цитата
Или создать дупликат функции и в обработчике прерываний вызывать дупликат?

Угу, естественный путь рукопашной дупликации.

Чесслово, ни разу не пользовался ни тем, ни другим. Для отладки и диагностики из прерываний можно придумать менее горбатые способы. А зачем ещё пихать в прерывания мелких пиков что-то printf- или xxxtoa-образное, мне не придумывается.

ЗЫЖ чем "int main(int argc, char** argv)" лучше "void main(void)"?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 10:55
Рейтинг@Mail.ru


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