2012-01-15 2 views
1

I2C에서 보낼 데이터로 배열을 채우는 중입니다. 아래 코드는 내가하는 일을 보여줍니다. 나에게 이것은 끔찍한 것처럼 보인다. 누구나 추천 할 수있는 더 좋고/더 좋은 방법이 있습니까?C - 정적 데이터로 구조체를 채우는 방법

감사

대신 # 정의보다는
#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

꽤 표준적인 접근 방식입니다. Enum (정의 대신)은 소스 코드를 훨씬 더 짧게 만들지 않습니다. 코드에서 상수를 하드 코딩하면 읽을 수 없게됩니다. 'i2c_send()'와 배열을 여러 번 호출하는 것은 거의 비슷할 것이다. 아마도 약간 더 크고 덜 읽을 수도 있지만. 모든 작은 것을 구성하는 많은 함수를 정의하는 것은 소스 코드를 더 크게 만드는 확실한 방법입니다. 나는 아마 코드를 그대로 유지할 것이다. –

+0

답변을 작성하십시오. @Alex –

+0

@NiklasHansson : 완료. –

답변

1

이것은 매우 일반적인 접근 방식입니다. Enum (정의 대신)은 소스 코드를 훨씬 더 짧게 만들지 않습니다. 코드에서 상수를 하드 코딩하면 읽을 수 없게됩니다. i2c_send()와 배열을 여러 번 호출하는 것은 거의 비슷하지만 아마 약간 더 크고 덜 읽기 쉽기도합니다. 모든 작은 것을 구성하는 많은 함수를 정의하는 것은 소스 코드를 더 크게 만드는 확실한 방법입니다. 나는 아마 코드를 그대로 유지할 것이다.

+0

댓글은 높이 평가됩니다. 나는 가지고있는 것을 고수 할 것입니다. – integra753

+0

@ integra753 : * 답을 *로 표시하는 것을 잊지 마세요. –

+0

지금 해 보았습니다 (저는이 사이트를 처음 접했습니다 !!). – integra753

2

사용 열거, 나는 2012 년

에 대해 "12"가 아니라 "0x0C"를 말할 것은 대신에 "0"단지 하드 코딩 고려 명백히 사용되지 않은 *ALM* 값.

#include 명시 적으로 선언하지 않고 i2c_send()의 선언을 가져 오는 헤더 파일.

배열 크기를 [17]으로 생략하십시오. 즉, []이라고 말하면 실제 데이터로 크기를 결정할 수 있습니다.

+0

명백하게 사용되지 않는 * ALM * 값 대신 "0"을 하드 코딩하는 것을 고려하십시오. – integra753

+0

죄송합니다. i2c_send() 만 복사했기 때문에 API가 분명해졌습니다. – integra753

관련 문제