Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 07.06.2011, 19:31  
Pavlike
Временная регистрация
 
Регистрация: 16.05.2005
Адрес: Киев
Сообщений: 58
Сказал спасибо: 38
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Pavlike на пути к лучшему
Хорошо Как добиться правильной компилляции в AvrStudio??

Целый день мучаюсь, и нет результата ...
Суть проблемы:
Есть код на С из документации атмел (AVR323).
Я перенес только из ИАРа в аврстудию.
Все вроде замечательно, (был правда вопрос с прерыванием, но он тут уже решился). В железе не работает...
Вычислил после нескольких дней прогонов такое:
есть файл №1 (sms_com.c)
Код:
unsigned char rx_ack;

ISR (SIG_UART_RECV)
{
    unsigned char data;                             //Local variable
    data = UDR;                                    //Always read something
    rx_buffer[ rx_wr_i++ ] = data;                  //Store new data

.....
    if( searchFor[rx_i] == data )                   //Test response match
    {
        rx_i++;
        if( !searchFor[rx_i] )                      //End of new_message 
        {
            rx_i = 0;
            if( searchStr == CMTI_ )                //+CMTI:
            {
                searchFor = searchStrings[ CRLF_ ]; //Wait for
                searchStr = CRLF_;
            }
            else                                    //Normal acknowledgement
            {
                rx_ack = 1;                         //Set new message flag
                UCSRB &= ~( 1 ‹‹ RXCIE );         // Disable RX interrupt
            }
        }
    }
    else
    {
        rx_i = 0;                                   //Not valid search pattern...start again.
    }

}
Жирным выделено важное место!

Есть файл №2 (sms_api.c)

Код:
// Extern flag from SMS_com.c
extern unsigned char rx_ack;

char API_check_acknowledge( void )
{
uint16_t i;
uint8_t ii;	
    for( i = 0; ( rx_ack == 0 ) && ( i ‹ 65535 ); i++ ) //Wait loop
    {
        for( ii = 0; ii ‹ 10; ii++ )
        {
            ; 
        }
    }
    if( rx_ack › 0 )    //Everything worked out fine...rx turned off
    {
        rx_ack = 0;              //Reset flag
        return 1;
    }
    else                        //A timeout could result from no acknowledge, 
    {
        COM_rx_off( );     //Receiver off
        COM_rx_reset( );  //Reset buffer and interrupt routine
        return 0;             //Timed out, or wrong acknowledge from phone
    }
}
Т.е в прерывании при приходе нужного байта меняется флаг, и при обращении ко 2й п/прогр-е ждем некоторое время появление флага.

Дизассемблер показывает, что компил-р отказывается проверять каждый цикл переменную с флагом. Т.е. копирует при входе в ПП значение флага в регистр и дальше проверяет только регистр...
================================================== ===
214: +0000056C: 2D95 MOV R25,R5 Copy register
224: if( rx_ack › 0 ) //Everything worked out fine...rx turned off
+0000057B: 2399 TST R25 Test for Zero or Minus
================================================== ===

Дальше я пробовал все возможные варианты компиляции (-О1, -О2, -О3,)

Переделывал цикл:
Код:
   for( i = 0;  i ‹ 65500; i++ ) //Wait loop
    {
        for( ii = 0; ii ‹ 200; ii++ )
        {
         if ( rx_ack == 0 ) break;
        }
    }
В конце еще проэксперементировал с обьявлением переменной RX_ACK
Обьявлял ее в регистре, и в статике...

Результат - 0!!!
Как обмануть компи-р???? Или, вернее, правильно код написать?? Нервы на пределе уже...
Реклама:

Последний раз редактировалось Pavlike; 08.06.2011 в 01:20. Причина: Решено
Pavlike вне форума  
Непрочитано 07.06.2011, 20:19  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Как добиться правильной компилляции в AvrStudio??

