2017-01-15 1 views
1

필자는 TI MSP430 마이크로 컨트롤러의 FRAM 레지스터에 일부 플로트 데이터를 저장하고 몇 가지 prolems를 갖고 싶습니다.uint32_t 포인터에 플로트 값 저장

나는 이것을 어떻게 할 수 있는지 모른다.

정상적인 정수 변수는 아무런 문제가되지 않습니다.

일반 정수 변수 :

void main() 
{ 
    uint32_t value = 25; 
    uint32_t framPtr = 0xD000; 

    FRAMC_write_uint32_t(value, (uint32_t*)framPtr); 
} 

void FRAMC_write_uint32_t(uint32_t value, 
          uint32_t *framPtr) 
{ 
    *framPtr = value; 
} 

그러나 부동 소수점 값이 작동하지 않습니다. 함수 내부의 값을 float으로 변경하려고 시도했지만 결과가 없습니다. (

void FRAM_write_float(float value, 
         uint32_t *framPtr) 
{ 
    *framPtr++ = (float)value; 
} 

그것은 데이터를 1.40129846e-45 (DEN)를 저장 : 그것은 작동하지 않습니다

float value = 1.25; 
    uint32_t framPtr = 0xD000; 

이 기능 :

이 내 부동 소수점 데이터입니다 HEX : 0x00000001) 내 메모리 뱅크에.

누군가 내 문제를 도와 줄 수 있기를 바랍니다. 고마워요!

+0

부동 소수점을 정수로 변환해도 비트가 재 해석되지 않습니다. 가치 전환을합니다. – StoryTeller

+0

나는 추측하고있다. 실제로 플로트를 변환하려고 시도한 방법을 보여주지 않았기 때문입니다. 왜 나를 넘어서는 코드가 아닌 * 작동하는 코드를 보여주고 있습니까? – StoryTeller

+0

그 차이점은 무엇입니까? 나는 문제를 이해하지 못한다 ... 메모리 뱅크를 조사 할 때, 저장된 값은 1.40129846e-45 (DEN) (HEX : 0x00000001) – Pana

답변

2

당신이 부호없는 정수는 일반적으로 트랩 값을 가지고 있지 않기 때문에 sizeof(float) == sizeof(uint32_t)1

float f = /* some_val */; 
uint32_t fbits = 0; 
memcpy(&fbits, &f, sizeof fbits); 

은 충분히 안전해야한다고 알고있는 경우에, memcpy을 사용하는 것입니다 비트를 재 해석하는 가장 간단한 방법.

컴파일러가 C99 이상을 지원하는 경우. 또한 유니온 (union)을 통해 타이핑 할 수도 있습니다.

union { 
    float from; 
    uint32_t to; 
} pun = { .from = /*some val*/ }; 

// use pun.to 

은 위의 사실은 아무것도 복사하지 않기 때문에 소폭 빠른 꽉 루프에서 할 수있다. (그리고 Olaf가 지적한대로 이것은 현대적인 표준 준수 방법입니다).


1 : 컴파일러가 지원하는 경우, 당신은 아마 _Static_assert 거기에해야한다.

+0

@ StorryTeller 작동합니다! 나는 문제를 해결하기 위해 위의 방법을 사용했다. ** 감사합니다 !! ** – Pana

+0

'합집합'만이 유일한 준수 방법입니다. – Olaf

+0

@Olaf - memcpy/memove가 C99 이전의 객체의 유효 유형을 변경하는 유일한 방법이 아닙니까? 나는 그것이 일반적으로 한 일이기 때문에 묻고있다. – StoryTeller