在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语言中也是可以证明这点的,具体实现如下
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 <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;
}
结果如下: