2017-11-09 3 views
1

간략한 설명 : 포인터를 통해 구조체에 무언가를 쓰지만 다른 것이 쓰여집니다. 나는 Atollic True Studio 8.1에서 STM32F415RG MCU를 프로그래밍하고 있습니다.포인터를 통해 구조체에 구조체 액세스하기

변수와 표현식 창을 볼지라도 다른 구조의 값을 가진 동일한 구조를 볼 수 있습니다. Same variable in two windows with different values

이제 좀 더 자세히 설명해 드리겠습니다. (더 쉽게 읽을 수 있도록 많은 부분을 단순화 할 예정입니다.) 내 프로토콜 핸들 타입이 정의되어 :

typedef struct 
{ 
    RS485DriverHandle master_rs485; 
} EscomProtocolHandle; 

내 RS485 드라이버 핸들이 정의를 다음과 같이

나는 전역 변수로 내 프로토콜 핸들을 만든
typedef struct 
{ 
    UART_HandleTypeDef* uart_handle; 
    TransceiverState transceiver_state; 
    GPIO_TypeDef* dir_gpio; 
    uint16_t  dir_pin; 
} RS485DriverHandle; 

:

static EscomProtocolHandle hprot1; 

인수로 처리 할 포인터를 사용하는 프로토콜 초기화 함수에 전달합니다.

Escom_Protocol_Init(&hprot1); 

초기화 기능 (이 호출이 많이 간략화) 인수로 RS485 핸들 포인터를 얻어 RS485 드라이버 init 함수에 전달 :

void RS485_Init(RS485DriverHandle* rs485_handle, UART_HandleTypeDef* uart_handle, 
       GPIO_TypeDef* dir_gpio, uint16_t dir_pin) 
{ 
    /* default = listening */ 
    rs485_handle->uart_handle = uart_handle; 
    rs485_handle->dir_gpio = dir_gpio; 
    rs485_handle->dir_pin = dir_pin; 
    ReceiverOutputEnable(rs485_handle); 
    rs485_handle->transceiver_state = kReceiving; 
} 
:

void Escom_Protocol_Init(EscomProtocolHandle* protocol_handle) 
{ 
    RS485_Init(&protocol_handle->master_rs485) 
} 

RS485 초기화 기능이 디폴트 값을 설정

로컬 변수 rs485_handle을 보면 값이 올바르게 설정되었습니다. 하지만 내 손잡이 hprot1을 보면 값이 일치하지 않습니다. rs485_handle의 주소는 master_rs485hprot1의 주소와 일치합니다. P .: 나는 위의 구조 중 하나의 패킹 (#pragma pack)을 망쳐 놓지 않았으므로 문제가되지 않습니다.

+0

'ReceiverOutputEnable (rs485_handle);'에 중단 점을 배치하십시오. 통화 전과 후에 값을 확인하십시오. 문제가이 호출에만있을 수 있도록 코드에서 잘못된 것이 없습니다. –

+0

'RS485_Init', 특히'UART_HandleTypeDef * uart_handle'에 대한 인수 값은'RS485_Init'과'Escom_Protocol_Init' 및/또는 힙의 외부에서 액세스 할 수있는 범위에 정의되어 있습니까? GPIO_TypeDef * dir_gpio? – Joel

+0

참고 : 우선 순위 규칙이 내가 의도 한 것을 망칠 때도 있습니다. 확실하게하려면 다음과 같이 작성하십시오 :'RS485_Init (& (protocol_handle-> master_rs485))'(올바른 것의 주소가 취해 졌는지 확인하십시오) –

답변

1

알 수 있습니다. 포장 된 (1) 구조 프로토 타입을 가진 겉보기 관련이없는 헤더 파일이 있었고 기본 상태로 패킹을 복원하기 위해 structre 프로토 타입 다음에 #pragma pack()이 없었습니다. 따라서 RS485DriverHandle은 다른 장소에서 다르게 포장되었습니다. Escom_Protocol_InitRS485_Init 모두 핸들 구조의 주소는 동일하지만 패킹이 다르기 때문에 예를 들어 GPIO_TypeDef* dir_gpio의 주소는 Escom_Protocol_Init의 0x200000D6이지만 RS485_Init의 0x200000D9였습니다.

+0

당신은 내 대답을 당신 자신이 가지고있다. 작은 디버거를 찾기 위해 때로는 어려운 방법 인 것처럼 적절한 디버깅 작업을 수행했습니다! –

관련 문제