Взявшись за описание какого-то абстрактного устройства (читай "Си-структуры"), так и держал в голове некий ID, по которому и буду ориентироваться. Но такая схема доступа приемлема лишь для вывода - для входных значений мы должны изначально привязываться к самым "низшим", с точки зрения предыдущей логики, данным - к каким-то аппаратным адресам.
Так или иначе, роль таблицы реляционной БД (уж простите за столь настойчивое сравнение) будет выполнять массив, а ключами будут его индексы. Нужно выбрать, какое "направление" будет первичным: ввод или вывод. В первом случае в качестве ключа будут использоваться какие-то аппаратные адреса; во втором - присвоенные разработчиком IDs.
Во избежание чрезмерного использования ОЗУ для организации обратного (по отношению к выбранному первичному направлению) доступа к данным об устройстве создаются массивы (таблицы) с указателями на основные записи.
/* Массив структур, доступ к которым осуществляется по "хардверным" координатам */
struct PeriphDev {
enum DevType eDevType;
unsigned long ulFlags;
...
} sPeriphDev[HWADD1][HWADD2];
/* Для "обратного" доступа - по ID устройства */
struct FooTypeDev {
struct PeriphDev *sPeriphDev;
} sFooTypeDev[FOO_TYPE_DEV_COUNT];
struct PeriphDev {
enum DevType eDevType;
unsigned long ulFlags;
...
} sPeriphDev[HWADD1][HWADD2];
/* Для "обратного" доступа - по ID устройства */
struct FooTypeDev {
struct PeriphDev *sPeriphDev;
} sFooTypeDev[FOO_TYPE_DEV_COUNT];
В данном случае выбран способ хранения данных для устройства ввода, как приоритетное.
Комментариев нет:
Отправить комментарий