LINUX.ORG.RU

#include

 


1

1

Здравствуйте. Система Open Suse Leap 15.0. Установил avr-gcc (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812], avr-libc. Пытаюсь скомпилировать исходник на си, выдает ошибку: d.c:2:10:

fatal error: avr/io.h: No such file or directory
 #include <avr/io.h>
          ^~~~~~~~~~
compilation terminated.
Нашел файл io.h: 
find /usr/ -name io.h | grep avr
find: ‘/usr/share/polkit-1/rules.d’: Отказано в доступе
/usr/src/linux-4.4.159-73/arch/avr32/include/asm/io.h
/usr/src/linux-4.4.159-73/arch/avr32/mach-at32ap/include/mach/io.h
/usr/avr/sys-root/include/avr/io.h
При компиляции добавил опцию -l с описанием последнего пути выданного find, все равно таже ошибка. Пожалуйста, помогите.

Наверное какая нибудь avr-libc или чё там у них нужна.

anonymous ()

Загони вывод в соответствующий тег - читать больно. Под -I указывал /usr/avr/sys-root/include/ или /usr/avr/sys-root/include/avr/?

Reineke ()

fatal error: avr/io.h: No such file

$ apt-file search "avr/io.h "
avr-libc: /usr/lib/avr/include/avr/io.h

avr-libc зависит от gcc-avr. Наверное здесь есть какая-то связь?

Deleted ()
Ответ на: комментарий от mickey_mouse

Тебе надо указывать папку, в которой gcc сможет найти указанный в инклуде «avr/io.h». То есть во-первых тебе надо указать не путь к файлу, а путь к папке, а во-вторых т.к. у тебя папка avr указана уже в инклуде, то тебе надо указать путь к этой папке, то есть должно быть -I/usr/avr/sys-root/include/. Попробуй так.

Reineke ()
Ответ на: комментарий от mickey_mouse

другие выводы: /usr/src/linux-4.4.159-73/arch/avr32/mach-at32ap/include/mach/io.h

/usr/src/linux-4.4.159-73/arch/avr32/include/asm/io.h

find: ‘/usr/share/polkit-1/rules.d’: Отказано в доступе

mickey_mouse ()
Ответ на: комментарий от mickey_mouse

Кстати, посмотри (и мб лучше сразу сюда покажи) вывод avr-gcc -v. Увидишь сам компилятор ищет либы с хедерами по умолчанию. Может банально заинклужено криво.

Reineke ()
Ответ на: комментарий от Reineke

сделал, как Вы написали, вывод

/usr/avr/sys-root/include/avr/io.h:581:6: warning: #warning «device type not defined» [-Wcpp]

# warning «device type not defined»

и так далее по каждой строке.

mickey_mouse ()
Ответ на: комментарий от mickey_mouse

Ну это уже собственно значит, что изначальную проблему ты решил) Хедеры gcc увидел. Новая ошибка значит, что ты не указываешь под какой контроллер компилить прошивку. там флаг -mmc=<контроллер> есть.

Reineke ()
Ответ на: комментарий от mickey_mouse

Для того, чтоб понимать - надо видеть полностью что ты вводил и что получил. Если у тебя все ошибки именно такого вида как выше - это заглушка в хедере, говорящая о том, что gcc не может определить под что должна собираться прошивка. Почему - хизи. Надо больше инфы.

Reineke ()
Ответ на: комментарий от Reineke
avr-gcc -S d.c -I/usr/avr/sys-root/include/ -mmcu=atmega328p
In file included from d.c:3:0:
/usr/avr/sys-root/include/util/delay.h:92:3: warning: #warning "F_CPU not defined for <util/delay.h>" [-Wcpp]
 # warning "F_CPU not defined for <util/delay.h>"
   ^~~~~~~


/usr/avr/sys-root/include/util/delay.h:112:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" [-Wcpp]
 # warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
   ^~~~~~~


d.c: In function 'main':
d.c:64:1: error: 'TCCR0' undeclared (first use in this function); did you mean 'TCCR0A'?
 TCCR0 |= (1 << CS01); // Предделитель на 8
