Это для встроенного приложения, которое работает на низком уровне на UC. Другая часть системы требует установки параметров, а локальный УК должен поддерживать список параметров. Каждый параметр состоит из 8-битного идентификатора и 8-битного значения. Идентификаторы начинаются с 0x70 из-за ограничений памяти на другом конце.
Чтобы максимально сократить использование памяти, я реализовал хранилище параметров в виде массива, содержащего идентификаторы и значения для всех доступных для записи параметров. Затем в заголовочном файле имеется пронумерованный список этих параметров, позволяющий другим частям приложения получить доступ к параметрам.
Есть ли способ убедиться, что список перечислений и массив параметров имеют одни и те же записи в одном и том же порядке? Я довольно тщательно задокументировал код (не все включено в выдержки), но я хотел бы добавить некоторую форму проверки во время компиляции, чтобы убедиться, что список и массив совпадают.
Еще одна вещь, в которой я не уверен, - это наиболее эффективный способ реализации этого. Мне нужно иметь возможность перебирать параметры, чтобы передать их в другую часть системы, и мне нужно использовать как можно меньше памяти.
От 1_:
/*******************************************************************************/
/* IDs for all parameters must be defined */
/* Defaults only need to be defined for rut-time writable parameters */
/* All parameters must have an ID define */
/* Writable parameters must also have: */
/* * DefaultValue define */
/* * Entry in ParamIndex */
/* * Initialesed default entry in Parameters (contained in C file) */
/* * If min and max values are not 0x00 and 0xFF then define those too */
/*******************************************************************************/
// Parameter IDs - All parameters need this defining
#define Param_ActualTemp_ID 0xE0
#define Param_OperationMode_ID 0xE1
#define Param_MaintenanceModePID0_ID 0xE5
#define Param_MaintenanceModePID1_ID 0xE6
#define Param_FirmwareVersionL_ID 0xEB
#define Param_FirmwareVersionH_ID 0xEC
#define Param_SerialNumberL_ID 0xED
#define Param_SerialNumberH_ID 0xEE
#define Param_SerialNumberHH_ID 0xEF
#define Param_MaxTemperature_ID 0xFC
#define Param_NULL_ID 0xFF
// Parameter Default Values - All writable parameters need this defining
#define Param_NULL_DefaultValue 0xFF
#define Param_OperationMode_DefaultValue 0
#define Param_MaintenanceModePID0_DefaultValue 0xFF
#define Param_MaintenanceModePID1_DefaultValue 0xFF
#define Param_MaxTemperature_DefaultValue 0x54
typedef struct
{
const uint8 id;
uint8 value;
} PARAMETER;
// Parameter Index, any writable parameters need an entry here
// Used as array index for parameters[], do not edit existing values
typedef enum
{
Param_NULL = 0,
Param_OperationMode,
Param_MaintenanceModePID0,
Param_MaintenanceModePID1,
Param_MaxTemperature,
/* Additional values must be entered above this line */
Param_NUMBER_OF_IMPLEMENTED_PARAMS
} ParamIndex;
extern PARAMETER parameters[];
От parameters.c
:
PARAMETER parameters[] = {
{ .id = Param_NULL_ID, .value = Param_NULL_DefaultValue},
{ .id = Param_OperationMode_ID, .value = Param_OperationMode_DefaultValue},
{ .id = Param_MaintenanceModePID0_ID, .value = Param_MaintenanceModePID0_DefaultValue},
{ .id = Param_MaintenanceModePID1_ID, .value = Param_MaintenanceModePID1_DefaultValue},
{ .id = Param_MaxTemperature_ID, .value = Param_MaxTemperature_DefaultValue}
};