当前位置: 首页 > news >正文

【C语言基础】分享近期学习到的volatile关键字、__NOP__()函数以及# #if 1 #endif

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处

文章目录

  • volatile的使用方法
  • __NOP__()是什么函数?
  • #if 1 #endif


volatile的使用方法

volatile的作用: 当我们在使用C语言时,volatile关键字用于告诉编译器不要对某个变量进行优化。它通常用于修饰那些可能被硬件设备、中断或其它线程修改的变量。

下面通过使用volatile关键字的示例代码进行说明:

volatile int counter = 0;
void incrementCounter() {counter++;}int main() {printf("Initial counter value: %d\n", counter);incrementCounter();printf("Counter after increment: %d\n", counter);return 0;}

代码解释: 在上述代码中,counter变量被声明为volatile int类型。这意味着编译器不会对counter进行任何优化,以确保每次对counter的读取和修改都是直接从内存中进行,而不是从寄存器或其它缓存中读取。
在一些特定的场景下,例如在嵌入式系统中操作硬件寄存器或处理中断时,使用volatile关键字非常重要。它确保我们在读取和修改变量时的可见性和一致性,避免了编译器可能进行的优化,从而保证了代码的正确性。
需要注意的是,volatile关键字仅仅用于告诉编译器不要对变量进行优化,它并不能解决所有的并发多线程问题。对于需要实现同步和互斥的场景,我们仍然需要使用适当的同步机制(如互斥锁或原子操作)来保证线程安全。
参考:https://www.runoob.com/w3cnote/c-volatile-keyword.html

NOP()是什么函数?

NOP()是什么? __NOP() 是一个内联汇编指令,用于在一些特定的嵌入式系统中执行空操作(no operation),相当于一个延时函数
具体来说,__NOP__() 是一个特殊的汇编指令,它告诉处理器不执行任何操作,即产生一个空的机器指令。这个指令通常用于延迟一段时间或调整代码的执行速度。
使用条件:当使用_nop_()函数(可理解为软件延时)时,必须在开头添加头文件#include<intrins.h>
延时大小:而_nop_()函数的空操作产生的时间与晶振有关,用stc-isp软件,自动给你计算出来的
代码示例:

//100us
void Delay100us()		//@12.000MHz
{unsigned char i;_nop_();i = 47;while (--i);
}

#if 1 #endif

#if 1#endif 是条件编译的预处理指令。在这个示例中,#if 1 表示始终为真的条件,因为 1
代表真值。所以,#if 1 后面的代码块将会被编译,而 #endif 表示条件编译的结束。
可以使用条件编译来在编译时根据条件包含或排除一段代码。当条件为真时,被包含在 #if#endif 之间的代码将被编译;当条件为假时,这段代码将被忽略,不会参与编译。
在这个简单的示例中,#if 1 的条件为真,所以包含在这个条件下的代码块将被编译。如果将条件改为 #if 0,则条件为假,#if 0 和 #endif 之间的代码块将被忽略,不会参与编译。
条件编译可以用于在不同的情况下选择性地包含或排除代码,例如根据不同的操作系统、平台或编译器选项进行编译配置。

在这里插入图片描述

http://www.lryc.cn/news/235671.html

相关文章:

  • docker容器自启动
  • 【C++】:模板的使用
  • Springboot框架中使用 Redis + Lua 脚本进行限流功能
  • 【nlp】2.5(cpu version) 人名分类器实战项目(对比RNN、LSTM、GRU模型)
  • 记录基于scapy构造ClientHello报文的尝试
  • 程序设计实践学习笔记
  • Ubuntu中apt-get update显示域名解析失败
  • go学习之简单项目
  • 代码随想录二刷 | 数组 | 总结篇
  • go test 命令详解
  • 【Mysql学习笔记】1 - Mysql入门
  • sentinel 网关
  • 常见面试题-MySQL的Explain执行计划
  • SpringBoot静态资源配置
  • Java拼图
  • Linux 怎样通过win 远程桌面连接链接Linux后台服务器的可视化图形界面
  • Java 实现随机图形
  • java 读写文件的代码。
  • 如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?
  • 文本向量化
  • java--贪吃蛇
  • 录制第一个jmeter性能测试脚本2(http协议)
  • pip命令大全
  • Redis篇---第二篇
  • 【LeetCode刷题日志】232.用栈实现队列
  • 单元测试实战(二)Service 的测试
  • LabVIEW和NIUSRP硬件加快了认知无线电开发
  • 嵌入式软件工程师面试题——2025校招社招通用(十六)
  • 白盒测试之测试用例设计方法
  • 在CentOS 7上关闭SELinux