"volatile" пробовал?
странно, что и иаре работало - как раз он и любит регистровые оптимизации, тоже в начале на эти грабли часто наступал
Hives вне форума  
Сказали "Спасибо" Hives
Pavlike (08.06.2011)
Непрочитано 07.06.2011, 20:29  
RY723
Заблокирован
 
Регистрация: 08.08.2007
Сообщений: 2,843
Сказал спасибо: 378
Сказали Спасибо 1,368 раз(а) в 746 сообщении(ях)
RY723 на пути к лучшему
По умолчанию Re: Как добиться правильной компилляции в AvrStudio??

Компилятор видит переменную rx_ack как локальную.
Сделайте так:

#include "glob_value.h"

int
main(void)
{

}

В файле glob_value.h опишите все ваши глобальные переменные. Вопрос будет снят. Можете вместо строки #include "glob_value.h" напрямую описать ваши глобальные переменные. Но лучше чрез файл - мешать видеть текст программы не будут.
RY723 вне форума  
Сказали "Спасибо" RY723
Pavlike (08.06.2011)
Непрочитано 07.06.2011, 20:54  
mobil2005
Прописка
 
Аватар для mobil2005
 
Регистрация: 19.07.2006
Адрес: Russia,Yekaterinburg
Сообщений: 184
Сказал спасибо: 12
Сказали Спасибо 75 раз(а) в 43 сообщении(ях)
mobil2005 на пути к лучшему
По умолчанию Re: Как добиться правильной компилляции в AvrStudio??

unsigned char rx_ack;
замените на
volatile unsigned char rx_ack;
Именуйте с volatile все глоабальные переменные которые используются в прерываниях. Иначе они не будут должным образом работать
Сообщение от RY723 Посмотреть сообщение
Компилятор видит переменную rx_ack как локальную.
спорный вопрос как он его видит, но одно могу сказать точно, в прерывании переменная rx_ack не будет должным образом воспринята без volatile))
Даже доки на винавр рекомендуют вставлять volatile везде где есть подобные обращения.
__________________
Разработка электроники на заказ, написание ПО для ПК и МК.Обращайтесь в личку.

Последний раз редактировалось mobil2005; 07.06.2011 в 20:58.
mobil2005 вне форума  
Сказали "Спасибо" mobil2005
Pavlike (08.06.2011)
Непрочитано 07.06.2011, 21:39  
RY723
Заблокирован
 
Регистрация: 08.08.2007
Сообщений: 2,843
Сказал спасибо: 378
Сказали Спасибо 1,368 раз(а) в 746 сообщении(ях)
RY723 на пути к лучшему
По умолчанию Re: Как добиться правильной компилляции в AvrStudio??

Сообщение от mobil2005 Посмотреть сообщение
спорный вопрос как он его видит, но одно могу сказать точно, в прерывании переменная rx_ack не будет должным образом воспринята без volatile))
Спорить можете до умопомрачения. Прекрасно воспринимается и без указания volatile. А вот если переменную описать не в заголовке файла, то компилятор будет воспринимать её как локальную. И она если ей не присвоить значение в вызываемой функции, всегда будет иметь значение 0. Что ТС и описал.
RY723 вне форума  
Непрочитано 08.06.2011, 00:58  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Как добиться правильной компилляции в AvrStudio??

RY723
есть такое понятие как стандарт. эта переменная объявлена как extern - и тут
линкер или связывает ее с другим модулем, или выдает "unresolved external".
а насчет неких "локальных" - у кого то временное помутнение
Hives вне форума  
Непрочитано 08.06.2011, 01:13  
Pavlike
Временная регистрация
 
Регистрация: 16.05.2005
Адрес: Киев
Сообщений: 58
Сказал спасибо: 38
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Pavlike на пути к лучшему
По умолчанию Re: Как добиться правильной компилляции в AvrStudio??

Спасибо всем откликнувшимся!

Действительно, volatile помогло!

Мало того, я вспомнил что на эти грабли когда-то наступал, просто в памяти никак не отложится - что такое и зачем volatile...
Почитаю теорию...
Pavlike вне форума  
Непрочитано 08.06.2011, 01:27  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Как добиться правильной компилляции в AvrStudio??

