Это для встроенного приложения, которое работает на низком уровне на UC. Другая часть системы требует, чтобы параметры были установлены, а локальный UC должен поддерживать список параметров. Каждый параметр состоит из 8-битного идентификатора и 8-битного значения. Идентификаторы начинаются с 0x70 из-за ограничений памяти на другом конце.Как обеспечить, чтобы перечисление и массив имели одинаковые записи при компиляции?
Для обеспечения максимально возможного использования памяти я реализовал хранилище параметров как массив, содержащий идентификаторы и значения для всех доступных для записи параметров. После этого перечисляется список этих параметров в файле заголовка, чтобы другие части приложения могли обращаться к параметрам.
Есть ли способ гарантировать, что список перечислений и массив параметров имеют одни и те же записи в одном порядке? Я достаточно тщательно документировал код (не все включены в выдержки), но я хотел бы включить некоторую форму проверки во время компиляции, чтобы убедиться, что список и массив совпадают.
Другое дело, что я не уверен в том, что это самый эффективный способ реализации этого. Мне нужно иметь возможность перебирать параметры, чтобы передать их в другую часть системы, и мне нужно использовать как можно меньше памяти.
От parameters.h
:
/*******************************************************************************/
/* 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}
};
Я не могу заставить статический макрос assert работать с моим компилятором (полученный из gcc 4.1), но наличие назначенных инициализаторов - отличная идея, о которой я не знал. Я добавил это, и я просто сделаю так, чтобы другой разработчик этого проекта знал о том, что я сделал. Вероятно, я буду тем, кто все время будет поддерживать этот код в будущем. – RobbG
@ RobbG Статический утверждение было введено с C11, который, в свою очередь, был представлен где-то около gcc 4.8. Тем не менее, вы должны использовать мой статический макрос home-brewn на любом компиляторе C. – Lundin