Điều này dành cho ứng dụng nhúng chạy ở mức thấp trên UC. Một phần khác của hệ thống yêu cầu các tham số được thiết lập và UC cục bộ cần duy trì một danh sách các tham số. Mỗi tham số bao gồm một ID 8 bit và một giá trị 8 bit. ID bắt đầu ở 0x70 do giới hạn bộ nhớ ở đầu kia.Làm thế nào để đảm bảo enum và mảng có cùng một mục tại biên dịch?
Để giữ mức sử dụng bộ nhớ càng thấp càng tốt, tôi đã triển khai kho tham số dưới dạng mảng chứa ID và Giá trị cho tất cả các tham số có thể ghi. Sau đó có một danh sách liệt kê các tham số này trong tệp tiêu đề để cho phép các phần khác của ứng dụng truy cập các tham số.
Có cách nào để đảm bảo rằng danh sách enum và mảng tham số có cùng mục nhập trong cùng một thứ tự không? Tôi đã ghi lại mã một cách khá kỹ lưỡng (không phải tất cả trong các phần chiết xuất) nhưng tôi muốn đưa vào một số hình thức kiểm tra tại thời gian biên dịch để đảm bảo rằng danh sách và mảng khớp với nhau.
Một điều khác mà tôi không chắc là nếu đây là cách hiệu quả nhất để thực hiện điều này. Tôi cần để có thể lặp qua các tham số để truyền chúng đến một phần khác của hệ thống và tôi cần sử dụng ít bộ nhớ nhất có thể.
Từ 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[];
Từ 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}
};
Tôi không thể có được một macro khẳng định tĩnh làm việc với trình biên dịch của tôi (bắt nguồn từ gcc 4.1) nhưng có các trình khởi tạo được chỉ định là một ý tưởng tuyệt vời mà tôi không biết. Tôi đã thêm vào đó và tôi sẽ chỉ đảm bảo rằng nhà phát triển khác trong dự án này biết được những gì tôi đã làm. Có lẽ tôi sẽ là người duy trì mã này trong tương lai. – RobbG
@RobbG khẳng định tĩnh đã được giới thiệu với C11, lần lượt được giới thiệu ở đâu đó xung quanh gcc 4.8. Bạn sẽ có thể sử dụng macro khẳng định tĩnh nhà của tôi trên bất kỳ trình biên dịch C mặc dù. – Lundin