diff --git a/Source/Internal/Include/firmware_info.h b/Source/Internal/Include/firmware_info.h new file mode 100644 index 0000000..53879d2 --- /dev/null +++ b/Source/Internal/Include/firmware_info.h @@ -0,0 +1,10 @@ +#ifndef BALSAM_FIRMWARE_INFO_H /* Исключает повторное объявление адаптера паспорта при совместном подключении RS и CAN. */ +#define BALSAM_FIRMWARE_INFO_H /* Обозначает единственный интерфейс firmware-info v1 приложения 166. */ +#include "firmware_info_static.h" /* Использует тот же статический 12-словный контракт общей библиотеки, который подключён в 167. */ +#define FIRMWARE_INFO_ADDRESS 0x1200U /* Адрес firmware-info v1 из протокола 167 и SetGUI; не пересекается с логгером 0x1000..0x117B. */ +#define FIRMWARE_INFO_END (FIRMWARE_INFO_ADDRESS + FIRMWARE_INFO_STATIC_COUNT) /* Исключающая верхняя граница 0x120C охватывает ровно двенадцать 16-битных регистров. */ +static unsigned int firmware_info_range(unsigned int address, unsigned int count) /* Проверяет только чтение внутри паспорта без переполнения 16-битной суммы адреса и длины. */ +{ /* Вычитание выполняется после проверки адреса, поэтому не переполняется на C28x. */ + return address >= FIRMWARE_INFO_ADDRESS && address < FIRMWARE_INFO_END && count > 0U && count <= FIRMWARE_INFO_END - address; /* Разрешает полное и частичное чтение, запрещая нулевую длину и пересечение границы паспорта. */ +} /* Не меняет правила остальных технологических и служебных адресов. */ +#endif /* Завершает адаптер, не добавляя изменяемое состояние или параметры EEPROM. */ diff --git a/Source/Internal/Include/ump_can_protocol.h b/Source/Internal/Include/ump_can_protocol.h index 81b088c..1e0e507 100644 --- a/Source/Internal/Include/ump_can_protocol.h +++ b/Source/Internal/Include/ump_can_protocol.h @@ -10,6 +10,7 @@ #ifndef UMP_CAN_PROTOCOL_H #define UMP_CAN_PROTOCOL_H #include "log_to_mem.h" +#include "firmware_info.h" /* Использует то же окно firmware-info v1, что FC03, сохраняя остальной служебный CAN-протокол 166. */ #define UMP_CAN_MARKER 0x1F00U #define UMP_CAN_MAX_WORDS 124U @@ -21,6 +22,10 @@ static unsigned int ump_can_prepare(unsigned int function, unsigned int address, unsigned int i; *error = 0; if (function == 3) { + if (firmware_info_range(address, value)) { /* Признаёт только чтение внутри нового двенадцатисловного паспорта. */ + for (i = 0; i < value; ++i) reply[i] = firmware_info_static_read(address - FIRMWARE_INFO_ADDRESS + i); /* Общий статический упаковщик выдаёт те же слова, что RS, без чтения архива логгера. */ + return value; /* Передаёт паспорт существующему механизму фрагментов CAN без изменения mailbox, ID и повторов. */ + } /* Все остальные запросы продолжают проходить прежнюю проверку окон логгера v4. */ if (!((address == UMP_LOG_BASE && value == 16) || /* Разрешает от одной до десяти целых 12-словных записей v4 в пределах 120 слов полезного окна CAN. */ (address == UMP_LOG_DATA && value >= UMP_LOG_WORDS && value <= 120U && value % UMP_LOG_WORDS == 0U) || diff --git a/Source/Internal/message.c b/Source/Internal/message.c index 086eeb0..c33bbfa 100644 --- a/Source/Internal/message.c +++ b/Source/Internal/message.c @@ -24,6 +24,8 @@ #include "caliber.h" #include "log_to_mem.h" +#include "firmware_info.h" /* Подключает адрес и границы неизменяемого паспорта 0x1200, совместимого с проверкой прошивки в 167. */ +#include "../src/firmware_info_static.c" /* Собирает общие 12 слов firmware-info через include-путь firmware-info/include; как в 167, копии упаковщика в проекте нет. */ #include "DAC.h" int modbus[ANSWER_LEN+1]; @@ -223,7 +225,8 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr) Length_MB <= UMP_LOG_BASE+16-Address_MB) || (Address_MB >= UMP_LOG_DATA && Address_MB < UMP_LOG_DATA+120 && Length_MB <= UMP_LOG_DATA+120-Address_MB) || - (Address_MB == UMP_LOG_LIVE && Length_MB == 124))) { + (Address_MB == UMP_LOG_LIVE && Length_MB == 124) || /* Сохраняет точное прежнее 124-словное онлайн-окно логгера. */ + firmware_info_range(Address_MB, Length_MB))) { /* Дополнительно разрешает только полное или частичное чтение двенадцати регистров паспорта. */ modbus_exception(rs_arr, CMD_MODBUS_3, 2); return; } @@ -237,15 +240,16 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr) /* Защищаем целостность одного снимка/блока; передача UART идёт уже * с разрешёнными прерываниями и не задерживает измерение/управление. */ - if (Address_MB >= UMP_LOG_BASE) saved = __disable_interrupts(); + if (Address_MB >= UMP_LOG_BASE && Address_MB < FIRMWARE_INFO_ADDRESS) saved = __disable_interrupts(); /* Неизменяемый паспорт не требует блокировки IRQ; целостность прежних снимков логгера сохраняется. */ for (i=0;i= UMP_LOG_BASE ? ump_log_read(Address_MB+i) : modbus[Address_MB+i]; + if (Address_MB >= FIRMWARE_INFO_ADDRESS) value = firmware_info_static_read(Address_MB - FIRMWARE_INFO_ADDRESS + i); /* После проверки диапазона читает только соответствующее слово статического паспорта, без обращения к логгеру. */ + else value = Address_MB >= UMP_LOG_BASE ? ump_log_read(Address_MB+i) : (unsigned int)modbus[Address_MB+i]; /* Сохраняет прежнюю маршрутизацию и беззнаковое представление 16-битных слов технологической карты и логгера v4. */ rs_arr->buffer[3+i*2] = (value >> 8) & 0xFF; rs_arr->buffer[3+i*2+1] = value & 0xFF; } - if (Address_MB >= UMP_LOG_BASE) __restore_interrupts(saved); + if (Address_MB >= UMP_LOG_BASE && Address_MB < FIRMWARE_INFO_ADDRESS) __restore_interrupts(saved); /* Возвращает сохранённую маску только для действительно защищённого снимка логгера. */ crc = 0xffff; crc = get_crc_16(crc, rs_arr->buffer, Length_MB*2+3); @@ -283,6 +287,7 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr) // получили слово данных Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5]; + if (Address_MB >= FIRMWARE_INFO_ADDRESS && Address_MB < FIRMWARE_INFO_END) { modbus_exception(rs_arr, CMD_MODBUS_6, 2); return; } /* Как в контракте 167, запись в паспорт запрещена с Illegal Data Address и не достигает параметров или логгера. */ if (Address_MB >= UMP_LOG_BASE) { if (!ump_log_write(Address_MB, Data_MB)) { diff --git a/UKSSTMS320F28335/.cproject b/UKSSTMS320F28335/.cproject index 854f7aa..9229534 100644 --- a/UKSSTMS320F28335/.cproject +++ b/UKSSTMS320F28335/.cproject @@ -13,7 +13,8 @@ - + + - + +