LINUX.ORG.RU

Странное поведение avr-gcc при компиляции с собственным хедером

 , ,


0

1
>>> tree
.
├── init
│   ├── otdiodes.c
│   └── otdiodes.h
├── summator.c
>>> cat init/otdiodes.h 
#ifndef _INIT_OTDIODES_H
#define _INIT_OTDIODES_H
#ifdef _AVR_IO_H

/* 
 * setup output to the diodes
 */
void init();

#endif
#endif
>>> cat init/otdiodes.c
#include "otdiodes.h"

/* 
 * setup output to the diodes
 */
void init() {
        DDRC = 0b00000111;
        DDRA = 0xFF;
        PORTA = 1;
        PORTC = 0;
        PORTC = 5;
        PORTC = 4;
}
>>> cat summator.c 
#include <avr/io.h>
#include "init/otdiodes.h" // init() — настройка вывода на светодиоды

#define FIRST_OP 0b00000001
#define SECOND_OP 0b10000000

/*
 * 1. Написать программу, выполняющую суммирование 2-х чисел. 
 * Результат выводить в двоичном коде на светодиодные индикаторы.
 */

char sum_op(char first_op, char second_op);

void main() {
  init();
  PORTA = ~sum_op(FIRST_OP, SECOND_OP);
  while(1);
}

char sum_op(char first_op, char second_op) {
  return first_op + second_op;
}
>>> avr-gcc -g -Os -mmcu=atmega128 summator.c 
/tmp/ccgvkBJs.o: In function `main':
/home/fx/Документы/Универ/3321_АПСОИ_Микропроцессоры/Микропроцессоры/Code/Lab1/summator.c:15: undefined reference to `init'
collect2: ld returned 1 exit status

ЧЯДНТ? С си я на Вы, но вроде бы должно работать. Я забыл передать компилятору какие-то параметры?

★★★★★

Похоже он ищет функцию init. Я слышал, что некоторые микрики могут стартовать не с main а с какого-нибудь init или start.

А ну у вас её и нет в собираемом проекте.

Надо так:

gcc -c a.c b.c
gcc -o program a.o b.o

Вывод - читайте ошибки компилятора. В них обычно всё написано.

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

Похоже он ищет функцию init

Да вон же ж, в хедере она. ☺

Я слышал, что некоторые микрики могут стартовать не с main а с какого-нибудь init или start.

atmega128 стартует именно с main'а, инфа много процентов.

gcc -c a.c b.c

Черт, действительно. А я почему-то решил, что компилятор сам догадается пройтись по всем файлам.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от RPG

А насколько правильно будет перенести #include <avr/io.h> из summator.c в init/otdiodes.h? Дело в том, что с текущим кодом компилятор отказываться меня слушаться:

>>> avr-gcc -g -Os -mmcu=atmega128 summator.c init/otdiodes.c 
init/otdiodes.c: In function 'init':
init/otdiodes.c:7:2: error: 'DDRC' undeclared (first use in this function)
init/otdiodes.c:7:2: note: each undeclared identifier is reported only once for each function it appears in
init/otdiodes.c:8:2: error: 'DDRA' undeclared (first use in this function)
init/otdiodes.c:9:2: error: 'PORTA' undeclared (first use in this function)
init/otdiodes.c:10:2: error: 'PORTC' undeclared (first use in this function)


От этого меня немножко коробит, может есть какое-то более Ъ решение?

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

Это я ступил. У вас стопроцентная типичная ошибка отсутствия нужного куска объектного кода. Компилятор по инклюдам не обязан догадываться, где лежит тело функции - оно может быть где угодно, в т. ч. и в динамической библиотеке.

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

Рассматривайте инклюд как этап препроцессора с тупой подстановкой текста.

У вас есть два варианта: подключить avr/io.h в обоих сишниках, или же подключить avr/io.h в заголовочнике, который всё равно подключается в этих обоих сишниках.

Оба варианта имеют право на существование.

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

Спасибо, впредь буду внимательнее.

f1xmAn ★★★★★
() автор топика

>>> avr-gcc -g -Os -mmcu=atmega128 summator.c

А собрать otdiodes.c не хочешь для начала? AVR тут вообще не причём, читай про gcc и make (тред не читал)

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

Я слышал, что некоторые микрики могут стартовать не с main а с какого-нибудь init или start.

Ерунда

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

могут стартовать не с main

«Микрики» могут стартовать только с какого-то адреса. Что туда положишь с помощью скрипта linker'а, то и будет исполняться.

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

тред не читал

А зря. Да и галочка возле заголовка намекает.

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