mickey_mouse ()
Ответ на: комментарий от mickey_mouse

Теперь ему не хватает макроса F_CPU, это как я понимаю, частота для твоего МК. Попробуй перед #include <util/delay.h> (или вообще перед всеми хедерами, что там у тебя есть) добавить #define F_CPU 16000000UL.

Reineke ()
Ответ на: комментарий от mickey_mouse

Да, «avr/» ты указываешь когда инклудишь непосредственно.

Reineke ()
Ответ на: комментарий от Reineke

Чё-то это всё сомнительно выглядит. Наверное на самом деле нужно задавать правильный -march= или чё-то там.

anonymous ()
Ответ на: комментарий от Deleted

из первого сообщения могу только переписать это. Но и «это» уже не имеет значения.

find: ‘/usr/share/polkit-1/rules.d’: Отказано в доступе
/usr/src/linux-4.4.159-73/arch/avr32/include/asm/io.h
/usr/src/linux-4.4.159-73/arch/avr32/mach-at32ap/include/mach/io.h
/usr/avr/sys-root/include/avr/io.h

mickey_mouse ()
Ответ на: комментарий от mickey_mouse

из первого сообщения могу только переписать это

Не надо ничего переписывать! Это ни к чему. Надо исправить саму «тему» (отредактировать). Кнопка такая в ней есть.

Deleted ()
Ответ на: комментарий от Reineke

Но беглый просмотр гугла говорит, что они там у себя делают именно так

Странова-то.

Deleted ()
Ответ на: комментарий от Deleted

добавил define, message стало меньше. very nice!

In file included from d.c:4:0:
/usr/avr/sys-root/include/util/delay.h:112:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" [-Wcpp]
 # warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
   ^~~~~~~
d.c: In function 'main':
d.c:66:1: error: 'TCCR0' undeclared (first use in this function); did you mean 'TCCR0A'?
 TCCR0 |= (1 << CS01); // Предделитель на 8
 ^~~~~
 TCCR0A
d.c:66:1: note: each undeclared identifier is reported only once for each function it appears in
d.c:82:1: error: 'TIMSK' undeclared (first use in this function); did you mean 'TIMSK0'?
 TIMSK |= (1 << TOIE0); // Разрешаем прерывания от таймера
 ^~~~~
 TIMSK0


ключ -S - это оптимизация?
mickey_mouse ()
Ответ на: комментарий от mickey_mouse

message стало меньше

Попробуй всё-таки грепнуть:

$ cd /usr/avr/sys-root/include
$ grep -r "#define F_CPU" *.h
$ grep -r "#define TCCR0" *.h
$ grep -r "#define TIMSK" *.h

Deleted ()
Ответ на: комментарий от mickey_mouse

ни один из grep's ни чего не нашел.

Плохо. Значит всё это ты должен определить сам. Гони на github.com, вбивай в поиск avr и ищи что-то подходящее.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от mickey_mouse

«вбивай в поиск avr».

Ну вбей «gcc-avr» и выбери «C» или «C++»

Deleted ()
Ответ на: комментарий от Deleted

Маловероятно, но есть ещё вариант же, что между define и самим именем стоит не пробел, а там или несколько даже и потому не грепает. Стоит искать по чему-то вроде grep -P "#define[\t\s]*F_CPU" (ну и с остальными так же соответственно).

Reineke ()
Ответ на: комментарий от Deleted

Сделал простую операцию, вместо «cd /usr/avr/sys-root/include» ввел «cd /usr/avr/sys-root/include/avr»

grep -r "#define TIMSK" *.h
io1200.h:#define TIMSK  _SFR_IO8(0x39)
io2313.h:#define TIMSK  _SFR_IO8(0x39)
io2323.h:#define TIMSK  _SFR_IO8(0x39)
io2333.h:#define TIMSK  _SFR_IO8(0x39)
io2343.h:#define TIMSK  _SFR_IO8(0x39)
io43u32x.h:#define TIMSK        _SFR_IO8(0x39)
io43u35x.h:#define TIMSK        _SFR_IO8(0x39)
io4414.h:#define TIMSK  _SFR_IO8(0x39)
io4433.h:#define TIMSK  _SFR_IO8(0x39)
io4434.h:#define TIMSK  _SFR_IO8(0x39)
io76c711.h:#define TIMSK        _SFR_IO8(0x37)
io8515.h:#define TIMSK  _SFR_IO8(0x39)
io8534.h:#define TIMSK  _SFR_IO8(0x39)
io8535.h:#define TIMSK  _SFR_IO8(0x39)
io90pwm161.h:#define TIMSK1  _SFR_IO8(0x01)
io90pwm1.h:#define TIMSK0  _SFR_MEM8(0x6E)
io90pwm1.h:#define TIMSK1  _SFR_MEM8(0x6F)
io90pwm216.h:#define TIMSK0  _SFR_MEM8(0x6E)
io90pwm216.h:#define TIMSK1  _SFR_MEM8(0x6F)
io90pwm2b.h:#define TIMSK0 _SFR_MEM8(0x6E)
io90pwm2b.h:#define TIMSK1 _SFR_MEM8(0x6F)
io90pwm316.h:#define TIMSK0  _SFR_MEM8(0x6E)
io90pwm316.h:#define TIMSK1  _SFR_MEM8(0x6F)
io90pwm3b.h:#define TIMSK0 _SFR_MEM8(0x6E)
io90pwm3b.h:#define TIMSK1 _SFR_MEM8(0x6F)
io90pwm81.h:#define TIMSK1 _SFR_IO8(0x01)
io90pwmx.h:#define TIMSK0  _SFR_MEM8(0x6E)
io90pwmx.h:#define TIMSK1  _SFR_MEM8(0x6F)
io90scr100.h:#define TIMSK0 _SFR_MEM8(0x6E)
io90scr100.h:#define TIMSK1 _SFR_MEM8(0x6F)
io90scr100.h:#define TIMSK2 _SFR_MEM8(0x70)
ioa5272.h:#define TIMSK0  _SFR_MEM8(0x6E)
ioa5272.h:#define TIMSK1  _SFR_MEM8(0x6F)
ioa5505.h:#define TIMSK0  _SFR_MEM8(0x6E)
ioa5505.h:#define TIMSK1  _SFR_MEM8(0x6F)
ioa6612c.h:#define TIMSK0  _SFR_MEM8(0x6E)
ioa6612c.h:#define TIMSK1  _SFR_MEM8(0x6F)
ioa6612c.h:#define TIMSK2  _SFR_MEM8(0x70)
ioa6613c.h:#define TIMSK0  _SFR_MEM8(0x6E)
ioa6613c.h:#define TIMSK1  _SFR_MEM8(0x6F)
ioa6613c.h:#define TIMSK2  _SFR_MEM8(0x70)
ioa6614q.h:#define TIMSK0  _SFR_MEM8(0x6E)
ioa6614q.h:#define TIMSK1  _SFR_MEM8(0x6F)
ioa6614q.h:#define TIMSK2  _SFR_MEM8(0x70)
ioa6616c.h:#define TIMSK0  _SFR_MEM8(0x6E)
ioa6616c.h:#define TIMSK1  _SFR_MEM8(0x6F)
ioa6617c.h:#define TIMSK0  _SFR_MEM8(0x6E)
ioa6617c.h:#define TIMSK1  _SFR_MEM8(0x6F)
ioa664251.h:#define TIMSK0  _SFR_MEM8(0x6E)
ioa664251.h:#define TIMSK1  _SFR_MEM8(0x6F)
ioat94k.h:#define TIMSK _SFR_IO8(0x39)
iocanxx.h:#define TIMSK0 _SFR_MEM8(0x6E)
iocanxx.h:#define TIMSK1 _SFR_MEM8(0x6F)
iocanxx.h:#define TIMSK2 _SFR_MEM8(0x70)
iocanxx.h:#define TIMSK3 _SFR_MEM8(0x71)
iom103.h:#define TIMSK  _SFR_IO8(0x37)
iom1284.h:#define TIMSK0  _SFR_MEM8(0x6E)
iom1284.h:#define TIMSK1  _SFR_MEM8(0x6F)
iom1284.h:#define TIMSK2  _SFR_MEM8(0x70)
iom1284.h:#define TIMSK3  _SFR_MEM8(0x71)
iom1284p.h:#define TIMSK0 _SFR_MEM8(0x6E)
iom1284p.h:#define TIMSK1 _SFR_MEM8(0x6F)
iom1284p.h:#define TIMSK2 _SFR_MEM8(0x70)
iom1284p.h:#define TIMSK3 _SFR_MEM8(0x71)
iom1284rfr2.h:#define TIMSK0                          _SFR_MEM8(0x6E)
iom1284rfr2.h:#define TIMSK0_struct _SFR_MEM8_STRUCT(0x6e, struct __reg_TIMSK0)
iom1284rfr2.h:#define TIMSK1                          _SFR_MEM8(0x6F)
iom1284rfr2.h:#define TIMSK1_struct _SFR_MEM8_STRUCT(0x6f, struct __reg_TIMSK1)
iom1284rfr2.h:#define TIMSK2                          _SFR_MEM8(0x70)
iom1284rfr2.h:#define TIMSK2_struct _SFR_MEM8_STRUCT(0x70, struct __reg_TIMSK2)
iom1284rfr2.h:#define TIMSK3                          _SFR_MEM8(0x71)
iom1284rfr2.h:#define TIMSK3_struct _SFR_MEM8_STRUCT(0x71, struct __reg_TIMSK3)
iom1284rfr2.h:#define TIMSK4                          _SFR_MEM8(0x72)
iom1284rfr2.h:#define TIMSK4_struct _SFR_MEM8_STRUCT(0x72, struct __reg_TIMSK4)
iom1284rfr2.h:#define TIMSK5                          _SFR_MEM8(0x73)
iom1284rfr2.h:#define TIMSK5_struct _SFR_MEM8_STRUCT(0x73, struct __reg_TIMSK5)
iom128a.h:#define TIMSK   _SFR_IO8(0x37)
iom128.h:#define TIMSK     _SFR_IO8(0x37)
iom128rfa1.h:#define TIMSK0                          _SFR_MEM8(0x6E)


