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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> или глюк в IAR, или я что- то упускаю, вопрос по массиву
Метценгерштейн
сообщение Jan 22 2011, 18:29
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вот код
Код
void main (void) {
__enable_interrupt();
uint32_t timeStamp =CntT1_ms;

char data [15];
uint8_t num = 0;
  
      
       putString("AT+CSQ\r"); //уровень приема сигнала

      
    for(;;){
      
         if ((CntT1_ms-timeStamp) >= LED_BLINK_PERIOD)
         {
           //off (LED);
           putString("AT\r");
           timeStamp =CntT1_ms;
         }    
      
       if ( hasinput() )
            {    
               data [num] = getchar();
              
               cpl (LED);
            }

  }
}


во- первых, странно, что ИАР ругается на варнинг на объявление массива char data[15];

Warning[Pe550]: variable "data" was set but never used D:\works\projects\Blink_LED mega8 +HT\main.c 102

И как только часть кода
data [num] = getchar();
включаю в работу (убираю комментарии),
отказывается работать часть кода между
main (); и

for (;;)

т.е.
putString("AT+CSQ\r");


Что за странное поведение?

Сообщение отредактировал Метценгерштейн - Jan 22 2011, 18:30
Go to the top of the page
 
+Quote Post
OLEG_BOS
сообщение Jan 22 2011, 19:29
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 386
Регистрация: 1-12-05
Пользователь №: 11 639



Цитата(Метценгерштейн @ Jan 22 2011, 20:29) *

Цитата
Warning[Pe550]: variable "data" was set but never used D:\works\projects\Blink_LED mega8 +HT\main.c 102

1. Ничего странного - ведь написано же что переменная объявленна, но не используется - Вы же сами ее закоментировали.
2. А Вы не пробовали объявлять char data [15] глобальной переменной по отношению к функции void main (void) ? rolleyes.gif
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 22 2011, 19:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Мне даже две первые строчки непонятны.
Разрешить прерывания без всякой инициализации источников прерывания?
Что за прерывания используются в проекте?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 22 2011, 19:59
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



прерывания используются для другой ф-ии- вывода строки в USART
putString("AT+CSQ\r");
#pragma vector = USART_RXC_vect

OLEG_BOS, да где же она закомментирована- то?
он ругается на переменную data [],
а это массив у меня, а не переменная. И с чего- это я его не использую?
data [num] = getchar();

это я данные со входа USART кладу в массив.

Сообщение отредактировал Метценгерштейн - Jan 22 2011, 20:00
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 22 2011, 20:03
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Метценгерштейн @ Jan 22 2011, 22:59) *
это я данные со входа USART кладу в массив.

Дык не берете ЖЕ!


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 22 2011, 20:10
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



что значит не беру, еще как беру, смотрите

Код
if ( hasinput() )
            {    
               data [num] = getchar();        
            }


если есть что- то из данных (ф-я hasinput вернула 1- это внешний файл), я вызываю ф-ю getchar, и ее значение кладу в массив.

Не про то речь. Это все прекрасно работает, но не в этом месте у меня- тут мне и не понятно почему.


Объявление массива как глобального помогло- сейчас буду проверять в железе.

Тогда вопрос- а почему нельзя было локально на всю ф-ю main() ее объявлять?

Сообщение отредактировал Метценгерштейн - Jan 22 2011, 20:12
Go to the top of the page
 
+Quote Post
OLEG_BOS
сообщение Jan 22 2011, 20:16
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 386
Регистрация: 1-12-05
Пользователь №: 11 639



Цитата(Метценгерштейн @ Jan 22 2011, 22:10) *
что значит не беру, еще как беру, смотрите
... тут мне и не понятно почему.


Уважаемый Dog Pawlowa, имел ввиду, что у Вас не видно что data [num] меняет значение. Может нам не видно, а где-то " но не в этом месте " - значение num все таки изменяется ? rolleyes.gif
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 22 2011, 20:20
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



значение num меняется по плану, оно ++, но закомментировано. По дефолту оно =0. Сути это не меняло, т.к. запись
data [0] = getchar();