Сообщение от Pavlike Посмотреть сообщение
Почитаю теорию...
http://www.pic24.ru/doku.php/osa/art...e_for_chainiks
http://chipenable.ru/index.php/progr...e-keyword.html

Последний раз редактировалось st_1; 08.06.2011 в 01:33.
st_1 вне форума  
Сказали "Спасибо" st_1
Pavlike (08.06.2011)
Непрочитано 08.06.2011, 06:39  
mobil2005
Прописка
 
Аватар для mobil2005
 
Регистрация: 19.07.2006
Адрес: Russia,Yekaterinburg
Сообщений: 184
Сказал спасибо: 12
Сказали Спасибо 75 раз(а) в 43 сообщении(ях)
mobil2005 на пути к лучшему
Смех Re: Как добиться правильной компилляции в AvrStudio??

Сообщение от RY723 Посмотреть сообщение
Прекрасно воспринимается и без указания volatile.
Как она восприниматся вами это сугубо ваше мнение.Тут идет речь о том, что переменнная не имеет присвоенного ей значения при обращении к ней в прерывании, и хоть тысячу раз сделайте ее глобальной,проблему это не решит. Мое мнение основанно на рекомендациями приведенными в WinAvr. А ваше мнение оно к сожалению лишь для вас истинно, но на деле лишь субъективное восприятие.
Вот выдержка из документации на винвар
Цитата:
11.2 My program doesn’t recognize a variable updated within an
interrupt routine
When using the optimizer, in a loop like the following one:
uint8_t flag;
...
ISR(SOME_vect) {
flag = 1;
}
...
while (flag == 0) {
...
}
the compiler will typically access flag only once, and optimize further accesses com-
pletely away, since its code path analysis shows that nothing inside the loop could
change the value of flag anyway. To tell the compiler that this variable could be
changed outside the scope of its code path analysis (e. g. from within an interrupt
routine), the variable needs to be declared like:
volatile uint8_t flag;
Заметьте ни слова про "локальнаые переменные"
__________________
Разработка электроники на заказ, написание ПО для ПК и МК.Обращайтесь в личку.

Последний раз редактировалось mobil2005; 08.06.2011 в 06:46.
mobil2005 вне форума  
Непрочитано 08.06.2011, 08:22  
RY723
Заблокирован
 
Регистрация: 08.08.2007
Сообщений: 2,843
Сказал спасибо: 378
Сказали Спасибо 1,368 раз(а) в 746 сообщении(ях)
RY723 на пути к лучшему
По умолчанию Re: Как добиться правильной компилляции в AvrStudio??

Сообщение от mobil2005 Посмотреть сообщение
Как она восприниматся вами это сугубо ваше мнение.Тут идет речь о том, что переменнная не имеет присвоенного ей значения при обращении к ней в прерывании, и хоть тысячу раз сделайте ее глобальной,проблему это не решит. Мое мнение основанно на рекомендациями приведенными в WinAvr. А ваше мнение оно к сожалению лишь для вас истинно, но на деле лишь субъективное восприятие.
Один маленький эксперимент, стоит большой теории. Если описать переменную перед main, то она будет видна всем модулям программы. Только и всего. При таком описании, все переменные доступны обработчику прерываний. Ни разу проблем не возникало. Можете и дальше гнуть пальцы. Успехов!
А действия ТС в таком случае - проанализировать и опробовать все варианты (когда их немного). Оценить преимущества того или иного варианта. Запомнить результаты. Если он этого не сделает - обеднит свой опыт.
Ну а у холиварщиков задачи другие... Их результат не интересует.
RY723 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено] Так, рассказик :)) Я долго ржал :)) DK Отвлекитесь, эмбеддеры! 7 31.08.2007 22:33
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49
[Решено] про блоки питания бу-га-га! zalman Отвлекитесь, эмбеддеры! 12 29.01.2007 10:46


Часовой пояс GMT +4, время: 09:15.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot