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


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


    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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    NOP()是什么函数?

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

    //100us
    void Delay100us()		//@12.000MHz
    {
    	unsigned char i;
     
    	_nop_();
    	i = 47;
    	while (--i);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    #if 1 #endif

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

    在这里插入图片描述

  • 相关阅读:
    SpringCloud微服务技术栈-什么是Docker?怎么安装Docker?
    vue开发页面自适应屏幕尺寸
    Unity笔记(1)
    Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较
    数据库基础知识记录
    一图了解es6常用数据迭代函数map,filter,fill,reduce
    vue中的模板语法
    [WTL/Win32]_[中级]_[MVP架构在实际项目中的应用]
    [1007]魔法少女小Scarlet
    Rust之自动化测试(三): 测试组合
  • 原文地址:https://blog.csdn.net/weixin_51244852/article/details/134493412