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

 
 
 
Reply to this topicStart new topic
> 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
xemul
сообщение Feb 22 2013, 07:01
Сообщение #2



*****

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



<ht_picc_install_path>/docs/manual.pdf, раздел 3.9.5 Function Duplication.
Завешивать прерывание на время xxxtoa и uartSendString() ... ССЗБ.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 22 2013, 07:08
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Функции нереентерабельны, т.е. грубо говоря зависят от еще чего-то, кроме своих параметров. Скорее всего, содержат static переменные, либо побочный эффект от статик в параметрах функций(не помню как в хайтек, но софтовый стек очень прожорливый получается на пиках)
Go to the top of the page
 
+Quote Post
Almaz1988
сообщение Feb 22 2013, 07:40
Сообщение #4


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

Группа: Участник
Сообщений: 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
Сообщение #5



*****

Группа: Свой
Сообщений: 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
Almaz1988
сообщение Feb 22 2013, 10:16
Сообщение #6


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

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



Цитата
Не совсем понял, почему, пользуясь HI-TECH PICC (v9.81), Вы цитируете ман HI-TECH C PRO for the PIC18.

В обоих мануалах относительно duplication function написано одно и тоже

Цитата
Согласно мана, именно так для "compiler-generated duplicate". Компилятор в ПРО режиме?

При установке HI-TECH крякнул его для работы в PRO-режиме, но в упор не вижу где поменять режим? Пока работаю в lite-режиме.
Вот что выдает компилятор при сборке проекта:
Цитата
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.83
Copyright © 2011 Microchip Technology Inc.
Serial number: HCPICP-654321 (PRO)



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

Да, пришло в голову более простое решение вопроса.

Цитата
ЗЫЖ чем "int main(int argc, char** argv)" лучше "void main(void)"?

Ничем)

Но хотелось бы запуститься в PRO-режиме, как переключать режимы ( установлен компиллятор в режиме PRO )?
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 22 2013, 10:56
Сообщение #7



*****

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



Цитата(Almaz1988 @ Feb 22 2013, 14:16) *
При установке HI-TECH крякнул его для работы в PRO-режиме, но в упор не вижу где поменять режим? Пока работаю в lite-режиме.
Но хотелось бы запуститься в PRO-режиме, как переключать режимы ( установлен компиллятор в режиме PRO )?

В lite "compiler-generated duplicate" не работает.
За MPLabX не скажу (неповоротливый монстр, имхо; попробовал - не понравилось).
В обычном МПЛаб'е: Project -> Build options -> Project (или для файлов по отдельности) -> Compiler : Operation mode.
В комплекте с MPLabX идут все XC (-8, -16, -32). Развиваться будут только они. Вероятно, имеет смысл переключиться на них. (чтение на предмет совместимости приветствуется)
Цитата
Ничем)

picc при компиляции генерит startup.as. Т.к. в lite оптимизация почти отсутствует, то излишества от "int main(int argc, char** argv)" скорее всего останутся as is. Не проверял. Да и какой смысл лишний раз грузить компилятор ненужной работой и надеяться на разумность оптимизации?

UPD: Проверил. В startup.as argc и argv не попадают (что логично). В любом режиме компилятор резервирует по 2 байта под argc и argv (в сегменте COMMON), что опять же логично - как сказали, так и сделал. Мог бы ругнуться на отсутствие возвращаемого значения в функции, объявленной "int ()", но похоже, это он таки соптимизировал.
Go to the top of the page
 
+Quote Post
shindax
сообщение Feb 23 2013, 09:37
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 2-04-10
Из: Красноярск
Пользователь №: 56 366



В старых HI-TECH для решения подобных проблем была инструкция компилятору errorlevel. Есть-ли она в новых, я ещё не знаю.

Цитата(shindax @ Feb 23 2013, 17:25) *
В старых HI-TECH для решения подобных проблем была инструкция компилятору errorlevel. Есть-ли она в новых, я ещё не знаю.


Почитал user guide, очень многое поменяли. Надо будет по-новому изучать. IMHO после 9.60 PL3 не нужно было ничего менять.

Сообщение отредактировал shindax - Feb 23 2013, 09:30
Go to the top of the page
 
+Quote Post

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

 


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


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