Я пытаюсь оптимизировать доступ к некоторым таблицам переходов, которые я сделал, они выглядят следующим образом:
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);
Как вы, возможно, уже догадались, я изо всех сил пытаюсь выяснить, как построить эту таблицу.Я подумал, что это одна из двух вещей:
Еще один простой массив указателей, поскольку даже таблица переходов сама по себе является просто массивом указателей.Следовательно, моя инициализация будет:
const int* (*usart_peripheral_table[<number of jump tables])() =
{usart_ctrl_table, usart_frame_table, usart_trig_ctrl_table};
Однако, похоже, это не работает.Тогда я подумал:
Массив указателей на указатели.Поэтому я попробовал все виды комбинаций:
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};
Оба вышеупомянутых дают ошибку "инициализация с несовместимого типа указателя", как и все другие комбинации, которые я пробовал