ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
180844
koyodza (10.02.2010 12:39, просмотров: 38523) Kceния
ещё вопрос: как лучше сделать таблицу ссылок на данные? раньше в устройствах с модбасом я просто делал огромную структуру (вернее, две: для INPUT_REG и HOLD_REG), в которые засовывал всё, что мне нужно. Но сейчас я вижу, что количество регистров в устройстве перевалит далеко за сотню, и такой способ уже становится неудобным хотя бы потому, что добавлять поля можно будет только в конец, иначе это всё безобразие "ползает" по modbus-адрессации и создаёт массу неприятностей. Само собой, я закладывал кучу полей Reserved, но всё равно контролировать изменения достаточно неудобно. К тому же в этой структуре собраны параметры и данные с абсолютно разных функциональных модулей. Кроме того, теперь кроме модбаса мне нужно будет поддерживать и другие протоколы. И подумалось мне держать все эти данные в отдельных структурах, принадлежащих этим самым функциональным модулям, а модбасу подарить структуру ссылок на эти структуры. Типа так: WORD a = 0x0123; // это типа одна структура WORD b; // это другая void* c[] = {// а это ссылки на них &a, &b }; Поскольку каждая структура будет занимать намного больше, чем 1 регистр модбаса, адресное пространство модбаса поделить блоками по 8 или 16 регистров (ещё подумаю сколько). Начало каждого блока - это начало структуры. Но тут возникает ряд новых проблем: 1. адрес начала структуры - это 32 бита. И хотя ОЗУ всего 20кБ и вполне можно было бы обойтись 16 битами, при попытке инициализировать поля примерно вот таким образом WORD a = 0x0123; WORD b; WORD c[] = { (WORD)&a, (WORD)&b }; получаю ошибки: RS.c(360): warning: #1296-D: extended constant initialiser used RS.c(360): warning: #767-D: conversion from pointer to smaller integer RS.c(360): error: #69: integer conversion resulted in truncation RS.c(360): error: #29: expected an expression 2. Кроме ссылок на структуры мне нужно хранить их длину. Тут проблем нет, но это ещё как минимум 1 байт, т.е. одна запись будет не меньше 5 байт (4 байта адрес + длина), что довольно много, особенно если попытаться выровнять на 8 Какие у кого будут мысли?