STM32单片机中C语言的一些隐藏bug
必须类型一致的判断才能正常
double a=-0.4;
if(a < -0.2){print("低电平");
}
这段代码可能未必如你所愿的运行. < 小于号的判断一定要类型一致, 尤其是牵扯到双精度类型的判断… 一定要保证符号 两边的数据类型一致才有可能得到你想要的结果. 代码里 -0.4 默认可能是float类型. 有的编译器默认是double类型. 一定要测试过才行.
不要使用 malloc函数获取内存
float* aa= (float*)malloc(1000 * sizeof(float));
float* bb= (float*)malloc(1000 * sizeof(float));
float* cc= (float*)malloc(1000 * sizeof(float));for (i = 0; i < signal->size; i++)
{ sindata[i] = sin(aa[i]);cosdata[i] = cos(aa[i]); printf("%d at Phase %f sin is %f, cos is %f \r\n",i,referencePhase, referenceSin[i] , referenceCos[i] );
}
如果是这样的代码, 在PC上基本上是不会出什么问题, 如果是在STM32单片机上. 这么写估计会跑出来一大堆的问题.
为了这个问题我调试了大半天. 最终的原因在 动态分配内存 malloc() 函数上, 不一定能正确获得存储空间.
期初以为是float的精度不一致的问题, 逐行 printf 对比后才发现. 是malloc() 的问题.
改成
float aa[1000]= {0};
float bb[1000]= {0};
float cc[1000]= {0};for (i = 0; i < signal->size; i++)
{ sindata[i] = sin(aa[i]);cosdata[i] = cos(aa[i]); printf("%d at Phase %f sin is %f, cos is %f \r\n",i,referencePhase, referenceSin[i] , referenceCos[i] );
}
把存储数据的变量改成全局静态的. 基本上不会出错.
不要在函数中初始化变量,尤其是大的数组变量.
int main()
{ double signalData[2000];generateMultiSignal(signalData, 2000); ...
}
这段代码中signalData 犯了2个错误,
1.在main函数中定义,
2.这里只是声明一个数组变量, 并非是初始化一个数组变量.
改成下面这么写就没问题了.
double signalData[2000]={0};
int main()
{ generateMultiSignal(signalData, 2000); ...
}
强制类型转换会丢失一个数值
float anglea = 6.2900;
int indexb = (int)(anglea * 100);
printf("indexbbb: %d, angle: %f\n", indexb, anglea);
理论上应该得到的是
indexbbb: 629, angle: 6.2900
但实际上得到的是
indexbbb: 628, angle: 6.2900
比实际值少了一个1?
float anglea = 6.29000001;
int indexb = (int)(anglea * 100);
printf("indexbbb: %d, angle: %f\n", indexb, anglea);
这样输出的值就是正常的. 具体原因不知.
开启DSP加速. 引用的lib库文件一定要正确.
引用 arm_cortexM4l_math.lib 时
arm_sin_f32(123456)
输出123456
正确的lib库应该是用 lf 的浮点库.
arm_cortexM4lf_math.lib
害我找了1天的bug啊…
另外如何开启DSP加速, 请参考下面的几篇文章
https://blog.csdn.net/WandZ123/article/details/125593908
https://zhuanlan.zhihu.com/p/462911261
https://blog.csdn.net/m0_74923693/article/details/136857288
printf 必须数据格式一致
double age =18.0;
printf("age %f \r\n", age);
这会输出
age 0.00
正确代码如下
double age =18.0;
printf("age %f \r\n", (float)age);
相关文章:
STM32单片机中C语言的一些隐藏bug
必须类型一致的判断才能正常 double a-0.4; if(a < -0.2){print("低电平"); }这段代码可能未必如你所愿的运行. < 小于号的判断一定要类型一致, 尤其是牵扯到双精度类型的判断… 一定要保证符号 两边的数据类型一致才有可能得到你想要的结果. 代码里 -0.4 默认…...
车载测试到底怎么样?真实揭秘!
什么是车载智能系统测试? 车载智能系统,是汽车智能化重要的组成部分,由旧有的车载资通讯系统结合联网汽车技术所演进而来,随着软硬件技术的不断进步, 让车载智能系统拥有强大的运算能力及多元化的应用功能。 车载智能…...
RustGUI学习(iced)之小部件(八):如何使用svg部件显示矢量图形?
前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第八篇,主要讲述svg矢量图形部件的使用,会结合实…...
gitlab设置保护分支
gitlab设置保护分支方法 进入代码仓库首页,找到settings下的repository并点击进入 找到Protected Branches 下的Exoand按钮,并点击展开 可以看到已经存在默认的保护分支,通常是master/main分支,也可以添加新的保护分支 新建保护分…...
五月加仓比特币
作者:Arthur Hayes Co-Founder of 100x. 编译:Liam 编者注:本文略有删减 (以下内容仅代表作者个人观点,不应作为投资决策的依据,也不应被视为参与投资交易的建议或意见)。 从四月中旬到现在,当你…...
为什么需要归档和管理合同
归档和管理合同是非常重要的,主要有以下几个原因: 1. 法律合规性:公司需要遵守法律和监管要求,合同是法律文件,涉及公司的权益和责任。归档和管理合同可以确保公司遵守法律法规,合同的内容和执行过程都符合…...
什么是DMA? STM32如何配置DMA?
您好,我们一些喜欢嵌入式的朋友一起建立的一个技术交流平台,本着大家一起互相学习的心态而建立,不太成熟,希望志同道合的朋友一起来,抱歉打扰您了QQ群372991598 一、DMA简介 1、DMA简介 DMA(Direct Memory Access&a…...
交友软件源码-源码+搭建+售后,上线即可运营聊天交友源码 专业语聊交友app开发+源码搭建-快速上线
交友小程序源码是一种可以帮助开发者快速搭建交友类小程序的代码模板。它通常包括用户注册、登录、个人信息编辑、匹配推荐、好友聊天等常见功能,以及与后台数据交互的接口。使用这种源码可以极大地缩短开发时间,同时也可以根据自己的需求进行二次开发和…...
c++多线程2小时速成
简介 c多线程基础需要掌握这三个标准库的使用:std::thread,std::mutex, andstd::async。 1. Hello, world #include <iostream> #include <thread>void hello() { std::cout << "Hello Concurrent World!\n"; }int main() {std::th…...
大模型日报2024-05-09
大模型日报 2024-05-09 大模型资讯 NVIDIA推出VILA视觉语言模型,开启边缘AI 2.0时代 摘要: NVIDIA最新推出的VILA家族视觉语言模型代表了边缘AI 2.0的到来。这些模型具备高级视觉推理能力,能够在低功耗的边缘设备上运行,为各种应用带来更智能…...
QGraphicsView实现简易地图11『指定层级-定位坐标』
前文链接:QGraphicsView实现简易地图10『自适应窗口大小』 提供一个地图初始化函数,指定地图显示的中心点和地图缩放层级 能够让地图显示某一层级的瓦片,并将中心点坐标显示在视图中心。 1、动态演示效果 7级地图-大连-老虎滩 定位到 8级地图…...
UE5 蓝图入门
基础节点创建: 常量: 按住 1 ,点击鼠标左键,创建常量 二维向量: 按住 2 ,点击鼠标左键,创建二维向量 三维向量: 按住 3 ,点击鼠标左键 乘法: 按住 m 键…...
英语单词学习
house of worship:宗教场所 dote: 喜爱 coffin:棺材 coffeine:咖啡因 expedient:权宜的 buster:破坏者 procrastinate: 拖延 gourmet:美食家 expound:阐述 narcissist:自我陶醉 assassinate:暗杀 salvage: 挽救 savage: 凶猛的 ulcer: 溃疡 obituary:讣告 arbitrary:武断的 abu…...
使用Python编写自动化测试代码规范整理
大家好,我们平时在写自动化测试脚本或者性能测试脚本时,需要注意代码规范,提高代码的可读性与维护性,之前给大家分享过pycharm的两个插件,大家可以参考:Pycharm代码规范与代码格式化插件安装 本文中主要从自…...
实验七 SJK数据库定义与操纵
实验题目 实验七 SJK数据库定义与操纵 实验时间 2023.5.17 实验地点 软件工程基础实验室 实验课时 2 实验目的 了解并掌握数据库定义与操纵的知识并能熟练应用 实验要求 熟练掌握和使用PL-SQL建立数据库基本表,使用PL/SQL developer操作数据库&a…...
Win10环境下yolov8快速配置与测试-详细
0.0 说明 参考黄家驹的Win10 环境下YOLO V8部署,遇到一些问题,并解决实现,记录如下: 斜线字体是原博客中的创作 0.1 参考链接 https://blog.csdn.net/m0_72734364/article/details/128865904 1 Windows10下yolov8 tensorrt模型加速部署 …...
C++面向对象学习笔记一
本文阅读下述文章,顺手记录学习《C面向对象程序设计》✍千处细节、万字总结(建议收藏)_c面向对象程序设计千处细节-CSDN博客 目录 前言 正文 浅拷贝和深拷贝 向函数传递对象 静态数据成员和静态成员函数 友元 友元函数 1、将非成员函数声明…...
C++容器之vector类
目录 1.vector的介绍及使用1.1vector的介绍1.2vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.4 vector 增删查改1.2.5vector 迭代器失效问题1.2.6 vector 在OJ中的使用。 2.vector深度剖析及模拟实现2.1 std::vector的核心框架接口…...
什么是MVCC?
MVCC是一种数据库的并发控制策略,就是为了解决多个用户同时访问数据库修改同一数据所造成的问题,如何解决这个问题了? 就是通过创建同一个数据的不同的版本,通过创建时间的不同,最后进行数据合并,其就不用给数据库上锁了,其实数据库的锁,虽然说InnoDB已经非常牛逼了,可以使用行…...
数据结构队列学习
引入 众说周知,在队列的题目中,队头指针(front)和队尾指针(rear)有两种指示方法。 (1)队头指针 ①指向队头元素 ②指向队头元素元素的前一个位置 (2)队尾指针 ①指向队尾元素 ②指向队尾元素的后一个位置 指…...
Javaweb第五次作业
poet数据库sql语言 create table poet(id int unsigned primary key auto_increment comment ID,name varchar(10) not null comment 姓名,gender tinyint unsigned not null comment 性别, 说明: 1 男, 2 女,dynasty varchar(10) not null comment朝代,title varchar(20) not…...
BetterMouse for Mac激活版:鼠标增强软件
BetterMouse for Mac是一款鼠标增强软件,旨在取代笨重的、侵入性的和耗费资源的鼠标驱动程序,如罗技选项。它功能丰富,重量轻,效率优化,而且完全隐私安全,试图满足你在MacOS上使用第三方鼠标的所有需求。 B…...
红米1s 刷入魔趣 (Mokee)ROM(Android 7.1)
目录 背景准备工具硬件(自己准备)软件(我会在文末提供链接) 刷机步骤1. 重启电脑2. 安装驱动3. 刷入TWRP4. 清空数据5. 刷入魔趣6. 开机 结尾下载链接 本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 B…...
MySQL中的事务隔离级别
事务隔离级别 未提交读(Read uncommitted)是最低的隔离级别。通过名字我们就可以知道,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。提交读(Read committed)也可以翻译成读已提交…...
多线程应用实战
文章目录 1、如何实现多线程交替打印字母和数字,打印效果:A1B2C3D4...AutomicBlockingQueueReentrantLockLockSupportSynchronizedWaitNotifyTransferQueueWay 2、实现多个线程顺序打印abc3、实现阻塞队列 1、如何实现多线程交替打印字母和数字ÿ…...
selenium解放双手--记某电力学校的刷课脚本
免责声明:本文仅做技术交流与学习... 重难点: 1-对目标网站的html框架具有很好的了解,定位元素,精准打击. 2-自动化过程中窗口操作的转换. 前置知识: python--selenium模块的操作使用 前端的html代码 验证码自动化操作 Chrome & Chromedriver : Chrome for Testing ava…...
JDK 17有可能代替 JDK 8 吗
不好说,去 Oracle 化是很多公司逐步推进的政策。 JVM 有 OpenJ9。很多公司可能会用 IBM 的版本。 JDK 这东西,能用就不会升级。 JDK 太基础了,决定了后面的很多 jar 的版本。 https://www.ossez.com/t/jdk-17-jdk-8/14102...
代码随想录算法训练营第36期DAY23
DAY23 530二叉搜索树的最小绝对差 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(null…...
Leetcode 3128. Right Triangles
Leetcode 3128. Right Triangles 1. 解题思路2. 代码实现 题目链接:3128. Right Triangles 1. 解题思路 这一题的话对于任意一个位置,如果该位置为1,假设其所在行中1的个数 r i r_i ri,所在列中1的个数为 c j c_j cj&#…...
力扣经典150题第五十三题:基本计算器
目录 力扣经典150题第五十六题:基本计算器示例提示解题思路 力扣经典150题第五十六题:基本计算器 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数…...
cmsinitiatingoccupancyfraction/青岛关键词优化报价
来自:腾讯科技地址:https://view.inews.qq.com/a/TEC2017051300582404 这种勒索病毒名为WannaCry ,图中是安全研究人员的安全的计算机环境中进行演示。 腾讯科技讯 5月13日,据BBC等媒体报道,全球多国爆发电脑勒索病毒&…...
网站排队队列怎么做/百度app下载官方
分享一个换肤解决方案参考文章: (1)分享一个换肤解决方案 (2)https://www.cnblogs.com/xie-zhonglai/p/skins.html 备忘一下。...
团购网站建设方案/滕州网站建设优化
这几天在慢慢的巩固android基础方面的知识,对activity的生命周期和appliaction总是有点晕,所以特别做了点思考。 1 首先附一张activity的生命周期图 比较形象的说明了activity启动的时候所调用的方法,但当activity被不同的方式结束时…...
外贸商城网站制作公司/百度新闻发布平台
最近项目开发中用到了android:launchMode"singleTask" 和 onNewIntent(Intent intent)两个特性,现总结一下经验: android:launchMode"singleTask" 配置在 Mainifest 中,它保证了栈中此Activity总是只有一个,无…...
漳州网站建设公司首选公司/服务器
1,计分板(scoreboard) 记分板用来动态预测设计的响应,施加给DUT的激励同时施加给记分板,记分板中的转换函数把输入的激励全部转换成最后响应的形式,并保存在数据结构中,以传递给检查器,记分板还…...
国内有做外汇的正规网站吗/廊坊seo网站管理
一,原因1,没有响应到css等文件2,响应类型是由文件的后缀名决定(1)html的请求头Content-Type : text/html ; charsetutf-8(2) CSS的请求头content-type:text/css; charsetutf-8(3)JavaScript的请求头content-type:text/javascrpt; charsetutf-…...