|
или глюк в IAR, или я что- то упускаю, вопрос по массиву |
|
|
|
Jan 22 2011, 18:29
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 22 2011, 19:29
|

Местный
  
Группа: Свой
Сообщений: 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) ?
|
|
|
|
|
Jan 22 2011, 20:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
что значит не беру, еще как беру, смотрите Код if ( hasinput() ) { data [num] = getchar(); } если есть что- то из данных (ф-я hasinput вернула 1- это внешний файл), я вызываю ф-ю getchar, и ее значение кладу в массив. Не про то речь. Это все прекрасно работает, но не в этом месте у меня- тут мне и не понятно почему. Объявление массива как глобального помогло- сейчас буду проверять в железе. Тогда вопрос- а почему нельзя было локально на всю ф-ю main() ее объявлять?
Сообщение отредактировал Метценгерштейн - Jan 22 2011, 20:12
|
|
|
|
|
Jan 22 2011, 20:16
|

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

|
Цитата(Метценгерштейн @ Jan 22 2011, 22:10)  что значит не беру, еще как беру, смотрите ... тут мне и не понятно почему. Уважаемый Dog Pawlowa, имел ввиду, что у Вас не видно что data [ num] меняет значение. Может нам не видно, а где-то " но не в этом месте " - значение num все таки изменяется ?
|
|
|
|
|
Jan 22 2011, 22:21
|

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...
|
|
|
|
|
Jan 22 2011, 22:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
на самом деле интересно и не понятно, зачем ИАР выкинул код. Вот весь проект целиком. http://files.mail.ru/6WP6WHя имел ввиду, что если сделать запись data [0] = getchar(); то программа отказывается выполнять то, что записано сразу после main() т.е. она сразу глючит. Ещё раз, глюки прошли как только вынес массив из вне main() ИАР последней версии 5.51
|
|
|
|
|
Jan 22 2011, 23:38
|

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

|
QUOTE (Метценгерштейн @ Jan 23 2011, 01:51)  Ещё раз, глюки прошли как только вынес массив из вне main() Не из main() а из стека. Перед тем, как начинать программировать следует ТВЕРДО усвоить,.что такое стеки и как они используются и соответственно, перед тем, как пихать что попало в стек, надо подумать, сколько памяти для стека/стеков выделить.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|