单片机类型
RISC单片机,即基于精简指令集计算(Reduced Instruction Set Computing)架构的单片机,近年来在嵌入式系统领域得到了广泛的应用。以下是关于RISC单片机的详细介绍:
一、RISC单片机概述
RISC单片机采用精简指令集架构,其核心在于指令集的简化和硬件结构的优化。与传统的复杂指令集(CISC)单片机相比,RISC单片机具有更高的执行效率和更低的功耗。它们通常通过流水线技术、寄存器到寄存器的数据传输以及固定的指令长度等特性来提高性能。
二、RISC单片机的优势
- 高效执行:RISC指令集相对简单,每条指令的执行时间更短,且易于通过流水线技术并行处理,从而提高了处理器的整体执行效率。
- 低功耗:由于指令集简化和硬件结构优化,RISC单片机在运行时消耗的功率更低,适合对功耗有严格要求的嵌入式系统。
- 可定制性和灵活性:一些RISC单片机(如基于RISC-V架构的单片机)具有开放源代码和可定制性,用户可以根据具体需求对指令集和硬件结构进行定制和优化。
- 高性价比:由于开放源代码和可定制性,RISC单片机的成本相对较低,同时性能优越,因此具有较高的性价比
单片机型号
该单片机为中基国威单片机p02.
官方代码
查询了该单片机的手册清除看门狗占用一个指令周期
nop占用一个指令周期
前置知识
要懂其中的计算就必须了解周期的概念
时钟周期
时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。
在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250ns。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的8051单片机的时钟范围是1.2MHz-12MHz。
在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。
机器周期
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。
指令周期
指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
单片机中定时器(Timer)、计数器(Counter)区别:
定时器和计数器在单片机内部使用同一电路来实现:当这一电路选择为定时器功能时,其输入源通常来自于内部输入的单位时间脉冲(比如由时钟源产生),包含有时间的概念在里面;当这一电路选择为计数器功能时,其输入源通常来自于外部事件触发,用于统计外部事件的数量,没有时间概念在里面。
原文链接:https://blog.csdn.net/xiebingsuccess/article/details/88824389
总结概括
周期:
振荡周期:时钟周期也称为振荡周期,定义为时钟频率的倒数。12MHz晶振的时钟周期就是1/12 us、1MHz就是1us。
状态周期:2个振荡周期为1个状态周期。
机器周期:1个机器周期含6个状态周期,12个时钟周期。指令周期是取出一条指令并执行这条指令的时间。12MHz晶振的机器周期就是12*1/12us=1us。
指令周期:完成一条指令所需的时间就是指令周期,不同的指令,指令周期也不一样。它是指CPU完成一条操作的所需的全部时间。机器周期=6状态周期=12振荡周期
实现延时的方法有多种
- 循环 采用for或者while循环,让计算机跑无用的代码,从而达到延时的目的
- 定时器 通过定时器的计时功能,来达到延时的目的
- 系统调用 该功能其实还是通过以上的两种方式来实现,当时这种功能出现在有系统的程序里面,执行系统延时的情况下,单片机可以去执行别的函数,直到系统时间到,从而回来接着执行该代码,这实际上也提高了效率
这里我们用的是循环的方法进行延时
计算公式
时钟周期 = 1/时钟频率
机器周期 = 完成一个基本操作所需要的时间 = 时钟周期*n(n取决于单片的不同而不同)
指令周期 = 完成一次指令所需的时间 = 一或者两个机器周期
而我们的计算公式则是:
(count(次数)*指令周期所需的时钟周期数(例如c51就是12)*循环中的指令数)/时钟频率
计算
回到最开始的代码
那我们只需计算里面while(y--)这层函数延时的时间
经查阅该单片机的指令为精简指令,机器周期为一个时钟周期
; 假设y的值已经通过某种方式(如初始化代码或直接从C编译器)加载到R0中
MOV R0, #140 ; 将140移动到R0寄存器(这通常不是由汇编器直接生成的,而是由编译 器处理)
; 开始循环
LOOP_START:
DEC R0 ; 将R0的值递减1ClrWdt();//一个时钟周期 Nop();//一个时钟周期 Nop(); Nop(); Nop(); BRNZ LOOP_START ; 如果R0不为0,则跳转回LOOP_START ; 循环结束后的代码 ; ...一共有九条指令。所以指令周期为九然后循环140次。
指令周期为一个或几个机器周期
机器周期为时钟周期*n(n取决于单片的不同而不同)
time=机器周期*150=(各个指令周期相加)*140=1/2M*(9+5)*140=0.0098s≈1ms