|
|
  |
PIC16, параллельный вызов функции из main() и обработчика прерываний не работ |
|
|
|
Feb 22 2013, 06:52
|
Частый гость
 
Группа: Участник
Сообщений: 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 ); } } В чем может быть проблема?
|
|
|
|
|
Feb 22 2013, 07:40
|
Частый гость
 
Группа: Участник
Сообщений: 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()? Компиллятор на это ругается. Или создать дупликат функции и в обработчике прерываний вызывать дупликат?
|
|
|
|
|
Feb 22 2013, 08:11
|
    
Группа: Свой
Сообщений: 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)"?
|
|
|
|
|
Feb 22 2013, 10:16
|
Частый гость
 
Группа: Участник
Сообщений: 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 )?
|
|
|
|
|
Feb 22 2013, 10:56
|
    
Группа: Свой
Сообщений: 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 ()", но похоже, это он таки соптимизировал.
|
|
|
|
|
Feb 23 2013, 09:37
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|