大小端、float与0作比较、IIC互斥、printf

xiaoxiao2021-02-28  8

1 大小端

大端模式(Big Endian):数据的高字节,保存在内存的低地址中;数据的低字节,保存在内存的高地址中。

小端模式(Little Endian):数据的高字节,保存在内存的高地址中;数据的低字节,保存在内存的低地址中。

例如:

16位宽的数0x1234,在不同的模式下,存储方式为:

 0x40000x4001小端模式0x340x12大端模式0x120x34

32位宽的数0x12345678,在不同的模式下,存储方式为:

 0x40000x40010x40020x4003小端模式0x780x560x340x12大端模式0x120x340x560x78

2 四舍五入+float与0作比较

对一个float的数进行四舍五入,返回一个int类型的值

1 float不能直接与0作比较,要与一个无限接近0的float型进行比较,如下面代码中的float变量EPSINON

2 正数和负数的四舍五入方法不同

static int16_t temp_mv_to_deg_c(uint32_t value_mv) { float temp_sample = 0; const float EPSINON = 0.00001; temp_sample = (RESISTENCEUP * 1.0) / RESISTENCENORMAL; //R/R0 ... ... ... ... int16_t camera_temp; if (temp_sample > EPSINON){ camera_temp = (int)(temp_sample+0.5); //正数四舍五入 } else if (temp_sample < EPSINON){ camera_temp = (int)(temp_sample-0.5); //负数四舍五入 } else { camera_temp = 0; } return camera_temp; }

3 IIC互斥

当不同的线程需要用到同一路IIC去进行数据的读写时,需要进行IIC的保护

在用之前需要去获取IIC的使用权,获取到之后再进行相应的IIC读写操作,操作完后再释放IIC,以供其他线程再去使用

4 printf

printf不能随便用,尤其用在周期性比较短的执行函数中,printf是阻塞性的执行,是先执行完printf再将打印内容传给串口,然后再执行其他的,如果本身函数执行周期较短,则可能导致后面的函数还没执行就又到了下一个周期,导致程序卡死,尽量使用系统中自带的log输出函数,是将log copy到队列中,然后等队列满了再一起输出,而不是抢占性的输出,这样不会抢占别的函数的执行。  

转载请注明原文地址: https://www.6miu.com/read-2150171.html

最新回复(0)