MCU做死循环时,到底应该用for(;;) 还是wihile(1)

MCU做死循环时 for while

  • stm32中老工程师用for
  • for while背景
    • for版本
    • while版本
    • 正方观点:哪有好的编译器:
    • 反方观点:这种代码过时了
    • 工程师实地测试:和编译器和优化有关
  • 建议还是用for
  • 参考

stm32中老工程师用for

    /* Start scheduler */vTaskStartScheduler();/*Taken by the scheduler */for (;;);

for while背景

一位工程师发现,国外工程师在给demo在做死循环时用的是for(;😉,而不是常用的while(1)。这仅仅是个人习惯的问题,还是有更深层次的含义?

大部分网友认为二者并没有什么区别,很多时候,只是心理作用,国外工程师认为while需要经过判断括号里的表达式是否非0才跳转。但经过编译器的精心优化以后,while(1)也会被优化成无条件跳转(jmp指令),所以跟for(;;)没什么区别。

有人表示,for(;;)在英语母语者那里很容易跟forever挂钩。
网友解析,也很有可能是习惯问题,其实while(1),还是for(;;)两个语法上有啥区别,那就是for(;😉 明确就是循环,等价于goto一直跳,没有比较条件。
while不编译支持优化的前提下都需要做cmp运算设置寄存器ZF,才能jne,je指令条件跳转。而for(;;)就是明确的jmp无条件转移eip,没有jne,je条件跳转。

不过其实无所谓的,这根本不能提高任何一点代码执行的性能。因为现代编译器大多优化以后跟for(;;)的结果没得什么区别。

其实你所考虑到的一切优化手段,编译器都能帮你完成,因为编译器(尤其是开源的GCC和LLVM)是由来自全球各地的程序员共同研发并改进的,它们的优化能力远远强于你手动改进代码。

也有网友“Shuax”使用mingw编译,实地测试一番:

for版本

#include<stdio.h>
int main()
{for(;;){printf("for\n");}
}

生成汇编:
在这里插入图片描述

while版本

#include<stdio.h>
int main()
{while(1){printf("while\n");}
}

生成汇编:
在这里插入图片描述
你会发现,除了文件名不同,其余都相同。
当然,这里额外说一下,不同代码、不同编译器,以及不同优化等级,可能最终结果有所差异。

正方观点:哪有好的编译器:

不过,有人跳出来反驳,现代编译器的确优化很好,二者运行起来没啥区别,但是实际在嵌入式工作中,尤其是MCU编程中,可没有那么好的编译器。
一位工程师表示,很多嵌入式设备只有专用的编译器,而过去这些编译器,尤其是嵌入式编译器没做好优化的情况下,while(1)要比for(;;)多几个语句。
因为while里面是判断啊,就会变成:


label:    
……    
mov a, #1    
jnz label

这种情况而for(;;)的话一般只会是jmp label。
许多人也有类似的经历,并表示,有些私有编译器连 (int)a<<0 这种都能生成非法指令,不由地怀疑配套的破芯片到底能不能受得了各种优化过的指令。

反方观点:这种代码过时了

也有工程师呼吁,不要学习这种编码风格,现在已经是2024年了,用for(;;)表示无限循环已是一种过时的风格了。
从施特劳斯特撸普博士到我国国家军用标准,均认为 for(;😉 是一种不良风格,可参见:

  • GJB 8114-2013 R-1-9-4:无限循环必须使用while(1)语句,禁止使用for(;;)等其他形式
  • CppCoreGuidelines ES.73:Prefer a while-statement to a for-statement when there is no obvious loop variable
  • 360 safe rules: for语句没有明确的循环变量时应改用while句语

这是为什么呢?在较为严格的规范体系内,for 语句专用于实现具有明确循环次数和循环变量的迭代算法,小括号内的三个表达式应分别专注于循环变量的初始化、循环条件的判断、循环变量的增减,这样可以使循环具有清晰的静态结构,便于阅读,利于维护。如果没有明确的循环变量,则应改用 while 循环,避免对代码的维护者造成误导。

有人说for(;;)表示无条件循环,while(1)需要作条件判断,效率比for(;;)慢,有一定道理,但那都是很早以前的事情了,现在即使没有编译器优化,这种开销也不会成为效率的瓶颈,是不值得优化的,保持代码清晰的静态结构更为重要!

工程师实地测试:和编译器和优化有关

公众号博主“WKJay”也在STM32F103、ARMCC5进行过测试,将两个逻辑分别运行一下(不开编译器优化),查看逻辑分析仪输出的结果。
while(1) 逻辑运行结果:
在这里插入图片描述
for(;😉 逻辑运行结果:
在这里插入图片描述
结果显示,虽然循环体完全相同,但实际运行结果来看,for(;😉 语句执行得更快(45.863ms),比 while(1)(48.643ms) 快了5.7%左右。

根据他的分析,for的指令更精简,而while的指令相对更繁琐,简而言之,for抄了近道,而while弯弯绕绕。
在这里插入图片描述
最后,他开启了编译器的O3优化,结果,二者就几乎不存在差别了(12.505ms):
在这里插入图片描述
从可读性角度来说,while(1)简单清晰,for(;;)就模糊多了。不过,对于一些比较老的专用编译器来说,可能就需要慎重考虑使用哪种形式。
对现代编译器来说,二者完全就是一回事,更何况,高主频的芯片不在乎一两条机器指令了,所以这种情况下,怎么顺眼就怎么写。

建议还是用for

用for不用考虑编译器优化问题

参考

  • MCU做死循环时,到底应该用for(;😉 还是wihile(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3017043.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

数据库系统理论——绪论

文章目录 前言一、数据库四个基本概念1、数据2、数据库3、数据库管理系统&#xff08;DBMS&#xff09;4、数据库系统&#xff08;DBS&#xff09; 二、数据模型1、概念数据模型2、逻辑数据模型3、物理数据模型 三、三级模式1、图片解析2、二级映像 前言 最近很长时间没更新学…

windows 双网卡同时接入内外网

在公司使用wifi接入使用桌面云&#xff0c;但是公司wifi不能上外网&#xff0c;查资料不方便&#xff0c;通过手机同时接入外网。 同一台电脑设置同时连接内外网&#xff08;wifi或共享的网络&#xff09;_win7电脑同时使用手机和usb网卡使用wifi-CSDN博客 route print查看当前…

开启智能新纪元:揭秘现代化仓储物流园区的数字孪生魅力

在数字化浪潮的推动下&#xff0c;物流行业正迎来前所未有的变革&#xff0c;现代化仓储物流园区数字孪生系统正以其独特的魅力引领着物流行业迈向更加智能、高效的新时代。 图源&#xff1a;山海鲸可视化 一、数字孪生&#xff1a;物流行业的“虚拟镜像” 数字孪生技术作为工…

5.合并两个有序数组

文章目录 题目简介题目解答解法一 &#xff1a;合并后排序解法二&#xff1a;双指针排序 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 合并两个有序数组 相关的讲解&#xff01;&#x1f600; 题目简介 题目解答 解法一 &#xff1a;合并后排序 假设我们要合…

科研学习|可视化——ggplot2版本的网络可视化

ggplot2是R语言中一个非常流行的数据可视化包&#xff0c;它也可以用于网络可视化。以下是三个基于ggplot2并专门用于网络可视化的R包&#xff1a; ggnet2: 这个包的使用方法与传统的plot函数相似&#xff0c;易于使用。更多信息可在其官方页面查看&#xff1a;ggnet2 geomnet…

【Linux网络】PXE批量网络装机

目录 一、系统装机 1.1 三种引导方式 1.2 系统安装过程 1.3 四大重要文件 二、PXE 2.1 PXE实现原理 2.2 PXE手动搭建过程 2.3 kickstart配合pxe完成批量自动安装 一、系统装机 1.1 三种引导方式 硬盘光驱(U盘)网络启动 1.2 系统安装过程 加载boot loader加载启动安…

《安富莱嵌入式周报》第336期:开源计算器,交流欧姆表,高性能开源BLDC控制器,Matlab2024a,操作系统漏洞排名,微软开源MS-DOS V4.0

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 本周更新一期视频教程&#xff1a; BSP视频教程第30期&#xff1a;UDS ISO14229统一诊断服务CAN总线专题&#xff0c;常…

学习和分析各种数据结构所要掌握的一个重要知识——CPU的缓存利用率(命中率)

什么是CPU缓存利用率&#xff08;命中率&#xff09;&#xff0c;我们首先要把内存搞清楚。 硬盘是什么&#xff0c;内存是什么&#xff0c;高速缓存是什么&#xff0c;寄存器又是什么&#xff1f; 我们要储存数据就要运用到上面的东西。首先里面的硬盘是可以无电存储的&#…

记一次DNS故障导致用户无法充值的问题(上)

背景&#xff1a; 刚刚过去了五一劳动节&#xff0c;回来后一上班接到客服运营团队反馈的节日期间的问题&#xff0c;反馈有部分用户无法充值。拿到的反馈资料有&#xff1a; 无法充值操作视频、问题时间、手机机型、手机网络情况。 1、从视频中看到用户点击支付后没有任何反…

[CISCN2019 华北赛区 Day1 Web2]ikun

看到提示说一定要找到lv6 这要写脚本来爆破了&#xff0c;用bp是爆破不出来的 发现LV等级都是有参数挂着的 写个脚本看一下 import requests for i in range(1,1000):payload"http://node4.anna.nssctf.cn:28150/shop?page%d"%(i)resrequests.get(payload)if "…

怎么ai解答问题?这三个方法都可以

怎么ai解答问题&#xff1f;在数字化飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到我们生活的方方面面&#xff0c;尤其是在解答问题方面&#xff0c;AI展现出了令人瞩目的能力。那么&#xff0c;哪些软件可以利用AI技术解答问题呢&#xff1f;…

【西瓜书机器学习】第五章 神经网络

一起啃西瓜书(5)-神经网络《机器学习-周志华》 - 知乎 (zhihu.com)参考进行自我复习整理&#xff0c;侵删&#xff01; 1、神经元模型 神经网络定义&#xff1a;神经网络是由 具有适应性 的 简单单元 组成的广泛 并行互连 的网络。M-P神经元模型&#xff1a;输入、处理、输出 …

酸奶(科普)

酸奶&#xff08;yogurt&#xff09;是一种酸甜口味的牛奶饮品&#xff0c;是以牛奶为原料&#xff0c;经过巴氏杀菌后再向牛奶中添加有益菌&#xff08;发酵剂&#xff09;&#xff0c;经发酵后&#xff0c;再冷却灌装的一种牛奶制品。市场上酸奶制品多以凝固型、搅拌型和添加…

武汉星起航:策略升级,亚马逊平台销售额持续增长显实力

武汉星起航电子商务有限公司&#xff0c;一家致力于跨境电商领域的企业&#xff0c;于2023年10月30日在上海股权托管交易中心成功挂牌展示&#xff0c;这一里程碑事件标志着公司正式踏入资本市场&#xff0c;开启了新的发展篇章。公司董事长张振邦在接受【第一财经】采访时表示…

ROS机器人实用技术与常见问题解决

问题速查手册&#xff08;时实更新&#xff09;更加全面丰富的问题手册记录 1.机器人使用GPARTED挂载未分配空间 需要在图型界面下操作&#xff0c;建议使用no machine连接 安装gparted磁盘分区工具, sudo apt-get install gparted -y 启动软件 sudo gparted 点击磁盘/内存…

【C语言】动态分配内存

内存的五大分区 1、堆区&#xff08;heap&#xff09;——由程序员分配和释放&#xff0c; 若程序员不释放&#xff0c;程序结束时一般由操作系统回收。注意它与数据结构中的堆是两回事 2、栈区&#xff08;stack&#xff09;——由编译器自动分配释放 &#xff0c;存放函数的…

cmake install命令无法覆盖同名文件

文章目录 1. 问题记录2. 原因排查3. 解决方案 1. 问题记录 我有两个同名文件test.txt&#xff0c;它们内容不同&#xff0c;但时间戳相同&#xff08;文件属性中的修改时间相同&#xff09; 我希望在cmake中利用install命令&#xff0c;将${PATH_SRC}/test.txt替换${PATH_DES…

Android OTA 交流群 2024 年 4 月问题汇总

Android OTA 交流群 2024 年 4 月问题汇总 相关文章 Android OTA 问题交流微信群和知识星球Android OTA 交流群 2024 年 4 月问题汇总Android OTA 交流群 2024 年 3 月问题汇总Android OTA 交流群 2024 年 2 月问题汇总Android OTA 交流群 2024 年 1 月问题汇总 问题汇总 2…

[译]Elasticsearch _source Doc_values And Store Performance

原文地址 https://sease.io/2021/02/field-retrieval-performance-in-elasticsearch.html 在这篇博文中&#xff0c;我想从性能的角度探讨 Elasticsearch 为我们存储字段和查询时检索字段提供了哪些可能性。 事实上&#xff0c;Lucene&#xff08;Elasticsearch 和 Solr 构建的…

【typescript 小秘籍 - 类型自动推导】

今天发现个typescript的小技巧&#xff0c;原来在vscode里面 typescript是可以根据数据&#xff0c;自动推导其类型的&#xff0c;这样就不用自己去手敲定义了。比如 鼠标移动到person上&#xff0c;可以看到 其自动推导了person的类型 然后直接复制下来 直接使用即可。