0

これは私のプログラムです:

#include <stdio.h>

#define uart0 0x860
#define uart1 0x880

void send_char( int output )
{
    int nothing;
    //while write on uart1 is not ready, wait
    while(!((*(uart1+8) & 0x0040) && 0x0040)) //+8 eller +2? 2 byte (8 bitar)
    {
        nothing = 0;

    }
    *(uart1+4) = output; // +4 eller +1? en byte (4 bitar)
}

int rec_charx(void)
{
    if(!((*(uart1+8) & 0x0040) && 0x0040)) //+8 eller +2? 2 byte (8 bitar)
    {
        return *(uart1) & 0x000f;
    }
    else
    {
        return -1;
    }
}

コンパイラは文句を言います:

'出力'の前に')'が必要です

なんで?どうすれば修正できますか?苦情がわかりません。

アップデート

プログラムに書き直しましたが、それでもコンパイルエラーが発生します。

#include <stdio.h>

static int* const uart1 = (int*) 0x880;

void send_char( int output )
{
    int nothing;
    //while write on uart1 is not ready, wait
    while(!((uart1[2] & 0x0040) && 0x0040)) //+8 eller +2? 2 byte (8 bitar)
    {
        //do nothing
        nothing = 0;

    }
    uart1[1] = output; // skriv till uart1
}

int rec_charx(void)
{
    if(!((*(uart1+8) & 0x0040) && 0x0040)) //+8 eller +2? 2 byte (8 bitar)
    {
        return *(uart1) & 0x000f;
    }
    else
    {
        return -1;
    }
}
4

3 に答える 3

3

これらの定義の代わりに定数を使用する必要があります。

#define uart0 0x860
#define uart1 0x880

そのようです:

const int * uart0 = 0x860;    
const int * uart1 = 0x868;

int *また、型のポインタを。だけインクリメントする1と、それをポイントしてアドレスに移動することにも注意して+sizeof(int*)ください。intしたがって、 4バイトの長さであると仮定するuart1 + 1と、アドレスを指します0x884

于 2012-11-11T15:59:56.310 に答える
0

問題を解決する最良の方法:コンパイラのドキュメントを読んでください。コンパイラには、UARTハードウェアにアクセスするための一連のマクロをすでに定義しているヘッダーファイルが付属している可能性があります。

それ以外の場合は、マクロを宣言する方法は次のとおりです。

#include <stdint.h>

#define UART0 (*(volatile uint8_t *) 0x860)
#define UART1 (*(volatile uint8_t *) 0x880)

これは、UARTレジスタが8ビットであることを前提としています。16ビットまたは32ビットの場合uint8_tは、マクロ定義のタイプを適切なタイプに変更します。

これらのマクロを使用するには、コードを調整する必要があります。

于 2012-11-11T16:56:08.050 に答える
0

#define uart0 (int*)0x860
#define uart1 (int*)0x880

また、変更する必要があります

while(!((*(uart1+2) & 0x0040) == 0x0040)) 
                 ^            ^^

しかし、これは間違いなくメモリにアクセスするための最も美しい方法ではありません。マクロは機能するようになりましたが、別の式に埋め込むと、予期しない結果が発生したり、コンパイルに失敗したりする可能性があります。

(int*) xxx + y(int)、つまり4のサイズで式を計算します。

于 2012-11-11T16:17:01.827 に答える