gpt4 book ai didi

c - C中的跳转表数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:25 24 4
gpt4 key购买 nike

我正在尝试优化对我制作的一些跳转表的访问,它们如下:

int (*const usart_ctrl_table[USART_READ_WRITE_CLEAR])() =
{zg_usartCtrlRead, zg_usartCtrlWrite, zg_usartCtrlClr};

int (*const usart_frame_table[USART_READ_WRITE_CLEAR])() =
{zg_usartFrameRead, zg_usartFrameWrite, zg_usartFrameClr};

int (*const usart_trig_ctrl_table[USART_READ_WRITE_CLEAR])() =
{zg_usartTrigctrlRead, zg_usartTrigctrlWrite, zg_usartTrigctrlClr};

如您所见,这些函数用于在硬件级别访问 usart 外设,并按照读/写/清除的顺序排列在表中。

我试图做的是有另一个跳转表的跳转表,这样我可以在启动时通过初始化所有 usart 的寄存器来运行,或者如果需要,稍后只需更改一个寄存器。

<datatype> (*usart_peripheral_table[<number of jump tables>])() = 
{usart_ctrl_table, usart_frame_table, usart_trig_ctrl_table};

这样我就可以将该表公开给我的中间件层,这将有助于在不断变化的 HAL 中保持标准,而且我还可以使用定义来索引该表,即

fn_ptr = usart_peripheral_table[CTRL_TABLE]
fn_ptr[WRITE](bitmask);
fn_ptr[READ](buffer);

正如您可能已经猜到的那样,我正在努力弄清楚如何构建此表。我认为这是两件事之一:

  1. 另一个简单的指针数组,因为即使是跳转表本身也只是一个指针数组。因此我的初始化是:

    const int* (*usart_peripheral_table[<number of jump tables])() = 
    {usart_ctrl_table, usart_frame_table, usart_trig_ctrl_table};

但是这似乎不起作用。然后我想:

  1. 指向指针的指针数组。所以我尝试了各种组合:

     const int**(*usart_perip...


    const int**(usart_perip...


    const int** (*usart_peripheral_table[<number of jump tables])() =
    {&usart_ctrl_table, &usart_frame_table[0], usart_trig_ctrl_table};

似乎没有任何效果。在将该变量分配给指针到指针数组之前,是否需要将较低跳转表的地址存储在另一个指针中?即

    int* fn_ptr = usart_ctrl_table;


<dataytype>(*const usart_periph[<number>])() = {fn_ptr};

提前致谢,如有任何帮助,我们将不胜感激。

MM25

编辑:

const int** (*const peripheral_table[1])() =
{&usart_ctrl_table[0]};


const int** (*const peripheral_table[1])() =
{usart_ctrl_table};

以上都给出了错误“从不兼容的指针类型初始化”,我尝试过的所有其他组合也是如此

最佳答案

您可能会发现为您的函数指针定义一个 typedef 可以让您的代码更易于阅读和维护(尽管我也看到有人反对它):

#include <stdio.h>
#include <stdlib.h>

#define UART_RWC 3U

typedef int (*uart_ctl_func)(void);

int uart_read(void)
{
printf("Read.\n");
fflush(stdout);
return 0;
}

int uart_write(void)
{
printf("Write.\n");
fflush(stdout);
return(0);
}

int uart_clear(void)
{
printf("Clear.\n");
fflush(stdout);
return 0;
}

uart_ctl_func uart_ctl_jump_table[][UART_RWC] = {
{ uart_read, uart_write, uart_clear },
{ uart_read, uart_write, uart_clear }
};

int main(void)
{
uart_ctl_jump_table[0][1](); // Write.
uart_ctl_jump_table[1][0](); // Read.
uart_ctl_jump_table[1][2](); // Clear.

return EXIT_SUCCESS;
}

下一步可能是将跳转表变成一个struct,这样您就可以编写Uart_ctl_table.frame.read(),或者至少定义一个 >枚举 常量。

#include <stdio.h>
#include <stdlib.h>

#define UART_RWC 3U

typedef int (*uart_ctl_func)(void);

int uart_read(void)
{
printf("Read.\n");
fflush(stdout);
return 0;
}

int uart_write(void)
{
printf("Write.\n");
fflush(stdout);
return(0);
}

int uart_clear(void)
{
printf("Clear.\n");
fflush(stdout);
return 0;
}

typedef struct {
uart_ctl_func read;
uart_ctl_func write;
uart_ctl_func clear;
} uart_ctl_set_t;

typedef struct {
uart_ctl_set_t ctrl;
uart_ctl_set_t frame;
uart_ctl_set_t trig;
} uart_ctl_table_t;

const uart_ctl_table_t uart_ctl_table = {
.ctrl = { uart_read, uart_write, uart_clear },
.frame = { uart_read, uart_write, uart_clear },
.trig = { uart_read, uart_write, uart_clear }
};

int main(void)
{
uart_ctl_table.ctrl.write(); // Write.
uart_ctl_table.frame.read(); // Read.
uart_ctl_table.trig.clear(); // Clear.

return EXIT_SUCCESS;
}

关于c - C中的跳转表数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53563861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com