2017-04-24 2 views
1

을 int로와 나는캐스트 CONST의 INT 포인터는 내가</p> <pre><code>#define USART1 ((USART_TypeDef *) USART1_BASE) </code></pre> <p>이 내 STM32 코드에서 스위치 케이스 노드,

switch((uint32_t)ptr) 
{ 
    case USART1: return 1; 
(...) 

그러나 GCC-팔을 가지고 싶습니다) 내가

,691,363를 사용할 수있는 정보를 발견

error: reinterpret_cast from integer to pointer

나에게 오류를 제공210

case __builtin_constant_p(USART1): return 0; 

그러나 이것은 gcc 솔루션입니까? 좀 더 일반적인 것이 있습니까?

+1

'ptr'은 어떤 타입입니까? '(USART_TypeDef *) 란 무엇입니까? – Unimportant

+0

스위치 (reinterpret_cast <부호없는 long long> ptr))? –

+0

정수형 포인터 ->'switch ((uint32_t) ptr)' – CinCout

답변

2

. 기계 헤더를 참조하십시오

#define PERIPH_BASE   0x40000000U 
#define APB2PERIPH_BASE  (PERIPH_BASE + 0x00010000U) 
#define USART1_BASE   (APB2PERIPH_BASE + 0x1000U) 

그래서 당신은뿐만 아니라 경우 문에서 정수로 포인터를 캐스팅하는 것을 잊었다

switch((unsigned int)ptr) { 
    case USART1_BASE: return 1; 
} 
0

USART1_BASE는 STM32 개발 환경의 헤더 파일에있는 번호입니다. 스위치에서 사용할 유형을 결정할 때 코드를 컴파일 할 수 있습니다. 나는 uint32_t 추천 :

switch((uint32_t)ptr) 
{ 
    case USART1_BASE: return 1; 
    (...) 

당신이 스위치에서 캐스트를 제거하려고 할 수 있습니다 더 가독성을 좋아하는 경우 : 부호없는 정수 상수의 몇 가지에 불과 합이다 UART1_BASE 있습니다

uint32_t ptr_value = (uint32_t)ptr; 

switch(ptr_value) 
{ 
    case USART1_BASE: return 1; 
    (...) 
2

사용할 수 있어야합니다. 내 작업 코드의 예제 :

switch ((uint32_t)gpio) { 
    case (uint32_t)GPIOA: 
     EXTI_cfgr = 0b0000; 
     break; 
    case (uint32_t)GPIOB: 
     EXTI_cfgr = 0b0001; 
     break; 
    case (uint32_t)GPIOC: 
     EXTI_cfgr = 0b0010; 
     break; 
    default: 
     break; 
    }