嵌入式系统复习

嵌入式系统复习

第一讲ppt填空

三要素:嵌入、专用、计算机

嵌入式系统发展的最高形式——片上系统(SOC)

嵌入式系统分类:按硬件:芯片级、模块级、系统级

​ 按软件:非实时、软实时、硬实时

处理器的分类:微控制器(MCU) 典型:单片机8位

​ 数字信号处理器(DSP)

​ 片上系统(SOC)

​ 可编程片上系统(SPOC)

单片机芯片内部集成ROM/EPROM、RAM、总线逻辑、定时/计数器、看门狗、I/O、串行口、脉宽调制输出、A/D、D/A、Flash、EEPROM等各种必要功能和外设。

怎么判断这是一个嵌入式系统?

就是嵌入到对象体中的专用计算机系统,通过嵌入性、专用性、计算机 三个特点判断。

什么是交叉编译?

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单的说,就是在一个平台上生成另一个平台可执行的代码。

了解嵌入式开发的基本操作和流程

arm-linux-gcc main.c -o main

rx main

chmod +x main

./main

mkdir +文件名

rm 删除

什么是嵌入式操作系统(可能简答)

嵌入式操作系统是用于嵌入式系统的操作系统。嵌入式实时操作系统在目前的嵌入式应用中用得越来越广泛,尤其在功能复杂、系统庞大的应用中显得愈来愈重要。在嵌入式应用中,只有把CPU嵌入到系统中,同时又把操作系统嵌入进去,才是真正的计算机嵌入式应用。

在嵌入式领域常用的操作系统有嵌入式Linux,Win CE,Vxwork,μC/OS-II

嵌入式系统开发

可以把嵌入式系统的开发看作对一个项目的实施。项目的生命周期一般分为识别需求、提出解决方案、执行项目和结束项目4个阶段。嵌入式系统项目开发也是如此。

linux基本命令(10分)选择填空

linux是一类Unix计算机操作系统的统称。目录树形结构

在这里插入图片描述

一些目录对应的功能:

/etc:开机与系统应用文件均在这个目录下

/bin,/sbin/,/usr/bin,/usr/sbin:系统预设的执行文件存放目录

/usr/local:系统预设让你安装升级后的套件目录

/home:系统将有账号的人的根目录设置的位置

/var:www,ftp,db,mail,logmessage

/usr/share/man,/usr/local/man:放置各类套件说明文档的目录

/media:u盘存储设备等挂载文件

linux文件类型

普通文件、目录文件、设备文件、链接文件、管道文件

1、修改ip地址。
2、变化文件权限修改 等

查看网络配置 ifconfig

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQEHrzEU-1627542172691)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\image-20210629173619724.png)]

ifconfig eth0 192.168.1.155 netmask 255.255.255.0

service networking restart 重启网络

ifconfig eth0 up 重启网卡

在这里插入图片描述

文件权限修改及文件操作

  • ls: 列出目录
  • cd:切换目录
  • pwd:显示目前的目录
  • mkdir:创建一个新的目录
  • rmdir:删除一个空的目录
  • cp: 复制文件或目录
  • rm: 移除文件或目录
  • mv: 移动文件与目录、文件重命名
Linux 文件内容查看

Linux系统中使用以下命令来查看文件的内容:

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
  • nl 显示的时候,顺道输出行号!
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head 只看头几行
  • tail 只看尾巴几行

在这里插入图片描述

查看目录所有文件权限

在这里插入图片描述

查看指定文件权限

权限修改指令 chmod

chmod u/g/o/a +/- r/w/x filename

该指令除了chmod和filename之外,还有三个部分:

①描述文件权限身份。u表示文件所有者、g表示文件所有者所在组、o表示其他用户、a表示三者全部。可以搭配使用,如ug表示文件所有者及其所在组;

②指定权限配置行为。‘+’表示添加权限,‘-’表示删除权限;

③权限类型。分别对于可读可写可执行。

ls

在这里插入图片描述

cat

在这里插入图片描述

mv

在这里插入图片描述

rm

在这里插入图片描述

mkdir

在这里插入图片描述

find

在这里插入图片描述

chmod

在这里插入图片描述

vi操作

在这里插入图片描述

Linux用户与组

groupadd 添加用户组

groupdel 删除用户组

管理用户的工具或命令

useraadd 添加用户

passwd 为用户设置密码

su 用户切换工具

磁盘管理常用命令

fdisk 磁盘分区
1.fdisk –l 显示磁盘分区
2.fdisk [/dev/sda] 对磁盘进行分区
D 删除一个分区
N 创建一个分区
Q 不保存退出
T 改变分区ID
W 保存退出