и дальше еще столько же
подскажите, под утро что-то плохо соображаю.
mickey_mouse ()
Ответ на: комментарий от mickey_mouse

По-моему всё банально в том, что на твоём контроллере нет регистров TIMSK и TCCR0. Но есть TIMSK0 и TCCR0A вместо них. Либо всё-таки какая-то борода с хедером и чёт не заинклудилось. Но это всё не точно. Проверь даташит на свой МК - точно ли ты юзаешь правильные регистры.

Reineke ()
Ответ на: комментарий от mickey_mouse

и дальше еще столько же

Ну вот. Теперь у тебя куча вариантов. Отбрасываешь TIMSK[0-9], и пошёл по списку:

#include <avr/io1200.h>

Улучшений нет? Тогда следующий по списку.

PS: Но я бы посторался выделить те хэды, которые содержат все необходимые определения и начал бы с них.

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от mickey_mouse

А ещё бы я грепнул /usr/avr/sys-root/include/avr/io.h на наличие #ifdef в теле которого могут оказаться все необходимые инклюды. Ну чем чёрт не шутит. Сделал одно определение и в дамках.

Deleted ()
Ответ на: комментарий от Reineke

Всё правильно говоришь. Для того, чтобы откомпилять под авр надо вручную добавить дефайн F_CPU (так как частота конкретного контроллера не может быть заранее известна компилятору), указать какой у тебя контроллер через -mmcu и заинклудить io.h, который иклудит нужный файл с дефайнами регистров контроллера, указанного в -mmcu.

Compiler optimizations disabled

Нужно добавить оптимизацию, чтобы убрать этот ворнинг, типа [inlne]-O2.

d.c:66:1: error: 'TCCR0' undeclared
d.c:82:1: error: 'TIMSK' undeclared

У меги328 нет таких регистров. Либо тс взял исходник не от своего контроллера, либо указывает не тот контроллер в -mmcu.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.