-1

私はAVRマイクロコントローラーをプログラミングしており、WINAVRスイートのプログラマーのメモ帳でプログラミングしています。

コードを分離しようとしていますが、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"
4

3 に答える 3

2

プロジェクトに含める必要があります。また、コンパイラのコマンドラインでオプションを使用avr/io.hしてmcuを指定する必要があります。gcc-mmcu=

于 2012-02-12T12:18:45.930 に答える
1

のようなファイルを作成する必要が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_ */
于 2012-02-12T11:47:06.963 に答える
1

コンパイルユニット(.cファイル)で「ライブラリ」定義を使用している場合は、そのユニット(ファイル)に適切なヘッダーを含める必要があります。random.cファイルに#includeなどが欠落していると思います。main.cにあるだけでは、random.cのコンパイル中にコンパイラは役に立ちません。:)

(リンカーは別の問題です。)

定義がどこにあるかを見つける1つの方法は、コンパイラーとlibcのソース(インクルード)ディレクトリーを単にgrepして、名前を探すことです。それは必ずしもあなたがそれを手に入れるために何をするつもりなのかをあなたに教えてくれるわけではありません。これは、特定のチップのインクルードファイルに表示され、コンパイラのスイッチに応じてio.hを通過するときにロードされるチップ固有のレジスタ名であると思われます。

別のチップを使用しているときに欠落した場合は、データシートをチェックして、レジスタ/ペリフェラルが特定のチップに存在することを確認し、インクルードファイルで正確なスペルを確認してください。違いがあるかもしれません。

于 2012-02-24T12:40:23.273 に答える