mkfs 磁盘格式化命令
mkfs [格式] [磁盘分区]
mkfs -t ext3 /dev/sdb1
mount 磁盘挂载命令
mount -t ext3 /dev/sdb1 /mnt/backup

处理器的模式分那几种(8分)

在这里插入图片描述

ARM7体系(考60分)

在这里插入图片描述

微处理器的体系结构

在这里插入图片描述

经典微处理器体系结构主要有冯·诺依曼结构和哈佛体系。

冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个寄存器的不同物理位置,因此程序的指令和数据的宽度相同。

计算机结构说明:
“冯·诺依曼” 结构:把代码作为一种特殊的数据来操作,指令总线和数据总线及其存储区域是统一的;
“哈佛”结构:指令总线和数据总线及其存储区是分开、独立的。

简介

ARM处理器为RISC芯片,其简单的结构使ARM内核非常小,这使得器件的功耗也非常低。它具有经典RISC的特点:

在这里插入图片描述

注意:“ARM核”并不是芯片,ARM核与其它部件如RAM、ROM、片内外设组合在一起才能构成现实的芯片。

ARM7TDMI处理器使用了冯·诺依曼(Von Neumann)结构,指令和数据共用一条32位总线。只有装载、存储和交换指令可以对存储器中的数据进行访问。
数据可以是字节( 8位)、半字( 16位)或者字(32位)。

ARM三级流水线: 取指——> 译码——>执行 目的是使用流水线来增加处理器指令流的速度,这样使多个系统同时操作并使处理器和存储系统能连续运行

流水线上各指令的地址流水线工位描述
ARM指令集Thumb指令集
PCPC取指指令从存储器中取出
PC-4PC-2译码对指令使用的寄存器进行译码
PC-8PC-4执行从寄存器组中读出寄存器,执行移位和ALU操作,寄存器被写回到寄存器组中
处理器状态

ARM状态:32位,这种状态下执行的是字方式的ARM指令;
Thumb状态:16位,这种状态下执行半字方式的Thumb指令。

注意:两个状态之间的切换并不影响处理器模式或寄存器内容。

使用BX指令将ARM7TDMI内核的操作状态在ARM状态和Thumb状态之间进行切换(详见第4章) ,程序如下所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E0Pgc2f7-1627542172717)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\image-20210630193905466.png)]

处理器模式

RM体系结构支持7种处理器模式,分别为:用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式,如下表所示。这样的好处是可以更好的支持操作系统并提高工作效率。ARM7TDMI完全支持这七种模式。

在这里插入图片描述

特权模式

除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。

异常模式

这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。

在这里插入图片描述

用户和系统模式

​ 这两种模式都不能由异常进入,而且它们使用完全相同的寄存器组。
​ 系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。

ARM寄存器

​ 在ARM7TDMI处理器内部有37个用户可见的寄存器。在不同的工作模式和处理器状态下,程序员可以访问的寄存器也不尽相同。

在这里插入图片描述

所有的37个寄存器分为两大类:31个通用32位寄存器,6个状态寄存器。

在汇编语言中寄存器

R0~R13为保存数据或地址值的通用寄存器,他们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于使用任何使用通用寄存器的指令。

R0~R7为未分组的寄存器,对应相同的32位物理寄存器。

R8~R14为分组寄存器。取决于处理模式,

R14为链路寄存器(LR),在结构上有两种特殊功能:任何模式下,模式自身的R14版本用于保存子程序返回地址。当发生异常时,将R14对应的异常模式版本设置为异常返回地址。

R13常作为堆栈指针(SP),ARM指令集中没有特殊方式使用R13的指令和功能,只是习惯性都这样使用,但在Thumb指令集中存在使用R13的指令。

R13、R14分别有六个物理寄存器。一个用于用户和系统模式,其他五个对应五种异常模式。

寄存器CPSR为程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。每种异常都有自己的SPSR,在因为异常事件而进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。

Thumb状态寄存器

Thumb状态寄存器集是ARM状态集的子集,程序员可以直接访问的寄存器为:
8个通用寄存器R0~R7;
程序计数器(PC);
堆栈指针(SP);
链接寄存器(LR);
有条件访问程序状态寄存器( CPSR)。

在这里插入图片描述

R14寄存器与子程序的调用

PC指向、经过指定之后 按pc值的变化

在这里插入图片描述

