1. 程式人生 > >將float型別資料寫入暫存器中

將float型別資料寫入暫存器中

在FreeBSD中針對暫存器在特殊情況下可能需要寫入float型別的值,具體實現步驟如下:

//變數

typedef struct{
float   under_limit;        
float   over_limit; 
}VFEPIO_SetRawLimit_t;

typedef struct{
VFEPIO_ReqHeader_t  header;
union{
VFEPIO_SetRawLimit_t    raw_limit;
}param;
}VFEPIO_Request_t;

VFEPIO_Request_t  VFEPIO_Request;
VFEPIO_SetRawLimit_t raw_limit;
float  under_limit;        
float  over_limit; 
uint32_t *piTemp1;
uint32_t *piTemp2;

//程式碼的實現

raw_limit = VFEPIO_Request->param.raw_limit;
under_limit = raw_limit.under_limit ;        
over_limit = raw_limit.over_limit; 
piTemp1 = (uint32_t *)(&under_limit);
piTemp2 = (uint32_t *)(&over_limit);

pci_write_bar1(sc, UNDERFLOW_LIMIT_ADDR, *piTemp1);
pci_write_bar1(sc, OVERFLOW_LIMIT_ADDR, *piTemp2);



◆在C語言中也是可以證明這點的,具體實現如下

#include <stdio.h>
#include <stdlib.h> 


int main()
{
float a = 1.23;
float b = 0.00;
float *d = 0;
int c = 0x00;

int *ptr ;

ptr = (int *)&a;

c = *ptr;

// printf("c = %x!\r\n", c);
d = (float *)&c;
b = *d;
printf("b = %0.2f!\r\n", b);
return 0;

}

結果如下:

  • 在C#中可以編輯為如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Float2Byte
{
    class Program
    {
        static void Main(string[] args)
        {
            float f = -0.6f;
            byte[] b = BitConverter.GetBytes(f);
            Console.WriteLine(BitConverter.ToString(b));

            float f3 = (float)(0.6);
            byte[] b4 = BitConverter.GetBytes(f3);
            Console.WriteLine(BitConverter.ToString(b4));

            float f2 = 120.5f;
            byte[] b2 = BitConverter.GetBytes(f2);
            Console.WriteLine(BitConverter.ToString(b2));


            float ff2 = 10.0f;
            byte[] b3 = BitConverter.GetBytes(ff2);
            Console.WriteLine(BitConverter.ToString(b3));
           

            byte[] bb = { 0x00, 0x00, 0x20, 0x41 };
            Console.WriteLine("\n" + BitConverter.ToSingle(bb, 0));
        }
    }
}
 

  • 如果上下層需要通過byte陣列進行float資料的互動

       (1)如下是底層傳到上層的處理,在底層的程式碼如下:

                   float highlimitvalue;
                   int32_t highlimitvalueTemp;

                    if (exmodthresholdlimitack.highlimit[1] == 0x80)
                    {
                        highlimitvalue = 0.0 - (exmodthresholdlimitack.highlimit[0] / 100.0);
                    }
                    else
                    {
                        highlimitvalue = (exmodthresholdlimitack.highlimit[0] / 100.0);
                    }
                                                  
                    IIC_Status_Ret = 0x00;
                    IIC_Status_Ret = 0x00 | DVMOD_Status | exmodthresholdlimitack.err1;   //DvmodExmodErr | ExmodScontErr 
                                      
                    highlimitvalueTemp = *((int32_t *)(&highlimitvalue));  
                    
                    output->Data[0] = (uint8_t)( ( highlimitvalueTemp >> 0) & 0xff );
                    output->Data[1] = (uint8_t)( ( highlimitvalueTemp >> 8) & 0xff );
                    output->Data[2] = (uint8_t)( ( highlimitvalueTemp >> 16) & 0xff );
                    output->Data[3] = (uint8_t)( ( highlimitvalueTemp >> 24) & 0xff );     

                  在上層的程式碼如下:

                    highlimit = BitConverter.ToSingle(getthresholdlimitack.highthreshold, 0);
                    highlimit = (short)(highlimit * 100) / 100.0;
       

          (2)如下是上層傳到底層的處理,在上層的程式碼如下:

                  byte[] ByteThresholdlow = new byte[4];
                  byte[] ByteThresholdup = new byte[4];
                  ByteThresholdlow = BitConverter.GetBytes((float)Thresholdlow[exmodid, scontid]);
                  ByteThresholdup = BitConverter.GetBytes((float)Thresholdup[exmodid, scontid]);

                 在底層接收的操作處理程式碼如下:

                      uint8_t HighThresholdLimit[4];
                      uint8_t *pucTemp1;
                      float HighThresholdLimitValue;

                      HighThresholdLimit[0] = input->RcvData[7]; 
                      HighThresholdLimit[1] = input->RcvData[8]; 
                      HighThresholdLimit[2] = input->RcvData[9]; 
                      HighThresholdLimit[3] = input->RcvData[10]; 
                      
                      
                      pucTemp1 = (uint8_t*)&HighThresholdLimitValue;
                      
                      pucTemp1[0] = HighThresholdLimit[0];
                      pucTemp1[1] = HighThresholdLimit[1];
                      pucTemp1[2] = HighThresholdLimit[2];
                      pucTemp1[3] = HighThresholdLimit[3];
                    
                      if (HighThresholdLimitValue < 0)
                      {
                          exmodsetthresholdcmd.highlimit[1] = 0x80;
                      }
                      else
                      {
                          exmodsetthresholdcmd.highlimit[1] = 0x00;
                      }
                      exmodsetthresholdcmd.highlimit[0] = (uint8_t)(fabs(HighThresholdLimitValue) * 100);