ничего не изменила.

Запускаю в железе Ваш вариант с выносом объявления из main()

итак, перенос объявление массива в глобальные переменные- помогло. А почему не хотело быть объявленным внутри main()?

Сообщение отредактировал Метценгерштейн - Jan 22 2011, 20:22
Go to the top of the page
 
+Quote Post
OLEG_BOS
сообщение Jan 22 2011, 20:24
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 386
Регистрация: 1-12-05
Пользователь №: 11 639



Цитата(Метценгерштейн @ Jan 22 2011, 22:20) *
data [0] = getchar();
ничего не изменила.

А про слово "оптимизация", Вы случаем, ничего не слыхали ? rolleyes.gif Так вот, похоже, что Ваш комплилятор знает об этом слове и использует его по назначению о чем ссобщает в своем warninge rolleyes.gif
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 22 2011, 20:27
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вот зараза то wink.gif

и, что он в данном случае наоптимизировал? Выкинул мой массив? Посчитал, что он мне не нужен? Понимаю, если бы это не ИАР был...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 22 2011, 22:21
Сообщение #11


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
он ругается на переменную data [],
а это массив у меня, а не переменная. И с чего- это я его не использую?
а массив типа не переменная что ли? ))

и всё-же где инициализация порта? как-то немного странно...

Код
и, что он в данном случае наоптимизировал? Выкинул мой массив? Посчитал, что он мне не нужен?
ну а зачем он нужен, если вы всё кладете в нулевой элемент? его в таком случае можно заменить одной переменной типа char, но это ведь всё равно не объясняет почему перестаёт исполняться putString("AT+CSQ\r"); //уровень приема сигнала
что-то тут не то... может таки по прерыванию проц прыгает Бог знает куда?

Не думаю, что IAR на столько плох, что даёт Warning просто так... что там с hasinput() ?
Может быть она сразу, на этапе компиляции, разворачивается в false и весь if ( hasinput() ) выкидывается?
Это может произойти, к примеру, если флаг(который, как я понимаю, проверяет hasinput()) не объявлен с volatile(поднимается то флажок в прерывании).
В общем, кажется, вы запамятовали, что все глобальные переменные, с которыми ведется работа в обработчике прерывания - должны быть volatile...

Но всё это не объясняет исчезновения putString("AT+CSQ\r");.... тут надо как-то повнимательнее посмотреть что к чему...


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 22 2011, 22:51
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



на самом деле интересно и не понятно, зачем ИАР выкинул код.

Вот весь проект целиком.
http://files.mail.ru/6WP6WH

я имел ввиду, что если сделать запись
data [0] = getchar();

то программа отказывается выполнять то, что записано сразу после main()
т.е. она сразу глючит.

Ещё раз, глюки прошли как только вынес массив из вне main()

ИАР последней версии 5.51
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jan 22 2011, 23:20
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Наплевать что вы записываете что-т о в переменную. Если эта переменная ДАЛЬШЕ нигде не используется, то в нее что-то записывать нет никакого смысла (ибо ни на что не влияет). И вот об этом вам сообщает компилятор. А если включен оптимизатор, то и выкидывает нафик этот код.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 22 2011, 23:35
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Насчет putString("AT+CSQ\r"); не уверен, а все остальное в вашей программе из корневого сообщения компилятор имеет право выкинуть, превратив тело блока for(;;) в JMP сам на себя. Первый if никогда не выполняется, если только CntT1_ms не volatile-перменная. Второй if бессмысленный с точки зрения применения результатов. Т.е. в результате его выполнения или невыполнения ничего в данном объекте компиляции не меняется. А раз без разницы выполнять/не выполнять, то и компилировать его не стоит.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 22 2011, 23:38
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Метценгерштейн @ Jan 23 2011, 01:51) *
Ещё раз, глюки прошли как только вынес массив из вне main()

Не из main() а из стека. Перед тем, как начинать программировать следует ТВЕРДО усвоить,.что такое стеки и как они используются и соответственно, перед тем, как пихать что попало в стек, надо подумать, сколько памяти для стека/стеков выделить.




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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