“BL Lable”指令执行后跳转至B程序,程序B开始运行,同时该指令的下一条指令地址存入R14,即存入B程序的最后一条MOV指令的PC中,此时pc的值发生变化,存储的是地址A,后续再mov指令返回地址A,即继续运行程序A。

此外:

R14也称作子程序连接寄存器(Subroutine Link Register)或连接寄存器LR。当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。

其他情况下,R14用作通用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。

寄存器R14常用在如下的情况:

在每一种运行模式下,都可用R14保存子程序的返回地址(也就是 R15 PC ),当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回。以上的描述可用指令完成:

寄存器R15为程序计数器(PC),它指向正在取指的地址。可以认为它是一个通用寄存器,但是对于它的使用有许多与指令相关的限制或特殊情况。如果R15使用的方式超出了这些限制,那么结果将是不可预测的。

在这里插入图片描述

CPSR处理器状态

CPSR的最低8位为控制位,当发生异常时,这些位被硬件改变。当处理器处于一个特权模式时,可用软件操作这些位。
它们分别是:
中断禁止位;
T位;
模式位。

中断禁止位包括I和F位:
当I位置位时,IRQ中断被禁止;
当F位置位时,FIQ中断被禁止。
T位反映了正在操作的状态:
当T位置位时,处理器正在Thumb状态下运行;
当T位清零时,处理器正在ARM状态下运行。

模式位包括M4、M3、M2、M1和M0,这些位决定处理器的操作模式。
注意:不是所有模式位的组合都定义了有效的处理器模式,如果使用了错误的设置,将引起一个无法恢复的错误。

http://blog.chinaunix.net/uid-28458801-id-3487199.html

在这里插入图片描述

https://blog.csdn.net/david_luyang/article/details/6276533

异常

只要正常的程序流被暂时中止,处理器就进入异常模式。

如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。

在这里插入图片描述

注意:中断返回指令的寄存器列表(其中必须包括PC)后的“^”符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复。这里使用的堆栈指针SP(R13)是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。这个堆栈指针应必须在系统启动时初始化。

复位

nRESET信号被拉低时(一般外部复位引脚电平的变化和芯片的其它复位源会改变这个内核信号),ARM7TDMI处理器放弃正在执行的指令。
在复位后,除PC和CPSR之外的所有寄存器的值都不确定。

当nRESET信号再次变为高电平时,ARM处理器执行下列操作:
1.强制M[4:0]变为b10011(管理模式);
2.置位CPSR中的I和F位;
2.清零CPSR中的T位;
4.强制PC从地址0x00开始对下一条指令进行取指;
5.返回到ARM状态并恢复执行 。

异常的类型

复位异常、数据访问中止异常、快速中断请求异常、用户中断请求异常、用户中断请求异常、预取指令异常、软件中断异常、未定义异常。

存储器及存储映射I/O

ARM7TDMI处理器采用冯·诺依曼(Von Neumann)结构,指令和数据共用一条32位数据总线。只有装载、保存和交换指令可访问存储器中的数据。

存储器大/小端

RM7TDMI处理器可以将存储器中的字以下列格式存储(详细说明见“存储器格式”小节):
大端格式(Big-endian) 大端格式是指一个字的4个字节按照低位字节在高地址存放,高位字节在低地址存放的方法。
小端格式(Little-endian)小端格式是指一个字的4个字节按照低位字节在低地址存放,高位字节在高地址存放的方法。

地址空间计算

在这里插入图片描述

AMR7指令集

ARM指令集

可分为5大类指令,所有指令都可以条件执行,其中一些指令还可以根据执行结果更新CPSR寄存器的相关标志位:
分支指令;
数据处理指令;
加载和存储指令;
协处理器指令;
杂项指令。

Thumb指令集

Thumb指令集可分为4大类指令:
分支指令;
数据处理指令;
寄存器加载和存储指令;
异常产生指令。

基于ARM和Linux的开发

Linux映像由内核(kernel)和文件系统(fs)组成

可以将kernel和fs统一编译到一个映像(image)文件中,也可以将kernel和fs独立地放置于不同的映像文件中(烧写到FLASH的不同区域),这需要通过修改Makefile文件和内核中的文件系统加载代码实现。

linux内核组成

初始化程序段、数据段、末初始数据段、代码段、如果kernel和fs编译在一起,内核映像还包含文件系统(romfs)

linux的内核移植

Linux内核的移植可以分为板级移植和片级移植。

指令

考试最多的 指令
关键的几个操作,对数据的操作、(三个指令对存储进行操作,哪几个)
寻址方式 指令里面寻址方式搞清楚、
什么是堆栈寻址满递增满递减,空递增空递减,明白区别

ARM处理器的寻址方式

寻址方式的分类

1、寄存器寻址

2、立即寻址

3、寄存器位移寻址

4、寄存器间接寻址

5、变址寻址

6、相对寻址

7、多寄存器寻址

8、堆栈寻址

https://blog.csdn.net/dongdong0071/article/details/52043985

在这里插入图片描述

P48

指令的特点
ARM指令的种类,他能完成哪些功能

关键的几个操作,对数据的操作、(三个指令对存储进行操作,哪几个)

ARM指令种类

1.存储器访问指令

所有单寄存器加载/存储指令可分为“字和无符号字节加载存储指令”和“半字和有符号字节加载存储指令。

单寄存器

在这里插入图片描述

装载指令:LDR

在这里插入图片描述

存储指令:STR

在这里插入图片描述

多寄存器

在这里插入图片描述

2.数据处理指令

数据处理指令大致可分为3类:
数据传送指令;
算术逻辑运算指令;
比较指令。
数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。

3.乘法指令
4.ARM分支指令
5.协处理器指令
6.杂项指令
7.伪指令

八位图

判断1的连续位是否超过8位

在这里插入图片描述

在这里插入图片描述

程序设计题(30分)

makefile文件的三种写法(9分)p172

makefile定义了一系列规则来指定文件的编译等操作,实现“自动化编译”,利用make工具,最主要的也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。

编译和链接规则:

1、如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

2、如果这个工程的某几个C文件被修改,那么我们只编译
被修改的C文件,并链接目标程序。

3、如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

方法1

简单的Makefile(所有文件在一个文件夹)

st_work: main.o st_work.o fun.o
<TAP>gcc main.o st_work.o fun.o -o st_work

st_work.o:st_work.c
    gcc -c st_work.c -o st_work.o
main.o:main.c st_work.h
    gcc -c main.c -o main.o
fun.o:fun.c fun.h
    gcc -c fun.c -o fun.o
clean:rm -f st_work*.o
方法2

多目录下Makefile的写法(1)

  1. -o 指定目标文件
    gcc sources/main.c -o bin/main
  2. -c 编译的时候只生产目标文件不链接
    gcc -c sources/main.c -o obj/main.o
  3. -I 主要指定头文件的搜索路径
    gcc -I headers -c main.c -o main.o
bin/st_work:obj/main.o obj/st_work.o obj/fun.o
	gcc obj/main.o obj/st_work.o obj/fun.o -o bin/st_work
obj/st_work.o:soureces/st_work.c
	gcc -l headers -c sources/st_work.c -o obj/st_work.o
obj/main.o:sources/main.c 
	gcc -l headers -c sources/main.c -o file_o/main.o
obj/fun.o:sources/fun.c
	gcc -l headers -c file_c/fun.c -o file_o/fun.o
