目录1、关于时钟周期、机器周期和指令周期2、堆栈相关3、临界区你应该知道的一切
1、单片机的时钟周期是什么?机器周期?指令周期?它们之间是什么关系?
2、堆栈的工作原理是什么,都有什么操作流程?
3、什么是临界区,临界区有什么用处?
解析:
1、关于时钟周期、机器周期和指令周期
时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中基本的、小的时间单位。
在一个时钟周期内,CPU仅完成一个基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250us。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的8051单片机的时钟范围是1.2MHz-12MHz。
在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。
机器周期
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。
指令周期
指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
2、堆栈相关
堆栈是内存中一段连续的存储区域,用来保存一些临时的数据,比如,可以保存中断指令INT中的标志寄存器值、代码段寄存器CS值、指令指针寄存器IP值;还可以用以RET指令从中可以得到返回的地址;堆栈还可以保存其他的数据等等。
在汇编语言中堆栈操作由PUSH、POP两条指令来完成。它的操作数均为子类型[两个字节]进行操作。
程序内存可以分为:堆区、栈区、全局区、程序代码区、文字常亮区。在一个程序编译完后,已经为全局变量、静态变量分配好内存空间,所以在函数运行的时候,程序内存要为局部变量非配好栈空间,当中断来时,也需要把函数指针入栈,用来保护当前的情况(保护现场),以便于中断处理完之后可以再回到之前的函数。
栈是从高到低的分配或者说先进后出(就像子弹夹),堆是从低到高的分配(就是先到先买,后到后买)。在一般的交谈中我们所说的堆栈默认为栈(子弹夹)。然而,堆栈可以分为硬堆栈和软堆栈,硬堆栈就是SP(stack pointer栈顶元素的下一个位置,所以数据入栈的时候,SP先加1,再压入数据,出栈时,数据先出,然后SP再减1),软堆栈就是在硬堆栈和全局变量区之间的空间。
3、临界区你应该知道的一切
1.临界段代码,也叫临界区,是指那些必须完整连续运行,不可被打断的代码段。
2. 读取或者修改变量(特别是用于任务间通信的全局变量)的代码,一般来说这是常见的临界代码。
调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。总之,对于临界段要做到执行时间越短越好,否则会影响系统的实时性。
3.中断处理程序和任务都会访问的临界段代码,需要使用关中断的方法加以保护;仅由任务访问的临界段代码,可以通过给调度器上锁的方法来保护。