2017-01-15 30 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値を持ちます。関数内の値を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

浮動小数点数を整数にキャストしても、ビットが再解釈されません。それは価値の変換を行います。 – StoryTeller

+0

私は推測しています。フロートの実際の変換方法を示していないからです。なぜ私以外のコードではなく*働くコードを表示しているのですか? – StoryTeller

+0

違いは何ですか?私は問題を理解していません... メモリバンクを調べると、保存された値は1.40129846e-45(DEN)(HEX:0x00000001)です。 – Pana

答えて

2

最も簡単な方法は、あなたは符号なし整数は、通常のトラップ値を持っていないので、sizeof(float) == sizeof(uint32_t)

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

は、十分に安全でなければならないことがわかっている場合は、memcpyを使用することです。

コンパイラがC99以降をサポートしている場合。また、ユニオンを使用して型打を行うこともできます。

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

// use pun.to 

上記は実際には何もコピーしないため、タイトなループで少し速くなる可能性があります。 (Olafが指摘する通り、これはの現代的な標準準拠の方法です)。


:あなたのコンパイラがそれをサポートしている場合、あなたはおそらく_Static_assertそれにする必要があります。

+0

@ StorryTellerそれは動作します!私は問題を解決するために上記のものを使用しました。 **ありがとうございました!** – Pana

+0

'union'は唯一の準拠方法です。 – Olaf

+0

@Olaf - memcpy/memoveはプリC99でオブジェクトの有効なタイプを変更する唯一の方法ではありませんか?私はそれが私が通常見たことがあるので、尋ねています。 – StoryTeller

関連する問題