clean:
	rm -f bin/st_work file_o/*.o

锁相环计算

在这里插入图片描述

选择题(20分)

SWP、LDR、STR、LDM、STM

填空题(20分)

一个嵌入式系统从软件的角度来看可分为哪几个层次:引导加载程序、Linux内核、文件系统、用户应用程序

文件名xtu 文件的可读可写权限修改:chmod 777 xtu

嵌入式开发属于宿主机-目标机开发模式

就是嵌入到对象体中的专用计算机系统,通过嵌入性、专用性、计算机 三个特点判断。

三个指令对存储进行操作,哪三个:只有装载、存储、交换指令可以访问存储器中的数据。

修改ip ifconfig eth0 ip netmask 255.255.255.0

service networking restart 重启网络

ifconfig eth0 up 重启网卡

ARM7TDMI

复位异常、数据访问中止异常、快速中断请求异常、用户中断请求异常、预取指令异常、软件中断异常、未定义异常。

简答题(20分)

1、简述优先级倒置产生的条件、现象以及解决方案。

答:条件:基于优先级抢先式的任务调度、资源共享

​ 现象:低优先级任务L和高优先级任务H共享资源,在任务L占有共享资源后,任务H就绪,但这时任务H必须等待任务L完成对共享资源的操作。在任务L完成对共享资源的操作之前,任务M也已就绪并将抢先任务L运行。在任务M运行时,系统中具有最高优先级的任务H仍然保持挂起状态。

​ 解决方案:优先级继承、优先级顶置。

2、请联系实验内容简述什么是BootLoader,它在嵌入式系统中主要起什么作用?为什么要在嵌入式平台植入BootLoader?

答:Boot Loader是在嵌入式系统复位启动时,操作系统内核运行前,执行的一段程序。通过Boot Loader,初始化硬件设备,建立内存和I/O空间映射图,为最终加载操作系统内核调整好适当的系统软硬件环境。

需要移植的原因是因为每种不同CPU体系结构都有不同的Boot Loader,且它还依赖于具体的嵌入式设备的配置,所以需要修改Boot Loader进行移植。

3、什么是资源同步?怎样才能实现资源同步?什么是行为同步?

答:使得不同任务访问共享资源时能够确保共享资源信息可靠和完整性的措施称为“资源同步”。可以通过以下手段实现:

(1)进入然后退出临界区;

(2)禁止然后允许调度;

(3)使用信号量与互斥信号量

一个任务的运行过程需要和其他任务的运行相配合,才能达到预定的效果,任务之间的这种配合和协调关系称为“行为同步”。

4、什么是交叉开发模式?

意思就是在一台主机上进行操作系统的裁剪,以及编写应用程序,在主机上应用交叉编译环境编译内核以及应用程序,然后把目标代码下载到目标机上运行。这就需要在主机上安装、配置交叉编译环境,使其能够编译成在目标机上运行的目标代码。简单的说就是在一个架构下编译另一个架构的目标文件。采用何种交叉编译产生何种目标格式的文件还要取决于目标机的操作系统。

程序分析题(10分)

简单的ARM程序

在这里插入图片描述

程序设计题(30)

1、makelife文件的编写,要求如下:

a)编写一个文件prime.h,包含unsigned int是否为素数的函数定义

b)编写一个文件prime.c,实现上面的那个函数;

c)编写一个main.c,实现用户输入整数,程序告诉用户这个数是否为素数,知道用户输入0结束。

d)编写Makefile文件能够使用Make工具编译生成一个可执行文件

答:

a)

#ifnder _prime_h_
#define _prime_h_
#include<stdio>
int is_prime(unsigned int);
#endif

b)

#include"prime.h"
#include"math.h"
int is_prime(unsigned int num)
{
    int i;
    if(num<=1) return 0;
    for(i=2;i*i<num/2;i++)
    {
        if(num%i==0)
            return 0;
    }
    return 1;
}

c)

#include"prime.h"
int main()
{
    int n;
    while(n!=0)
    {
        scanf("%d",&n);
        if(n==0) break;
        if(is_prime(n))  ....
    }
}

d)

main:main.o prime.o
	gcc main.o prime.o -o main
main.o:main.c prime.h
	gcc -c main.c main.o
prime.o:prime.c prime.h
	gcc -c prime.c prime.o
clean:
	rm -f main*.o
三种方式编写makefile

(1)简单方式

st_work : main.o   st_work.o    fun.o   
	gcc   main.o  st_work.o  fun.o  -o st_work(命令一定要用以Tab开头)
st_work.o : st_work.c 
	gcc  -c st_work.c   -o st_work.o
main.o : main.c   st_work.h
	gcc -c main.c -o  main.o
fun.o  : fun.c fun.h
	gcc -c  fun.c -o fun.o
clean:
	rm -f st_work *.o

(2)多目录下的文件写法

bin/st_work : obj/main.o  obj/st_work.o  obj/fun.o   
	gcc  obj/main.o obj/st_work.o  obj/fun.o  -o bin/st_work  (命令一定要用以Tab开头)
obj/st_work.o : sources/st_work.c 
	gcc  -I  headers   -c 	sources/st_work.c  -o  obj/st_work.o
obj/main.o : 	sources/main.c
	gcc  -I  headers   -c 	sources/main.c    -o  file_o/main.o
obj/fun.o  :	 sources/fun.c
	gcc  -I  headers   -c 	 file_c/fun.c	    -o  file_o/fun.o
clean:
	rm -f bin/st_work file_o/*.o

(3)用隐式规则改进

bin/st_work : obj/main.o  obj/st_work.o  obj/fun.o   
	gcc  $^  -o $@  (命令一定要用以Tab开头)
obj/st_work.o : sources/st_work.c 
	gcc  -I  headers   -c 	$<	-o  $@
obj/main.o : 	sources/main.c
	gcc  -I  headers   -c 	$<	-o  $@
obj/fun.o  :	 sources/fun.c
	gcc  -I  headers   -c 	$<	-o  $@
clean:
	rm -f bin/st_work file_o/*.o

3个符号介绍:

$@ 表示要生成的目标

$^ 表示全部的依赖文件

$< 表示第一个依赖文件

三行代码解决问题

在这里插入图片描述

每个计数器存储什么数据

在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值