c - 宏 C 中的 LUT

标签 c gcc macros pic lookup-tables

我目前正致力于在 C 语言中建立一个框架,以便在多个微 Controller 之间使用。 该框架必须承载所有设备特定代码,因此应用程序仅包含外设的抽象用法(如 SerialPort_Read、write、SetBaudRate 等)

我在 C 语言中努力寻找解决方案的其中一件事是 I/O 引脚映射。我见过一些项目(比如非常流行的 Arduino),其中引脚图被放置在运行时使用的 LUT(查找表)中。但是,这个 LUT 在运行时永远不会被修改,所以把它放在内存中是没有用的。 例如,此函数从一些“const uint”表中解析一些位索引和寄存器,然后设置或清除位:

void pinMode(uint8_t pin, uint8_t mode)
{
        uint8_t bit = digitalPinToBitMask(pin);
        uint8_t port = digitalPinToPort(pin);
        volatile uint8_t *reg;

        if (port == NOT_A_PIN) return;

        // JWS: can I let the optimizer do this?
        reg = portModeRegister(port);

        if (mode == INPUT) { 
                uint8_t oldSREG = SREG;
                cli();
                *reg &= ~bit;
                SREG = oldSREG;
        } else {
                uint8_t oldSREG = SREG;
                cli();
                *reg |= bit;
                SREG = oldSREG;
        }
}

因为这是在 Controller 上运行的实际 C 代码,所以它会降低效率和速度。我宁愿定义某种宏来做同样的事情,但在编译过程中已经解析为可以更有效地编译的“单行”:

GPIO_Write(PORTA, 5, 1); // Write '1' to pin 5 on PORTA
> LATA |= 1<<5; // Sets bit 5 high
GPIO_Tris(PORTA, 4, OUTPUT); // Set pin 4 on PORTA to output
> PORTA &= ~(1<<4); // sets pin 4 as output I/O type

有谁知道是否可以(以及如何)在 C 语言中定义和使用带有宏的查找表?

目前我正在使用 MicroChip C30 编译器,我相信它是基于 GCC 的。它应该可以在不同的编译器之间移植,包括 MicroChip C18、C32 以及 ARM 和 AVR。

最佳答案

对于您的具体示例,以下内容将起作用:

#define WRITE_PORTA LATA
#define GPIO_Write(port, pin, value)         \
    (value ? WRITE_##port |=  (1U << (pin))  \        
           : WRITE_##port &= ~(1U << (pin)))

#define INPUT  0
#define OUTPUT 1
#define GPIO_Tris(port, pin, direction)                     \
     ((direction) == INPUT ? port |=  (1U << (pin))  \
                           : port &= ~(1U << (pin)))

您必须确保以系统能够理解的方式定义 LATAPORTA - 特别是尝试以其看起来的方式重载其含义在你的例子中可能很难解决。

关于c - 宏 C 中的 LUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9753437/

相关文章:

c - 使用 GCC 强制自动矢量化

c - 宏的重新定义不兼容

c++ - 返回 'this' 指针的宏,当它不可用时返回 NULL

java - "Simulating"一个 64 位整数和两个 32 位整数

c - For循环-多次C

gcc - 安装Cygwin后,在$ PATH中找不到可接受的C编译器

c++ - 在 C/C++ 预处理器中获取宏参数的不同部分

c++ - strtok 工作不正常

c - 类型转换,c语言问题

java - JNI下C程序编译报错