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 *by 1,会将其指向 和 address +sizeof(int*)。因此,假设一个int4 字节长,uart1 + 1将指向 address 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 回答