Приложения
Приложение А. Функции, константы и структуры RDS
А.2. События блока и связанные с ними описания
А.2.4. События общего назначения
А.2.4.22. RDS_BFM_VARCHECK – проверка допустимости структуры статических переменных блока
Поток, в котором вызывается функция модели
Главный поток RDS.
Первый параметр функции модели (int CallMode)
Константа RDS_BFM_VARCHECK.
Третий параметр функции модели (void *ExtParam)
Указатель на строку типа (char*) статических переменных блока.
Возвращаемое функцией модели значение
| RDS_BFR_DONE | Структура переменных блока удовлетворяет требованиям модели. |
| RDS_BFR_ERROR | Структура переменных блока не удовлетворяет требованиям модели, все дальнейшие реакции, кроме RDS_BFM_CLEANUP и новых RDS_BFM_VARCHECK, будут заблокированы. |
| RDS_BFR_BADVARSMSG | Структура переменных блока не удовлетворяет требованиям модели, все дальнейшие реакции, кроме RDS_BFM_CLEANUP и новых RDS_BFM_VARCHECK, будут заблокированы, пользователю будет выведено сообщение. |
Примечания
Событие RDS_BFM_VARCHECK возникает при подключении к простому блоку новой модели после события RDS_BFM_INIT, а также при любом изменении структуры статических переменных блока. У подсистем, внешних входов/выходов и вводов шин это событие не возникает. Реагируя на это событие, функция модели должна сообщить RDS, подходит ли ей данная структура переменных. Если функция вернет константу RDS_BFR_DONE, структура будет считаться подходящей, и модель блока будет вызываться RDS для реакции на все остальные события. Если же она вернет RDS_BFR_ERROR или RDS_BFR_BADVARSMSG, все события, кроме очистки данных блока (RDS_BFM_CLEANUP) и повторных проверок структуры переменных не будут передаваться в модель блока. Таким образом, написав реакцию на событие RDS_BFM_VARCHECK, программист может быть уверен, что структура статических переменных блока соответствует его ожиданиям, что даст ему возможность обращаться к этим переменным по фиксированным смещениям относительно начала дерева переменных. Работа со статическими переменными блока и примеры реакций на событие RDS_BFM_VARCHECK подробно рассмотрены в §2.5 руководства программиста.
Текущая структура переменных блока, которую модель должна проанализировать, передается в третьем параметре функции в виде строки типа, в которой каждой переменной соответствует символ, обозначающий ее тип (все символы относятся к латинскому алфавиту):
| Символ | Константа в RDS | Обозначаемый тип |
|---|---|---|
| S | RDS_VARTYPE_SIGNAL | Сигнал (1 байт) |
| L | RDS_VARTYPE_LOGICAL | Логический (1 байт) |
| C | RDS_VARTYPE_CHAR | char (целый, 1 байт) |
| H | RDS_VARTYPE_SHORT | short int (целый, 2 байта) |
| I | RDS_VARTYPE_INT | int (целый, 4 байта) |
| F | RDS_VARTYPE_FLOAT | float (вещественный, 4 байта) |
| D | RDS_VARTYPE_DOUBLE | double (вещественный двойной точности, 8 байтов) |
| A | RDS_VARTYPE_STRING | Строка в кодировке UTF8 (char*, завершается нулевым байтом) |
| V | RDS_VARTYPE_RUNTIME | Произвольный тип (изменяется в процессе работы) |
| M | RDS_VARTYPE_ARRAY | Массив или матрица (следующий символ – тип элемента) |
| { | RDS_VARTYPE_STRUCT | Начало структуры (начиная со следующего символа описываются типы полей структуры) |
| } | RDS_VARTYPE_STRUCTEND | Конец структуры (описание типов полей структуры закончилось) |
Последовательность таких символов однозначно описывает структуру статических переменных блока и их размещение в памяти. Поскольку вся совокупность переменных блока с точки зрения RDS является структурой, строка типа всегда начинается с символа «{» и заканчивается символом «}». Ниже приведены некоторые примеры строк типа переменных блоков:
| Строка | Расшифровка |
|---|---|
| «{SSDD}» | Две первых переменных блока – сигналы («S»), за ними следуют две вещественных переменных двойной точности («D»). |
| «{SSMIA}» | Две первых переменных блока – сигналы («S»), за ними следует массив или матрица целых чисел («MI»), за ней – строка («A»). |
| «{SSVMMD}» | Два сигнала («S»), переменная произвольного типа («V»), матрица матриц вещественных чисел («MMD»). |
| «{SS{DD}I{DD}}» | Два сигнала («S»), структура с двумя вещественными полями двойной точности («{DD}»), целое число («I»), снова структура с двумя вещественными полями двойной точности («{DD}»). |
| «{SSM{IDMA}}» | Два сигнала («S») и матрица («M») структур, содержащих три поля: целое («I»), вещественное («D») и матрицу строк («MA»). |
Строка типа переменных простого блока всегда начинается с двух букв «S», поскольку две первых переменных любого простого блока – это сигнал запуска и сигнал готовности. В строке типа не содержится никакой информации о том, является ли переменная входом или выходом, о ее имени и об именах используемых структур (для структур указываются только типы их полей). Вся эта информация не влияет на собственно структуру дерева переменных, то есть на смещения к данным каждой переменной от начала дерева. По той же причине в строке типа не делается различия между матрицами и массивами – в RDS они хранятся в памяти одинаково (см. §2.5.3 руководства программиста).
Модель блока должна сравнить полученную ей в реакции на событие RDS_BFM_VARCHECK строку типа с одной или несколькими заложенными в нее строками, и вернуть RDS константу, указывающую на допустимость данной структуры переменных для данной модели. Возврат RDS_BFR_ERROR отличается от возврата RDS_BFR_BADVARSMSG только тем, что в последнем случае RDS выведет пользователю сообщение о недопустимости структуры переменных блока.
Пример
Реакция на событие RDS_BFM_VARCHECK в модели, которая, помимо двух обязательных сигналов, должна иметь три вещественных переменных двойной точности:
switch(CallMode) { case RDS_BFM_VARCHECK: if(strcmp((char*)ExtParam,"{SSDDD}")==0) return RDS_BFR_DONE; return RDS_BFR_BADVARSMSG;
См. также