【发布时间】:2018-01-02 18:15:44
【问题描述】:
我正在为我的 AVR ATmega32 微控制器编写“gpio”设备驱动程序。驱动程序具有如下所示的初始化函数。我使用枚举将配置传递给函数。调用这个函数的一个例子是
gpio_init_port(MY_PORT_A, INPUT, HIGH);
这会将 PORTA 设置为默认值 HIGH 的输入。我使用 switch 语句检查传递的配置以将相应的端口设置为输入或输出。现在我想在switch语句的“默认”情况下使用#error预处理器指令,以防用户输入错误的输入,例如
gpio_init_port(5, INPUT, HIGH);
因此编译停止并打印错误消息。但我不知道为什么它没有按我的预期工作。我指的代码部分是这样的:
default:
#if (port_number != MY_PORT_A && port_number != MY_PORT_B && port_number != MY_PORT_B && port_number!=MY_PORT_D)
#error "Wrong Input. You have entered invalid port number."
#endif
表达式
(port_number != MY_PORT_A && port_number != MY_PORT_B && port_number != MY_PORT_B && port_number!=MY_PORT_D)
不评估并且不打印错误消息。但是当我把它改成
#if (1)
#error "Wrong Input. You have entered invalid port number."
#endif
它工作正常。 我遇到的另一个问题是,当我写类似的东西时
gpio_init_port(5, ***OUTPUT***, HIGH);
虽然我这次传递了“OUTPUT”,但也打印了错误消息,这不应该发生,因为默认情况仅针对“INPUT”情况定义。
gpio.h
______
typedef enum port_number{
MY_PORT_A=0,
MY_PORT_B,
MY_PORT_C,
MY_PORT_D
} port_number_t;
typedef enum port_direction{
INPUT=0,
OUTPUT
} port_direction_t;
typedef enum output_state{
LOW=0,
HIGH
}output_state_t;
void gpio_init_port(port_number_t port_number, port_direction_t port_direction, output_state_t initial_value);
gpio.c
________
#include "gpio.h"
void gpio_init_port(port_number_t port_number, port_direction_t port_direction, output_state_t initial_value)
{
switch (port_direction)
{
case INPUT:
{
switch (port_number)
{
case MY_PORT_A:
DDRA=0x00;
PORTA=initial_value? 0xff:0x00;
break;
case MY_PORT_B:
DDRB=0x00;
PORTB=initial_value? 0xff:0x00;
break;
case MY_PORT_C:
DDRC=0x00;
PORTC=initial_value? 0xff:0x00;
break;
case MY_PORT_D:
DDRD=0x00;
PORTD=initial_value? 0xff:0x00;
break;
default:
#if (port_number != MY_PORT_A && port_number != MY_PORT_B && port_number != MY_PORT_B && port_number!=MY_PORT_D)
#error "Wrong Input. You have entered invalid port number."
#endif
break;
}
}
case OUTPUT:
{
switch (port_number)
{
case MY_PORT_A:
DDRA=0xff;
PORTA=initial_value? 0xff:0x00;
break;
case MY_PORT_B:
DDRB=0xff;
PORTB=initial_value? 0xff:0x00;
break;
case MY_PORT_C:
DDRC=0xff;
PORTC=initial_value? 0xff:0x00;
break;
case MY_PORT_D:
DDRD=0xff;
PORTD=initial_value? 0xff:0x00;
break;
}
}
}
}
那么,这里到底出了什么问题?
我读到枚举不能用于条件编译,但我不知道这是否真的正确以及问题的原因。
提前致谢。
【问题讨论】:
-
请避免同时提出多个问题。
-
@klutt,伙计,这些多个问题在哪里?!!
-
也许我有点快。原因是你写了“Another issue that I have”,但我会撤回接近投票。
标签: c embedded microcontroller