На какой процессор или микроконтроллер вы ориентируетесь?Вы можете недооценивать полезность LUT.
Для многих процессоров LUT делает больше, чем просто отображает «логический» номер пина в одно значение, «физический» номер пина.LUT отображает «логический» номер контакта на несколько частей информации.
В общем случае «логический» вывод отображается на адрес порта соответствующего регистра чтения / ввода или записи / вывода и битсмещение в регистре чтения или записи.Таким образом, значение вывода на многих микроконтроллерах действительно отображается на структуру.Он также может включать в себя отображение на регистр направления данных и поля внутри него, а также регистры, которые устанавливают состояние повышающих или понижающих резисторов.
Например, у меня есть код для мультиплексирования 8x8дисплей.Во время выполнения мне нужно использовать pinMode, чтобы превратить вывод с выхода на вход с высоким импедансом, и, таким образом, информацию нужно как-то кодировать.
Это можно сделать с помощьюнекоторая изобретательность, на некоторых MCU.Микроконтроллеры ARM (и я полагаю, что 8051, хотя я никогда не использовал их) с использованием «адресации битовой полосы» http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0179b/CHDJHIDF.html
Это назначает уникальный адрес памяти для каждого контакта порта, и фиксированные смещения могут получить адресконтакт для другого регистра данных и другие функции.Это не волшебство, код кодирует информацию, которая часто хранится в LUT.
Для других MCU им действительно нужны как порт, так и позиция бита, поэтому для каждого номера выводов это два значения.
Если вы готовы отказаться от идеи использования целых чисел для выводов, и вместо этого использовать имена, такие как P0, P1, тогда вы можете инициализировать множество const struct
, по одному на имя вывода, и ваши функции будутпринять значения структуры const.Структура будет содержать инициализированный порт и смещение бит или значения битовой маски.Компилятор может оптимизировать скорость.Это позволило бы избежать использования LUT, но все равно использовало бы аналогичное количество места для используемых выводов.Возможно, вам удастся расположить его так, чтобы неиспользуемые булавки не нужно было включать в код, и, следовательно, экономить место.
Редактировать: Если вы хотите использовать C ++, я бы предложил шаблоны C ++, которые могутдать гораздо лучшее решение, чем макросы.Они могут быть безопасными по типу, и их часто легче отлаживать (если у вас есть аппаратная отладка, например, JTAG и gdb)