C - 使用静态数据填充结构的方法

时间:2012-01-15 18:33:13

标签: c arrays

我正在使用要在I2C上发送的数据填充数组,下面的代码显示了我正在做的事情。对我来说,这看起来很糟糕。是否有更好/更整洁的方式,任何人都可以推荐?

由于

#define DS1337_SECONDS_REG              0x00
// Default values used for initialisation
#define DS1337_DEFAULT_SECONDS          0x00
#define DS1337_DEFAULT_MINUTES          0x00
#define DS1337_DEFAULT_HOURS_HR_MODE    0x40
#define DS1337_DEFAULT_DAY              0x00 /* Sun */
#define DS1337_DEFAULT_DATE             0x01
#define DS1337_DEFAULT_MONTH            0x01
#define DS1337_DEFAULT_YEAR             0x0C /* 2012 */
#define DS1337_DEFAULT_ALM1_SECS        0x00
#define DS1337_DEFAULT_ALM1_MINS        0x00
#define DS1337_DEFAULT_ALM1_HRS         0x00
#define DS1337_DEFAULT_ALM1_DAY_DATE    0x00
#define DS1337_DEFAULT_ALM2_MINS        0x00
#define DS1337_DEFAULT_ALM2_HRS         0x00
#define DS1337_DEFAULT_ALM2_DAY_DATE    0x00

extern i2c_err_t i2c_send(const i2c_ch_t channel, const uint8_t data[], const uint32_t length, const i2c_stop_t stop);

rtc_err_t ds1337_init(void)
{
    uint8_t data_to_send[17] = { DS1337_SECONDS_REG,       /* Address of first register */
                             DS1337_DEFAULT_SECONDS, DS1337_DEFAULT_MINUTES, DS1337_DEFAULT_HOURS_HR_MODE,
                             DS1337_DEFAULT_DAY, DS1337_DEFAULT_DATE, DS1337_DEFAULT_MONTH, DS1337_DEFAULT_YEAR,
                             DS1337_DEFAULT_ALM1_SECS, DS1337_DEFAULT_ALM1_MINS, DS1337_DEFAULT_ALM1_HRS, DS1337_DEFAULT_ALM1_DAY_DATE,
                             DS1337_DEFAULT_ALM2_MINS, DS1337_DEFAULT_ALM2_HRS, DS1337_DEFAULT_ALM2_DAY_DATE,
                             DS1337_CTRL_REG_INIT_VAL, /* Turn off the squarewave output pin */
                             DS1337_CLEAR_STATUS_VAL   /* Clear the status registers */
                           };

if (i2c_set_address(DS1337_CHANNEL, DS1337_SPI_ADDRESS) != I2C_NO_ERROR)
     return RTC_I2C_ADDRESS_ERROR;

if (i2c_send(DS1337_CHANNEL, data_to_send, sizeof(data_to_send), STOP_CONDITION) != I2C_NO_ERROR)
    return RTC_I2C_SEND_ERROR;

//enable_interrupts(GLOBAL);

return RTC_NO_ERROR;
}

2 个答案:

答案 0 :(得分:2)

使用枚举而不是#defines,我会说“12”而不是2012年的“0x0C”。

考虑使用硬编码“0”代替显然未使用的*ALM*值。

#include一个头文件,用于获取i2c_send()的声明,而不是明确声明它。

忽略(即隐含)[17]数组大小 - 只需说[]并让你打包的实际数据确定大小。

答案 1 :(得分:1)

这是一种非常标准的方法。枚举(而不是定义)不会使源代码更短。对代码中的常量进行硬编码将使其无法读取。对i2c_send()进行多次调用并且没有数组将大致相同,但可能稍微大一些,可读性较差。定义一些函数来配置每个小东西是确保源代码更大的可靠方法。我可能只是保持代码的原样。