Помещение кода C в другой файл - PullRequest
0 голосов
/ 12 февраля 2012

Я программирую микроконтроллер AVR, и в блокноте для программистов в WINAVR Suite.

Я пытаюсь отделить свой код, однако в файле sepeaet .c я не могу использовать предварительно определенные переменные AVR,(переменные, которые AVR предоставляет для указания на определенные биты)

например, этот код будет работать в моем файле main.c.но не в другом файле random.c:

 UBRR0H = (unsigned char)(ubrr>>8);

выдает ошибку:

random.c:6: error: 'UBRR0H' undeclared (first use in this function)

в моем файле main.c он содержит только следующее:

#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include <string.h>
#include <avr/interrupt.h>
#include "lcd.h"
#include "random.h"

Ответы [ 3 ]

2 голосов
/ 12 февраля 2012

Вы должны включить avr/io.h в свой проект, а также указать mcu в командной строке компилятора gcc с параметром -mmcu=.

1 голос
/ 24 февраля 2012

Если вы используете определения «библиотеки» в любом модуле компиляции (файл .c), вам нужно включить правильные заголовки в этот модуль (файл) .Я предполагаю, что вы пропустили #include или что-то подобное в файле random.c.Наличие этого только в main.c не поможет компилятору во время его компиляции random.c.:)

(компоновщик - это другое дело.)

Один из способов выяснить, где находится определение, - просто выполнить поиск по каталогам компилятора и libc source (include) и найти имя,Это не обязательно скажет вам, что вы должны сделать, чтобы получить его.Я подозреваю, что это имя конкретного чипа, которое появляется во включаемом файле для вашего конкретного чипа и загружается при прохождении через io.h в зависимости от переключателей компилятора.

Если оно пропало при использованиидругой чип, проверьте таблицу данных, чтобы убедиться, что регистр / периферийное устройство существует в вашем конкретном чипе и проверьте включенные файлы для точного написания.Там могут быть различия.

1 голос
/ 12 февраля 2012

Вы должны создать файл, подобный yours.h, куда вы помещаете или ваши определения функций и определения макросов:

#define UBRR0H (unsigned char)(ubrr>>8);

int mine_function( char, char, int);

...

extern int global_variable;

не уверен, является ли UBRR0H макросом или экстранальной переменной

Кроме того, используйте что-то про внешние переменные и некоторые статьи о том, как использовать их .

И чем в каждом вашем файле .c вы должны:

#include "yours.h"

Если у вас возникнут проблемы из-за того, что у вас будет много файлов .h, и вы будете включать одно и то же несколько раз (вызовет ошибку, ранее определенную там), есть простой взлом, в yours.h:

#ifndef _H_YOURS_INCLUDED_
#define _H_YOURS_INCLUDED_ 1

// Your real content

#endif /* _H_YOURS_INCLUDED_ */
...