2017-01-15 10 views
1

Я хочу сохранить некоторые данные с плавающей запятой в регистре FRAM моего микроконтроллера TI MSP430 и получить некоторые пролемы.Сохранить значение float в указателе 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, но никакого результата.

Это мой поплавок данные:

float value = 1.25; 
    uint32_t framPtr = 0xD000; 

С помощью этой функции она не работает:

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

Это сохранены данные 1.40129846e-45 (DEN) (HEX: 0x00000001) в моей памяти.

Я надеюсь, что кто-то может помочь мне с моей проблемой. Спасибо!

+0

Приведение float в целое число не переинтерпретирует биты, если это то, что вам нужно. Он преобразует ценность. – StoryTeller

+0

Я угадываю. Потому что вы не показывали, как вы пытаетесь фактически преобразовать float. Почему вы показываете код, который * работает * вместо кода, который не находится за пределами меня. – StoryTeller

+0

В чем разница? Я не понимаю проблему ... Когда я заглядываю в банк памяти, я вижу, что сохраненное значение равно 1.40129846e-45 (DEN) (HEX: 0x00000001) – Pana

ответ

2

Самый простой подход переосмысливать биты будет использовать memcpy, если вы знаете, что sizeof(float) == sizeof(uint32_t)

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

Должно быть достаточно безопасным, так как целые числа без знака обычно не имеют значения ловушки.

Если ваш компилятор поддерживает C99 и далее. Вы также можете выполнять тип punning через объединение.

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

// use pun.to 

Вышеупомянутое не копирует ничего, поэтому может быть немного быстрее в узкой петле. (И как Olaf указывает, это стандарт совместимый способ для современного C).


: Если ваш компилятор поддерживает его, вы должны, вероятно, _Static_assert на нем.

+0

@StorryTeller Он работает! Я использовал вышеупомянутый, чтобы решить проблему. ** Спасибо! ** – Pana

+0

«Союз» - единственный способ. – Olaf

+0

@Olaf - Не memcpy/memove - единственный способ изменить эффективный тип объекта в pre C99? Я спрашиваю, потому что это то, что я обычно видел. – StoryTeller