C 构建#define指令数组
我有一些微控制器代码,使用一些头文件,其中GPIO引脚定义如下:C 构建#define指令数组,c,arrays,c-preprocessor,C,Arrays,C Preprocessor,我有一些微控制器代码,使用一些头文件,其中GPIO引脚定义如下: #define PA3 GPIO(GPIO_PORTA, 3) 使用IDE,我可以导航到GPIO的实现,我发现: #define GPIO(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu)) 而端口是一个枚举定义为: const uint8_t pin enum gpio_port { GPIO_PORTA, GPIO_PORTB, GPIO_POR
#define PA3 GPIO(GPIO_PORTA, 3)
使用IDE,我可以导航到GPIO
的实现,我发现:
#define GPIO(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu))
而端口
是一个枚举
定义为:
const uint8_t pin
enum gpio_port { GPIO_PORTA, GPIO_PORTB, GPIO_PORTC, GPIO_PORTD, GPIO_PORTE }
我想创建一个包含所有GPIO定义(PA3
、PA4
等)的数组,该数组可以通过串行端口传递的整数进行索引
我尝试了以下方法:
GPIO knavePinList[] = {PA3, PA4, PA21, PB4, PHY_RESET_PIN, PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PD8, PD9};
但这显然不起作用,因为GPIO不是公认的C类型,而是一个宏。尝试生成时,我收到以下错误消息:
unknown type name 'GPIO'
我甚至可以声明一个宏数组吗?如果是这样,我将如何记录我正在使用的类型
谢谢。#define
语句执行文本替换,它们没有固有的类型。正如您所指出的,GPIO
不是有效类型,它是一个用于计算pin码/地址的宏(实际上GPIO
是未定义的,而GPIO(a,b)
是宏)
如果您想存储其中许多元素的数组,那么您需要知道它们的实际计算类型。假定GPIO
宏返回一个port
和一个pin
值的总和,其中port
是一个枚举,其底层类型是int
(技术上,它是一个特定于实现的整数类型-请参见),而pin
是一个uint8\t
,数组值的实际类型也是整数类型-具体取决于您的实现和可能值的范围。\define
语句执行文本替换,它们没有固有的类型。正如您所指出的,GPIO
不是有效类型,它是一个用于计算pin码/地址的宏(实际上GPIO
是未定义的,而GPIO(a,b)
是宏)
如果您想存储其中许多元素的数组,那么您需要知道它们的实际计算类型。假定
GPIO
宏返回一个port
和一个pin
值的总和,其中port
是一个枚举,其底层类型是int
(技术上,它是一个特定于实现的整数类型-请参见),而pin
是一个uint8\t
,数组值的实际类型也是整数类型-具体取决于您的实现和可能值的范围。不,您不能创建这样的宏数组
如果要基于输入执行特定宏,则需要使用If-else
或switch
语句。如果输入为整数,则可以执行以下操作:
switch( input )
{
case 0: PA3; break;
case 1: PA4; break;
case 2: PA21; break;
...
}
不,不能创建这样的宏数组 如果要基于输入执行特定宏,则需要使用
If-else
或switch
语句。如果输入为整数,则可以执行以下操作:
switch( input )
{
case 0: PA3; break;
case 1: PA4; break;
case 2: PA21; break;
...
}
你发布的数组是完全合法的,我想你还没有测试过它。无论如何,最好用一个可测试的示例提问,(请参阅),但代码:
GPIO knavePinList[] = {PA3, PA4, PA21, PB4, PHY_RESET_PIN, PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PD8, PD9};
将生成一个完全合法初始化的整数数组,其中包含从宏展开的常量的按位值。尝试使用
cpp source.c | more
查看数组声明实际上是如何展开的。顺便说一下,您的代码中还有另一个不同的问题。。。您正在使用相同的标识符,GPIO
,来指示GPIO
宏名称和数组元素的类型,因此当宏处理器遇到它时,它看不到任何参数,这不是您定义它的方式,还有关于调用完全没有参数的双参数宏GPIO
的投诉
你必须测试你的代码。。。并发送1。你所期待的。。。二,。你得到的是。。。因为如果你只是停下来阅读,错误应该是显而易见的
解决问题的方法是将宏GPIO
重命名为GPIO\u位
,例如。。。然后更改所有定义:
#define GPIO_BITS(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu))
...
#define PA3 GPIO_BITS(GPIO_PORTA, 3)
#定义GPIO_位(端口、pin)(((端口)和0x7u)您发布的阵列是完全合法的,我认为您尚未对其进行测试。无论如何,最好用一个可测试的示例询问(请参阅),但代码:
GPIO knavePinList[] = {PA3, PA4, PA21, PB4, PHY_RESET_PIN, PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PD8, PD9};
将生成一个完全合法初始化的整数数组,其中包含从宏展开的常量的按位值
cpp source.c | more
查看数组声明实际上是如何展开的。顺便说一句,代码中还有另一个不同的问题……您正在使用相同的标识符,GPIO
,来指示GPIO
宏名称和数组元素的类型,因此当宏处理器遇到它时,它看不到参数,而我这不是您定义它的方式,也不是您抱怨调用一个没有任何参数的双参数宏GPIO
你必须测试你的代码…并发送1.你期望的…和2.你得到的…因为错误应该是明显的,如果你只是停下来阅读它
解决此问题的方法是将宏GPIO
重命名为GPIO\u位
,然后更改所有定义:
#define GPIO_BITS(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu))
...
#define PA3 GPIO_BITS(GPIO_PORTA, 3)
#定义GPIO_位(端口,引脚)(((端口)和0x7u)感谢您的响应,我的新解决方案是创建两个数组-一个类型为enum GPIO_port
,一个类型为uint8_t
,然后调用GPIO(a,b)
宏我自己在代码中。我编辑了这个问题以反映我真正想要做的事情-即创建一个宏数组,而不是一个定义指令数组。感谢您的回答,我的新解决方案是创建两个数组-一个类型为枚举gpio\U端口
,另一个类型为uint8\U t
,然后调用GPIO(a,b)
ma