Перейти к содержанию
    

Сообщение ошибки WINAVR

Все учусь... Подскажите, пожалуйста, что обозначает сообщение при компиляции:

 

main.c:45: error: parse error at end of input

 

при этом показывает на самую последнюю строку (на закрытую скобочку).

 

Попутный вопрос - а есть вообще где-то какое-то обобщенное описание всех сообщений WinAVR?

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу ошибки: если мне не изменяет память, компилятор требует чтобы в исходнике была пустая последняя строка. По ней определяется конец файла.

По поводу обобщённого описания всех сообщений не могу подсказать. Тут надо различать, кто выдаёт сообщение -- компилятор, линкер или ещё кто...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу ошибки: если мне не изменяет память, компилятор требует чтобы в исходнике была пустая последняя строка. По ней определяется конец файла.

По поводу обобщённого описания всех сообщений не могу подсказать. Тут надо различать, кто выдаёт сообщение -- компилятор, линкер или ещё кто...

Если нет пустой строки в конце файла, то выдается предупреждение (warning), но не как не ошибка. Конец файла наверно все таки определяется символом EOF.

К сожалению, хоть и работаю с avr gcc, не знаю, что это за ошибка...(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

main.c:45: error: parse error at end of input

Скорее всего, там какой-то непечатный символ закрался.

 

А лучше приведите весь проблемный исходник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привожу. Только не швыряйте гнилыми помидорами - я еще только учусь. Кстати, там еще есть пару warning'ов. Тоже непонятных.

 

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/sleep.h>

#include <avr/delay.h>

 

#define Freq 4000000

 

char i;

 

void zaziganie (unsigned char z)

{

z = 0;

for (i=0; i<60; i+=1)

{

if ((PIND&0x04) == 0);

else z += 1;

_delay_loop_2 (100);

}

 

//void presskey (void)

 

int main (void)

{

DDRD = 0x00;

PORTD = 0xFF;

DDRB = 0b11111100;

PORTB = 0b00000000;

ACSR = 0b00000000;

GIMSK = 0b01000000;

label1:

sei();

set_sleep_mode (SLEEP_MODE_IDLE);

cli ();

zaziganie (z);

if (z < 30) goto label1;

PORTB = (PINB^0x08);

_delay_loop_2 (1000);

PORTB = (PINB^0b10010000);

//presskey ();

label2:

zaziganie (z);

if (z > 30) goto label2;

else goto label1;

}

 

-------- begin --------

avr-gcc (GCC) 3.4.3

Copyright © 2004 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

 

Compiling C: main.c

avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.lst -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o obj/main.o

main.c: In function `zaziganie':

main.c:24: warning: 'main' is normally a non-static function

main.c:45:2: warning: no newline at end of file

main.c:45: error: parse error at end of input

make.exe: *** [obj/main.o] Error 1

 

> Process Exit Code: 2

 

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void zaziganie (unsigned char z)

{

z = 0;

for (i=0; i<60; i+=1)

{

if ((PIND&0x04) == 0);

else z += 1;

_delay_loop_2 (100);

}

} /*<- вот здесь надо закрывающую скобочку добавить */

 

А так, для начала нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void zaziganie (unsigned char z)

{

...

for (i=0; i<60; i+=1)

{

...

}

 

 

int main (void)

{

...

}

 

Скобочку забыл. Увидел где?

Быват! Когдя я начинал, я не мог правильно написать switch :lol:

 

Я тут немного поправил твой код. Посмотри, может чего умное узришь.

Но если честно, то я особо в код не вникал -- не очень располагаю

временем. Удачи!

 

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/sleep.h>
#include <avr/delay.h>

#define Freq 4000000

unsigned char zaziganie (void)
{
  char i;    // i используется только в этой функции, поэтому определять ее лучще здесь,
             // а не делать глобальной. Глобальные переменные позволяют сэкономить на,
             // оперативной памяти, но глобальность -- это не есть хорошо.
  unsigned char z;   // Резервируем место для переменной в стеке

  z = 0;  // инициализируем ее нулем
  
  for (i = 0; i < 60; i++)  // 
  {
    if ((PIND & 0x04) != 0)
      z++;

    _delay_loop_2 (100);
  }

  return z;
}

  
//void presskey (void)
  
void main (void)  // Zhevak: так лучше, т.к. мэйн не возвращает управление.
{
  DDRD  = 0x00;
  PORTD = 0xFF;
  DDRB  = 0b11111100;  // Zhevak: очень не рекомендую использовать в одном проекте одновременно
  PORTB = 0b00000000;  // и двоичный, и 16-ричный формат представления чисел. Будучи "прожженым"
  ACSR  = 0b00000000;  // ембеддером я неоднократно наступал на эти грабли. Свои ошибки я, конечно же,
  GIMSK = 0b01000000;  // нашел, но сколько я потерял времени на то, что бы "увидеть", что формат
                       // другой.
  
  while(1)
  {
    unsigned char zzz;

    // Вставляй пустые строки, т.е. выделяй логические блоки программы. Потом самому будет
    // легче разбираться в свем коде.
    sei(); 
    set_sleep_mode (SLEEP_MODE_IDLE);
    cli();

    zzz = zaziganie();  // Получим значение для переменной zzz
    if (zzz < 30)
      continue;

    PORTB = (PINB ^ 0x08);       // Zhevak: опять смешивание форматов
    _delay_loop_2(1000);         
    PORTB = (PINB ^ 0b10010000); // Zhevak: опять смешивание форматов
    //presskey ();

    do
    {
      zzz = zaziganie();
    } while (zzz > 30);
  }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эх, невнимательность... Спасибо!!!

 

А что означает:

 

main.c:24: warning: 'main' is normally a non-static function

 

теперь это сообщение только осталось.

 

Спасибо.

 

В общем, сейчас вот так:

 

-------- begin --------

avr-gcc (GCC) 3.4.6

Copyright © 2006 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

 

Compiling C: main.c

avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.lst -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o obj/main.o

In file included from main.c:4:

C:/WinAVR/avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."

main.c: In function `zaziganie':

main.c:23: warning: 'main' is normally a non-static function

 

Linking: main.elf

avr-gcc -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o -std=gnu99 -MD -MP -MF .dep/main.elf.d obj/main.o --output main.elf -Wl,-Map=main.map,--cref --section-start=.text=0x0000,

C:/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/crttn2313.o: In function `__vectors':

../../../../../avr-libc-1.4.4/crt1/gcrt1.S:51: undefined reference to `main'

make.exe: *** [main.elf] Error 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что означает:

 

main.c:24: warning: 'main' is normally a non-static function

 

Это означает что все еще неправильно раставленны скобки.

 

И вот этим вы что хотите сказать:

if ((PIND&0x04) == 0);

else z += 1;

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость Serg79

Давай все разберем по порядку:

In file included from main.c:4:
C:/WinAVR/avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."

Означает: в файле "main.c" в строке 4 идет включение заголовочного файла "#include <avr/delay.h>". Далее идет вывод warning из файла avr/delay.h, что означает: "этот файл перенесен в <util/delay.h>". Вот само содержание файла "avr/delay.h":

#ifndef _AVR_DELAY_H_
#define _AVR_DELAY_H_

#warning "This file has been moved to <util/delay.h>."
#include <util/delay.h>

#endif /* _AVR_DELAY_H_ */

Теперь думаю вопросов не должно возникать по этому поводу. Замени строчку "#include <avr/delay.h>" на "#include <util/delay.h>".

 

 

Далее:

main.c:23: warning: 'main' is normally a non-static function

Говорит о том, что функция "main" является обычной функцией а не статической. Это значит, что ты написал вот так:

static int main(void)
{
...
}

Это были предупреждения компилятора.

 

 

Теперь ошибки линковщика:

Linking: main.elf
avr-gcc -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o -std=gnu99 -MD -MP -MF .dep/main.elf.d obj/main.o --output main.elf -Wl,-Map=main.map,--cref --section-start=.text=0x0000,
C:/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/crttn2313.o: In function `__vectors':
../../../../../avr-libc-1.4.4/crt1/gcrt1.S:51: undefined reference to `main'
make.exe: *** [main.elf] Error 1

Это означает, что линковщик не пожет найти функцию "main" которая вызывается из функции "__vectors" которая находиться в объектной библиотеке "crttn2313.o". А найти функцию "main" линковщик не может потому, что она была объявленна как статическая. А как нам известно, статические функции видны только в пределах файла в котором они описанны, также как и статические переменные определенные вне каких либо функций.

 

 

Надеюсь, теперь у тебя никаких вопросов нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Преогромнейшее спасибо!!!

 

И вот этим вы что хотите сказать:

if ((PIND&0x04) == 0);

else z += 1;

 

Ну... проверяю появление лог. "0" на PD2. Может, неправильно? Ну я новичек - подскажите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость Serg79

Не хотел писать, ну да ладно, напишу. Может и вправду прегодиться.

 

Твоя конструкция:

if ((PIND&0x04) == 0);
else z += 1;

равносильна этой:

if( PIND & (1<<PORT2) )  z++;

только заметь, что второй пример читать намного легче и компилятор по этому коду сгенерирует более оптимальный объектный файл (хотя для GCC это не актуально).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу скобок: если пишете программу в Programmers Notepad 2, который устанавливается вместе с WINAVR, то при наведении курсора на закрывающую скобку он выделяет открывающую, которая ей соответствует по его мнению( и по мнению компилятора в конечном итоге). И ещё, чтоб уменьшить вероятность потери скобок - ставьте скобки сразу, а потом вписывайте между ними ваш код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Преогромнейшее спасибо!!!

Ну... проверяю появление лог. "0" на PD2. Может, неправильно? Ну я новичек - подскажите.

if ((PIND&0x04) == 0);

Похоже, неправильно стоит ";" после круглой скобки. Очепятка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...