这是我的计划:
#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;
}
}
答案 0 :(得分:3)
您需要使用常量而不是那些定义:
#define uart0 0x860
#define uart1 0x880
像这样:
const int * uart0 = 0x860;
const int * uart1 = 0x868;
另请注意,将int *
类型的指针递增1
,会将其指向并指向+sizeof(int*)
。因此假设int
长度为4个字节,uart1 + 1
将指向地址0x884
。
答案 1 :(得分:0)
#define uart0 (int*)0x860
#define uart1 (int*)0x880
还必须改变
while(!((*(uart1+2) & 0x0040) == 0x0040))
^ ^^
但这绝对不是访问内存的最佳方式。宏的东西现在可以工作了,但是将它嵌入到另一个表达式中可能会产生意想不到的结果或者无法编译。
(int*) xxx + y
计算大小为(int)的表达式,即4。
答案 2 :(得分:0)
解决问题的最佳方法:阅读编译器的文档。您的编译器可能附带了一个头文件,该头文件已经定义了一组用于访问UART硬件的宏。
否则,这里是如何声明你的宏:
#include <stdint.h>
#define UART0 (*(volatile uint8_t *) 0x860)
#define UART1 (*(volatile uint8_t *) 0x880)
这假设您的UART寄存器是8位。如果它们是16位或32位,请使用适当的类型更改宏定义中的uint8_t
类型。
您需要调整代码才能使用这些宏。