1

バッファに出力されるデータが間違った値になる問題をデバッグしています。u8カーネル ドライバーから HALにバッファー ( ) 型を送信しています。HAL には、Uint16このバッファーから値を受け取るバッファーがあります。

//Code to copy BUFFLEN contents from u8 data[BUFFLEN] into uint16_tData ;

uint16_t uint16_tData[BUFFLEN / 2];
float floatdata[BUFFLEN / 2];

uint16_tDataこの型キャストを使用して、バッファから float 値を取得しています。

floatdata[index] = (*((float *)((void *)&uint16_tData[index1];

ここで私の質問:floatdata配列にあるデータをどのように解釈できますか? データがあると言うfloatdata[0] = 53640;

このニブルから float データを解釈するにはどうすればよいですかfloatdata[0]

u8 からの 4 バイトに注意してください --> 配列 uint16_tData の 2 つの要素 --> 配列 floatdata の 1 つの要素。

私は次のような例で知りたかった:

ドライバーから送信される値は次のとおりです。

u8 val1 = 206
u8 val2 = 208
u8 val3 = 120
u8 val4 = 68

HAL では、変換はどのように行われ、ここでどのような値が取得されますか?

uint16_tData[0] = ?
uint16_tData[1] = ?

また、フロートとしてのデータの解釈はどのようになりますfloatdataか?

floatdata[0] = ?
4

4 に答える 4

1

なぜこれを行うのですか?

私はあなたがこれを望んでいると思います:

float *floatdata;

floatdata = (float *)uint16_tData;

// Now use floatdata[index] ...

一度に 1 つずつアイテムをキャストするのはばかげています。uint16_t から float へのキャストはさらにばかげています。それを uint8_t (バイト) として保持するか、少なくとも uint32_t を中間として使用することをお勧めします。

これを行うのを妨げるものはありますか? これらの問題を完全に回避できるように、コードを再設計する方法を考えられますか?

于 2013-10-29T07:25:18.067 に答える
1

uint16は 2 で「作られ」u8、単精度は 32 ビット (4 u8 または 2 uint16) ですが、それらがどのように「変換」されるかは、特に「送信」の意味floatで、それらのデータを処理するコードに依存します(カーネルから)ドライバー) と、「受信」するコードがデータを期待する方法。私はこのトピックについて無知であることを認め、今それを確認して調査することはできませんが、エンディアンに問題があると思われます。データには単一のオクテットとしてではなく、完全に「意味」がありますが、それらをメモリに入れます間違った順序。

基本的に、オクテクトを含むバッファーがあります。

A   B   C   D
u8  u8  u8  u8      4 u8 arr element (arr[0], arr[1] ...)
\____/  \____/  
 uint16   uint16    2 uint16 arr element (arr[0] and arr[1]) 

メモリアドレスの昇順で。「正しい」uint16数値として読み取られるようにする場合A Bは、プロセッサのエンディアンに一致するようにメモリ内で「ソート」する必要があります。たとえば、A*8 + BリトルエンディアンCPUで数値が必要な場合は、2つ書く必要がありますメモリ内の u8 を逆の順序で:

B A D C

HAL は uint16 をデータを格納するためだけに使用し、16 ビットの数値として解釈するためではないと思われるため、ここでのエンディアンは問題ではありません。しかし、メモリ内の 4 つの u8 (または 2 つの uint16) から正しい「float」を取得したい場合は、u8 を正しい順序で配置する必要があります。

u8 をキャストによって float として解釈する場合は、最初にリトルエンディアン マシンでそれらを逆の順序で配置する必要があります。

  address of arr8[0] and arr16[0]
/
D   C   B   A
u8  u8  u8  u8      4 u8 arr element (arr8[0], arr8[1] ...)
\____/  \____/  
 uint16   uint16    2 uint16 arr element (arr16[0] and arr16[1]) 

次に、リテ エンディアン マシンでこれらのオクテットを float として「読み取る」と、正しい「float」が得られます。

したがって、u8 が 1 オクテットよりも広い「幅」を持つ別のタイプとして解釈されることを知って、u8 を正しくソートするのはあなた次第です。移植可能なコードは、エンディアンが異なるプロセッサ用に正しくコンパイルするための適切な方法を使用する必要があります。

このウィキペディアの記事も参照してください

于 2013-10-29T08:36:05.050 に答える