2017-10-02 2 views
1

메모리 위치의 특정 값에 따라 값을 정의하는 데 문제가 있습니다.메모리 위치의 특정 값에 따른 값 정의

기본적으로 특정 메모리 위치에서 값을 읽고이 값에서 정의를 만들고 싶습니다. 그런 다음이 동일한 정의를 사용하여 코드를 컴파일 할 때 첫 번째 정의 값에 따라 새 값을 다시 정의하십시오. 당신의 도움에 대한

#define MY_DEFINE_VALUE   (*(uint32_t *)0x0800C200) 

// 8 kBytes of EEPROM 
// First section base address is 0x08080000 
// Second section base address is 0x08081000 
#if (MY_DEFINE_VALUE < 0x0200) 
#define EEPROM_BASE        ((uint32_t)0x08080000) 
#else 
#define EEPROM_BASE        ((uint32_t)0x08081000) 
#endif 

감사 :

은 여기 내 예입니다.

+3

주소를 역 참조하고 있습니다. 그것은 전처리 시간에 할 수 없습니다. –

+3

'* (uint32_t *) 0x0800C200' 표현식은 * run-time *에서 평가되어야합니다. 전처리 기는 순전히 * 컴파일 타임 * 일입니다. 둘을 섞을 수는 없습니다. –

+0

당신이 컴파일하는 머신이 목표가 아닙니다. –

답변

2

이렇게하면 해결할 수 없으며 C는 그렇게 작동하지 않습니다. 사실, 같은 장소에 두 개의 다른 코드 조각이있을 것으로 예상하기 때문에 (2 번째 코드는 0x08080000이고, 하나는 0x08081000입니다.)

  1. 빌드 두 개의 서로 다른 바이너리, 이에 따라 보드 프로그램 : 당신은에를 할 겁니다

    . 이것은 어느 보드가 소프트웨어 외부의 바이너리를 필요로하는지 알기위한 책임을 푸시한다.

  2. 실행시에 체크하고 코드의 하드 코드 된 대안 사이를 선택하거나 단순히 액세스를 동적으로 만든다.

필자가 선호하는 동적 런타임 액세스는 코드의 성능에 중요한 부분에 있지 않는 한 괜찮습니다.

그래서, 당신은 변수를 만들어 주겠다고 :

volatile uint32_t *eeprom_base; 

을 한 후 바로 실행시로 설정하는 코드를 추가하십시오 대신

if (*(uint32_t *) 0x800c200 < 0x200) 
    eeprom_base = (uint32_t *) 0x8080000; 
else 
    eeprom_base = (uint32_t *) 0x8081000; 

다음 변수를 통해 접근을 전처리 기 기호를 변경하거나 후자를 다음으로 변경하십시오.

#define EEPROM_BASE eeprom_base 

물론 변수를 확인해야합니다. 그것이 사용되는 모든 장소에서도 눈에 보이는 선언이 있습니다.

+0

많은 것들을 바꿔야 할 필요가 있더라도 고맙습니다. – LOSwy