记忆:嵌入式中 float型数无法进行除法和if判断
来源:互联网 发布:域名备案被注销 编辑:程序博客网 时间:2024/06/06 00:12
最近使用K60遇到一个很奇怪的问题
用拉普兰德LPLD库的时候有一个函数:
<span style="font-size:24px;">__INLINE uint16 LPLD_FTM_GetCounter(FTM_Type *ftmx){ return ftmx->CNT; //获取FTMx计数器值}</span>
该函数返回值为uint16 即unsigned short int(16bits)
第一次用的时候没注意,定义了一个float型的Speed,使用正交解码直接获得该函数的返回值。
<span style="font-size:24px;">Speed = LPLD_FTM_GetCounter(FTM1);</span>
输出Speed随时间变化的波形竟然有正负之分,而且值随时间变化很正确。(这也是我现在无法理解的,求大神讲解。)
但是却出现了一个问题:使用if语句无法判断Speed大于小于0.
如:
<span style="font-size:24px;"> if(Speed_Out >= 5000) Speed_Out=5000; if(Speed_Out < -5000) Speed_Out=-5000;</span>
该语句执行完
之后Speed 大于0时 输出波形很正常,跟随程序运行;
但是当Speed低于0时,输出波形横为5000;
当我没发现这个函数返回值是uint16时,我监测Speed的输出波形,发现值很正常,然后两句简单的判断之后值就不正常了。
调bug调了两天两夜之后终于发现了,这个关于bit的小又大的bug。
于是 ,16bit和32bit之间的“爱情”打败了我这个第三者。
修正方式:
<span style="font-size:24px;">int16 g_nLeftMotorPulseSigma=0;int16 g_nRightMotorPulseSigma=0;</span>
<span style="font-size:24px;">nleft_pulse = LPLD_FTM_GetCounter(FTM1);//获取FTM1的正交解码计数值nright_pulse = LPLD_FTM_GetCounter(FTM2);LPLD_FTM_ClearCounter(FTM1);//清空计数器LPLD_FTM_ClearCounter(FTM2);</span>
<span style="font-size:24px;">Speed = (-g_nLeftMotorPulseSigma + g_nRightMotorPulseSigma)>>1;</span>
成功的将左轮和右轮的uint16返回值进行运算,得出了float型的32bit值的Speed。
并可进行以下运算。
<span style="font-size:24px;"> if(Speed >= 5000) Speed=5000; if(Speed < -5000) Speed=-5000;</span>
总结:当在嵌入式编程中,我们遇到float或者其他类型的值无法除法运算或者if判断的时候,我们应该深入研究所有用到它的地方,是不是哪里运算将32bit 16bit 8bit等值弄乱了。
0 0
- 记忆:嵌入式中 float型数无法进行除法和if判断
- c++ 中float除法
- shell中进行浮点数的除法
- JavaScript中对非Boolean型变量进行if判断
- mybatis中mapper进行if条件判断
- mybatis 中使用if else 进行判断
- 不用if 、for等判断语句和乘除法求1+2..+n的值 &&不用加减乘除求两个数的和
- angularJS 无法进行if-else 判断的替代思路
- 在if或while等判断语句中,前++和后++的进行探讨
- Excel中IF函数和AND函数结合使用进行多条件判断
- C语言中浮点数double/float相等判断
- jsp中if判断和遍历集合
- DEDE模板中如何使用if进行多分支判断
- 有两个变量a和b,不用“if”、“? :”、“switch”或其他判断语句,找出两个数中比较大的
- Java中浮点型数据Float和Double进行精确计算的问题
- 不用除法和求模运算,判断一个数能否被3整除
- Shell中if判断
- if判断和比较
- dede常用语法笔记
- UVA - 10404 Bachet's Game 博弈
- leetcode 日经贴,python code -Decode Ways
- C printf() 详解——printf('%08x',number); 程序员面试宝典中的一个错误 char * b=(char *)&a
- 一步一步学习ASP.NET 5 (五)- TypeScript
- 记忆:嵌入式中 float型数无法进行除法和if判断
- LUA学习(二)---基本语法
- 省赛选拔第六场
- Source Insight简单教程
- [Android开发]This class should be public (android.support.v7.internal.widget.ActionBarView.HomeView)
- 黑马程序员---java基础知识(七):集合框架
- MYSQL存储过程、游标和修改表字段优化方案
- 1. 程序员生存定律--前言:解码程序人生
- JAVA之翻转棋游戏