C中volatile关键字

概念

在单片机开发中,volatile是一个关键字,用于告诉编译器该变量的值可能在程序的执行过程中被意外地改变,因此编译器不应进行优化操作,以确保程序的正确性。

当一个变量被声明为volatile时,编译器会在每次使用该变量时都重新读取它的值,而不是使用之前缓存的值。这是因为该变量的值可能会由于硬件中断、外部设备或其他并行代码的操作而发生变化,而这些变化编译器无法预测到。

查看STC8H.H文件,可以看到一个典型的寄存器宏定义如下:

#define     P2IM0                   (*(unsigned char volatile xdata *)0xfd22)

volatile关键字的作用主要有两个方面:

  1. 防止编译器优化:编译器在进行优化时,可能会假设一个变量的值在其它代码段没有被修改的情况下保持不变。然而,在并行操作、中断处理等情况下,这种假设是不正确的。通过使用volatile关键字,可以告诉编译器不要进行这种优化,确保每次使用变量时都从内存中读取最新的值。
  2. 与外部设备的交互:在单片机开发中,我们经常需要与外部设备进行交互,例如使用寄存器与外设进行通信。由于外设的状态可能会在任何时候发生变化,我们需要使用volatile关键字来声明与外设交互的寄存器,以确保读取和写入操作的正确性。

下面是一个示例,展示了如何在C语言中使用volatile关键字:

volatile int flag = 0;  // 声明一个volatile变量

int main() {
    while (1) {
        if (flag == 1) {  // 检查变量值
            // 执行相应操作
            flag = 0;  // 重置变量值
        }
        // 其他代码
    }
}


在上面的示例中,变量flag被声明为volatile int,因此在每次使用它时,编译器将重新读取其值,而不是使用之前的缓存值。这确保了在其他代码或中断中修改flag的值后,主循环能够及时检测到变化并执行相应操作。

sfrsbit关键字

在单片机开发中,sfrsbit和是特定于某些编译器或单片机体系结构的关键字,用于定义和访问特殊功能寄存器(Special Function Registers,SFR)、位(Bit),它们作用如下:

  1. sfr(Special Function Register):sfr用于定义和访问特殊功能寄存器。特殊功能寄存器是单片机中的一些特殊寄存器,用于控制和配置硬件功能,如控制器、定时器、串口等。sfr关键字允许程序员为这些特殊功能寄存器分配易于使用的名称,并提供对这些寄存器的访问和操作。

以下是一个使用sfr定义和访问特殊功能寄存器的示例(基于Keil C51编译器):

sfr P1 = 0x90;   // 定义一个特殊功能寄存器 P1
sfr TCON = 0x88; // 定义一个特殊功能寄存器 TCON

void main() {
    P1 = 0xFF;    // 对 P1 进行写操作
    if (TCON & 0x01) {
        // 如果 TCON 的最低位为 1,则执行某些操作
    }
}

在上面的示例中,通过使用sfr关键字,我们为特殊功能寄存器P1和TCON分配了易于理解的名称,并能够对它们进行读写操作。

  1. sbit(Special Bit):sbit用于定义和访问特殊功能寄存器中的位(bit)。单片机中的特殊功能寄存器通常包含多个位,每个位都用于控制或表示特定的功能或状态。sbit关键字允许程序员为这些位分配易于使用的名称,并提供对它们的访问和操作。

以下是一个使用sbit定义和访问特殊功能寄存器位的示例:

sfr P1 = 0x90;   // 定义一个特殊功能寄存器 P1
sbit LED = P1^0; // 定义一个位 LED,位于 P1 的第 0 位

void main() {
    LED = 1;      // 对 LED 进行写操作,置为高电平
    if (LED == 0) {
        // 如果 LED 为低电平,则执行某些操作
    }
}

在上面的示例中,我们使用sbit关键字将P1寄存器中的第0位定义为LED,并可以对LED进行读写操作。

xdata, idata, code等存储类型

51单片机采用哈佛微控制器架构,keil的C51中定义了xdata、idata、xdata、code几种域修饰符。内存空间编址有重叠。这些修饰符决定了变量访问方式。使用这些关键字可以帮助程序员更好地管理内存空间,从而提高程序的效率。举个例子,假设我们正在编写一个实时控制系统,在这个系统中需要频繁读写一些变量,如传感器数据、控制指令等。我们可以使用xdata或code来存储这些变量,以便快速读写和响应。

 

STC8H 系列单片机内部的数据存储器在物理和逻辑上都分为两个地址空间

  • 内部 RAM(256 字节)
  • 内部扩展 RAM

其中内部 RAM 的高 128 字节的数据存储器与特殊功能寄存器(SFRs)地址重叠,实际使用时通过不同的寻址方式加以区分。

内部 RAM (256 字节)

内部 RAM 共 256 字节,可分为 2 个部分:低 128 字节 RAM 和高 128 字节 RAM。

  • 低 128 字节 RAM(data)的数据存储器与传统 8051 兼容,既可直接寻址也可间接寻址。
  • 高 128 字节 RAM(idata)在 8052 中扩展了高 128 字节 RAM

特殊功能寄存器区SFRs

idata与特殊功能寄存器区SFRs共用相同的逻辑地址,都使用 80H~FFH,但在物理上是分别独立的,使用时通过不同的寻址方式加以区分。高 128 字节 RAM 只可间接寻址,特殊功能寄存器区只可直接寻址。

内部扩展 RAM (8K)

在 C 语言中,可使用 xdata 声明存储类型为内部扩展RAM。例如:unsigned char xdata i;

pdata 即为 xdata 的低 256 字节。

外部扩展RAM (64K)

STC8H 系列封装管脚数为 40 及其以上的单片机具有扩展 64KB 外部数据存储器的能力。

以下是这几种存储类型的总结表格:

存储类型

存储内容

存储位置

读写速度

存储空间

data

固定指前面0x00-0x7F的128个RAM(默认)

内部RAM

快速

较小

idata

固定指前面0x00-0xFF的256个RAM

其中前128和data的128完全相同

内部RAM

快速

较小

bdata

位数据(只有0和1的数据)
访问位寻址的片内存储器

内部RAM
16字节0x20~0x2f

快速

较小

xdata

频繁读写的变量或数据8K+64K

内部&外部扩展RAM

快速

较大

pdata

指针数据

扩展RAM的低256个字节

快速

较小

code

程序代码,只读64K

内部ROM

较慢

较大

需要注意的是,具体的存储位置、读写速度和存储空间可能因不同的芯片型号、厂商和配置而有所不同。

数学公式神器

手绘数学公式:math

识别公式截图:Mathpix: AI-powered document automation

开启Win11多标签

📎ViVeTool-v0.3.3.zip

  1. 解压
  2. 进入解压后的目录
  3. 复制路径,用管理员权限打开cmd

  1. 通过cd命令进入该目录

输入如下命令可进行开启和关闭

# 开启
vivetool /enable /id:40729001
vivetool /enable /id:42105254
vivetool /enable /id:40950262
    
vivetool /enable /id:39145991
vivetool /enable /id:37634385
vivetool /enable /id:36354489

vivetool /enable /id:36302090
    
# 关闭 
vivetool /disable /id:39145991
vivetool /disable /id:37634385
vivetool /disable /id:36354489   

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与国已互相成为双方最大的交易伙伴。国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占国外贸总值的15.4%。在过去20余年,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值