1系统中断与时钟节拍
单片机系统的时钟与定时器设计原理详解

单片机系统的时钟与定时器设计原理详解引言:随着现代电子技术的快速发展,单片机在各个领域得到了广泛应用。
在单片机系统中,时钟和定时器是非常重要的组成部分。
时钟用来驱动整个单片机系统的节奏,而定时器用于实现各种时间相关的功能。
本文将详细解析单片机系统中时钟和定时器的设计原理。
一、时钟设计原理:在单片机系统中,时钟充当着同步整个系统操作的功能。
它是一个稳定可靠的信号源,用于指导单片机各个部件的工作。
时钟信号通常由晶体振荡器产生,通过芯片内部的倍频电路进行频率提升。
常见的时钟频率有4MHz、8MHz、16MHz等。
时钟的设计需要考虑以下几个方面:1. 稳定性:时钟信号必须具有高稳定性,以确保整个系统的正常运行。
通常使用石英晶体作为振荡器,由于石英晶体具有稳定频率的特性,因此可以提供可靠和精确的时钟信号。
2. 频率选择:时钟频率的选择应根据具体的应用需求进行。
较高频率的时钟可以提高系统的处理速度,但同时也会增加功耗。
因此,在设计时应合理选择适当的时钟频率。
3. 电源噪声:电源噪声对时钟信号的稳定性有很大影响。
为了减小电源噪声对时钟的干扰,可以采用电源滤波电路,提高时钟信号的抗干扰能力。
4. 时钟分频:有时候需要减小时钟频率用于驱动其他外设,可以通过时钟分频器来实现。
分频器可以将高频的时钟信号分频得到较低频率的时钟信号。
二、定时器设计原理:定时器在单片机系统中有着广泛的应用,可以实现延时、定时、脉冲生成等功能。
定时器通常由一个计数器和相关的控制逻辑组成。
定时器的设计需要考虑以下几个方面:1. 计数器选择:在选择定时器时,需要根据需求选择适当的计数器位数。
通常,8位计数器可以计数255个时间单位,16位计数器可以计数65535个时间单位。
计数器的位数越大,可以表示的时间范围就越大,但同时也会增加硬件成本和资源占用。
2. 定时器模式:定时器可以有不同的工作模式,如定时模式、脉冲计数模式等。
定时模式用于实现定时功能,脉冲计数模式用于计算脉冲的个数。
时钟周期 以中断为背景

时钟周期以中断为背景时钟中断是操作系统最重要的中断,操作系统内核依靠时钟中断完成时间片计算和分配、定时等管理工作,是分时机制实现的基础。
可以说如果没有时钟中断,操作系统将无法正常运行。
时钟中断由专门的时钟芯片产生,比如PC机上的8253芯片。
大多数的操作系统实现,时钟中断周期会维持在10ms到100ms之间,比如Windows操作系统,其时钟中断周期一般为10ms或者20ms。
表面上看,似乎时钟中断周期越短,系统的实时性越好,因为进程或线程的运行时间片会被控制的越精确,优先级高的进程或线程会优先得到运行。
但仔细分析起来,会发现实际并不是这么回事,时钟中断周期的大小与系统整体实时性关系并不十分紧密。
可用两个指标来衡量操作系统的实时性:一个是中断响应时间,即从外部中断发生,到得到操作系统处理之间的时间;另外一个是任务切入时间,即一个高优先级的线程运行所需的资源就绪,到得到调度所需的时间。
时钟中断周期的大小,与这两个指标并无直接关联。
首先看中断响应时间,这个时间与硬件系统关联紧密。
中断一般由外部设备引发,外部设备的控制电路连接到计算机的中断控制器上(比如PC的8259A芯片)。
一旦外部设备发生中断,设备会通过一条中断引脚通知中断控制器,中断控制器根据输入引脚的状态(比如是否禁止引发中断)、输入引脚的优先级、连接到片上的其它中断引脚的情况,综合判断是否需要对该中断进行处理。
如果判断结果为进一步处理,则通过CPU的中断输入(比如x86CPU的INTR信号)通知CPU。
CPU并不会马上处理中断,而是有一套比较复杂的判断机制,判断是否对刚刚输入的中断进行响应。
最重要的决定因素有两个:一个是CPU只会在一条指令执行完毕后才会检查中断状态,如果CPU正处于一条指令的执行过程中(需要注意的是,CPU执行一条指令,有时候会需要很多个CPU节拍的),中断是不会被处理的。
另外一个因素是中断使能标志是否被清除(比如x86 CPU标志寄存器中的中断使能位)。
单片机中的中断与定时器的原理与应用

单片机中的中断与定时器的原理与应用在单片机(Microcontroller)中,中断(Interrupt)和定时器(Timer)是重要的功能模块,广泛应用于各种嵌入式系统和电子设备中。
本文将介绍中断和定时器的基本原理,并探讨它们在单片机中的应用。
一、中断的原理与应用中断是指在程序执行过程中,当发生某个特定事件时,暂停当前任务的执行,转而执行与该事件相关的任务。
这样可以提高系统的响应能力和实时性。
单片机中的中断通常有外部中断和定时中断两种类型。
1. 外部中断外部中断是通过外部触发器(如按钮、传感器等)来触发的中断事件。
当外部触发器发生状态变化时,单片机会响应中断请求,并执行相应的中断服务程序。
外部中断通常用于处理实时性要求较高的事件,如按键检测、紧急报警等。
2. 定时中断定时中断是通过定时器来触发的中断事件。
定时器是一种特殊的计时设备,可以按照设定的时间周期产生中断信号。
当定时器倒计时完成时,单片机会响应中断请求,并执行相应的中断服务程序。
定时中断常用于处理需要精确计时和时序控制的任务,如脉冲计数、PWM波形生成等。
中断的应用具体取决于具体的工程需求,例如在电梯控制系统中,可以使用外部中断来响应紧急停车按钮;在家电控制系统中,可以利用定时中断来实现定时开关机功能。
二、定时器的原理与应用定时器是单片机中的一个重要模块,可以用于计时、延时、频率测量等多种应用。
下面将介绍定时器的工作原理和几种常见的应用场景。
1. 定时器的工作原理定时器是通过内部时钟源来进行计时的。
它通常由一个计数器和若干个控制寄存器组成。
计数器可以递增或递减,当计数值达到设定值时,会产生中断信号或触发其他相关操作。
2. 延时应用延时是定时器最常见的应用之一。
通过设定一个合适的计时器参数,实现程序的精确延时。
例如,在蜂鸣器控制中,可以使用定时器来生成特定频率和持续时间的方波信号,从而产生不同的声音效果。
3. 频率测量应用定时器还可以用于频率测量。
嵌入式实时操作系统试题

嵌⼊式实时操作系统试题1、⽬前使⽤的嵌⼊式操作系统主要有那些?请举出六种常⽤的。
Windwos CE、Windows Mobile、VxWork、Linux、uCos、Symbian、QNX2、⼀般⽽⾔,嵌⼊式系统的架构可以分为4个部分,分别是(处理器)、存储器、输⼊输出和软件,⼀般软件分为(操作系统)和应⽤软件两个主要部分。
3、从嵌⼊式操作系统特点可以将嵌⼊式操作系统分为(实时操作系统)和分时操作系统,其中实时系统可分为(硬实时系统)和软实时系统4、uc/os操作系统不包括以下哪集中状态A、运⾏B、挂起C、退出D、休眠5、0x70&0x11的运算结果是A、0x1B、0x11C、0x17D、0x76、下列哪种⽅式不是ucos操作系统中任务之间的通信⽅式A、信号量B、消息队列C、邮件D、邮箱7、在将ucos操作系统移植到ARM处理器上时,以下那些⽂件不需要修改A、OS_CORE.CB、include.hC、OS_CPU.HD、OSTaskInit设计实时操作系统时,⾸先应该考虑系统的()。
A.可靠性和灵活性B.实时性和可靠性C.分配性和可靠性D.灵活性和实时性2. ⼤多数嵌⼊式实时操作系统中,为了让操作系统能够在有突发状态时迅速取得控制权,以作出反映,⼤都采⽤()的功能。
A:抢占式任务调度B:时间⽚轮转调度C:单调速率调度D:FIFO调度8、所有的电⼦设备都属于嵌⼊式设备简单题:1、根据嵌⼊式系统的特点、写出嵌⼊式系统的定义答:以应⽤为中⼼,以计算机技术为基础,软硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专⽤计算机系统2、试分析实时操作系统的⼯作特点及相互之间的转换运⾏:获得CPU的控制权就绪:进⼊任务等待队列,通过调度中转为运⾏状态挂起:由于系统函数调⽤⽽被设置成挂起状态,任务发⽣阻塞,等待系统实时事件的发⽣⽽被唤醒,从⽽转为就绪或运⾏。
休眠:任务完成或者错误被清除的任务,该任务此时不具有任务控制块。
《嵌入式实时操作系统复习资料》

一、填空题(请将答案填入题后括号中):共10小题,每小题2分,满分20分。
1、一般而言,嵌入式系统的构架可以分为4个部分:分别是(处理器)、存储器、输入/输出和软件,一般软件亦分为操作系统相关和(应用软件)两个主要部分。
2、根据嵌入式系统使用的微处理器,可以将嵌入式系统分为嵌入式微控制器,(嵌入式微处理器)(嵌入式DSP处理器)以及片上系统。
3、操作系统是联接硬件与应用程序的系统程序,其基本功能有(任务管理)、任务间通信、(内存管理)和I/O资源管理。
4.实时系统:指系统能够在限定的(响应)时间内提供所需水平的服务5.ucos-ii最多管理(64 )个任务6.ucos-ii中,OS_TaskStat任务的优先级占(62 ),OS_TaskIdle任务的优先级是( 63 )7 ucos-ii中,OSRdyTbl就绪表的大小是由宏定义:OS_RDY_TBL_SIZE来定义,由全局宏( OS_LOWEST_PRIO )来决定的,8. TCB中的四个成员变量:INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY ,用于(加速)任务就绪态的计算过程。
9.TCB内部最重要的元素放在第一个单元叫(OSTCBStkPtr),因此,这个变量是惟一一个能用汇编语言处置的变量,将其放在结构最前面,使得在汇编语言中处理这个变量时较为容易。
10.uC/OS-II是一个简洁、易用的基于优先级的嵌入式(抢占式)多任务实时内核。
11.任务是一个无返回的无穷循环。
uc/os-ii总是运行进入就绪状态的(最高优先级)的任务。
12.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。
所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由调度器(scheduler)来完成的。
13.(不可剥夺型)内核要求每个任务自我放弃CPU的所有权。
不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。
时钟节拍——精选推荐

时钟节拍 时钟节拍可谓是 uC/OS 操作系统的⼼脏,它若不跳动,整个系统都将会瘫痪。
时钟节拍就是操作系统的时基,操作系统要实现时间上的管理,必须依赖于时基。
时钟节拍就是系统以固定的频率产⽣中断(时基中断),并在中断中处理与时间相关的事件,推动所有任务向前运⾏。
时钟节拍需要依赖于硬件定时器,在 STM32 裸机程序中经常使⽤的 SysTick 时钟是 MCU的内核定时器,通常都使⽤该定时器产⽣操作系统的时钟节拍。
⽤户需要先在“os_cfg_app.h”中设定时钟节拍的频率,该频率越⾼,操作系统检测事件就越频繁,可以增强任务的实时性,但太频繁也会增加操作系统内核的负担加重,所以⽤户需要权衡该频率的设置。
秉⽕在这⾥采⽤默认的 1000 Hz(本书之后若⽆特别声明,均采⽤1000 Hz),也就是时钟节拍的周期为 1 ms。
设置时钟节拍的频率:/* ------------------------ TICKS ----------------------- */#define OS_CFG_TICK_RATE_HZ 1000u // 时钟节拍频率 (10 to 1000 Hz)#define OS_CFG_TICK_TASK_PRIO 10u // 时钟节拍任务 OS_TickTask() 的优先级#define OS_CFG_TICK_TASK_STK_SIZE 128u // 时钟节拍任务 OS_TickTask() 的栈空间⼤⼩#define OS_CFG_TICK_WHEEL_SIZE 17u // OSCfg_TickWheel 数组的⼤⼩,推荐使⽤任务总数/4,且为质数View Code 在app.c中的起始任务 AppTaskStart() 中初始化时钟节拍定时器,其实就是初始化 STM32 内核的 SysTick 时钟。
初始化 SysTick 时钟:cpu_clk_freq = BSP_CPU_ClkFreq(); //获取 CPU 内核时钟频率(SysTick ⼯作时钟)cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; //根据⽤户设定的时钟节拍频率计算 SysTick 定时器的计数值OS_CPU_SysTickInit(cnts); //调⽤ SysTick 初始化函数,设置定时器计数值和启动定时器View Code OS_CPU_SysTickInit() 函数的定义位于“os_cpu_c.c” :void OS_CPU_SysTickInit (CPU_INT32U cnts){CPU_INT32U prio;/* 填写 SysTick 的重载计数值 */CPU_REG_NVIC_ST_RELOAD = cnts - 1u; // SysTick 以该计数值为周期循环计数定时/* 设置 SysTick 中断优先级 */prio = CPU_REG_NVIC_SHPRI3;prio &= DEF_BIT_FIELD(24, 0);prio |= DEF_BIT_MASK(OS_CPU_CFG_SYSTICK_PRIO, 24); //设置为默认的最⾼优先级0,在裸机例程中该优先级默认为最低CPU_REG_NVIC_SHPRI3 = prio;/* 使能 SysTick 的时钟源和启动计数器 */CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_CLKSOURCE |CPU_REG_NVIC_ST_CTRL_ENABLE;/* 使能 SysTick 的定时中断 */CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_TICKINT;}View Code SysTick 定时中断函数 OS_CPU_SysTickHandler() 的定义也位于“os_cpu_c.c”,就毗邻 OS_CPU_SysTickInit() 函数定义体的上⽅。
【FreeRTOS操作系统教程】第16章 FreeRTOS调度锁,任务锁和中断锁

调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函数,处于调度锁开和调 度锁关之间的代码在执行期间是不会被高优先级的任务抢占的,即任务调度被禁止。这一点要跟临界段的 作用区分开,调度锁只是禁止了任务调度,并没有关闭任何中断,中断还是正常执行的。而临界段进行了 开关中断操作。
利用 FreeRTOS 的调度锁功能给调度器加锁的话,将关闭任务切换功能,从而高优先级任务也就无法 抢占低优先级任务的执行,同时高优先级任务也是无法向低优先级任务切换的。另外特别注意,调度 锁只是禁止了调度器工作,并没有关闭任何中断。 通过关闭任务切换中断 PendSV 和系统时钟节拍中断 Systick
#define INCLUDE_vTaskPrioe INCLUDE_uxTaskPriorityGet
1
#define INCLUDE_vTaskDelete
#define portGET_RUN_TIME_COUNTER_VALUE()
ulHighFrequencyTimerTicks
//#define portALT_GET_RUN_TIME_COUNTER_VALUE
1
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES
2016年06月30日
版本:1.0
第 4 页 共 28 页
武汉安富莱电子有限公司
安富莱 STM32-V6 开发板 FreeRTOS 教程
{ while(1) { vTaskSuspendAll(); /* 开启调度锁 */ printf("任务 vTaskLED 正在运行\r\n"); xTaskResumeAll (); if(!xTaskResumeAll()) /* 关闭调度锁,如果需要任务切换,此函数返回 pdTRUE,否则返回 pdFALSE */ { taskYIELD (); }
时钟中断调度的原理

时钟中断调度的原理
时钟中断调度是操作系统中的一种调度方式,它基于中断的机制实现。
当时钟中断发生时,操作系统会暂停当前任务的执行,切换到另一个任务,以实现多任务并发执行。
时钟中断调度的原理如下:
1. 定时中断:操作系统会设置一个时钟中断定时器,它会在固定的时间间隔内产生一个时钟中断。
这个时间间隔通常被称为时间片(time slice),一般设置为几毫秒或十几毫秒。
2. 中断处理程序:当时钟中断发生时,CPU会立即跳转到操作系统的中断处理程序。
中断处理程序是操作系统内核的一部分,它会执行一系列的操作,包括保存当前执行任务的上下文,切换到另一个任务的上下文等。
3. 任务切换:在中断处理程序中,操作系统会选择一个新的任务来执行。
这个选择可以基于各种调度算法,例如轮转调度、优先级调度等。
4. 上下文切换:在中断处理程序中,操作系统会保存当前任务的上下文,包括寄存器的值、栈指针等,然后加载新任务的上下文,将控制权交给新的任务。
这样,新任务就开始执行了。
5. 恢复执行:当操作系统完成任务切换后,它会返回到中断发生前的程序继续执行。
这样,原来的任务就被暂停了,而新的任务开始运行。
通过时钟中断调度,操作系统能够以很短的时间片轮转方式,实现多任务并发执行。
每个任务都能够获得一定的执行时间,从而提高系统的吞吐量和响应速度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 系统中断与时钟节拍
1.1 系统中断
中断是种硬件机制用于通知CPU有个异步事件发生了中断旦被系统识别CPU则保存部分(或全部)现场
(context)即部分(或全部)寄存器值跳转到专门子称为中断服务子(ISR)中断服务子做事件处理处理完成后执行任务调度回到就绪态优先级最高任务开始运行(对于可剥夺型内核)中断使得CPU可以在事件发生时才予以处理而不必让微处理器连续不断地查询(polling)是否有事件发生通过两条特殊指令:关中断(disable errupt)和开中断(enable errupt)可以让微处理器不响应或响应中断在实时环境中关中断时间应尽量短关中断影响中断响应时间关中断时间太长可能会引起中断丢失中断服务处理时间应该尽可能短中断服务所做事情应该尽可能少应把大部分工作留给任务去做
1.2 系统时钟节拍
时钟节拍是特定周期性中断(时钟中断)这个中断可以看作是系统心脏脉动操作系统通过时钟中断来确定时间间隔实现时间延时及确定任务超时中断之间时间间隔取决于不同应用般在10~200 ms之间时钟节拍式中断使得内核可以将任务延时若干个整数时钟节拍以及当任务等待事件发生时提供等待超时依据时钟节拍频率越快系统额外开销就越大系统定义了32位无符号整数OSTime来记录系统启动后时钟滴答数目用户必须在多任务系统启动以后再开启时钟节拍器也就是在OSStart之后μC/OSII中时钟节拍服务是通过在中断服务子中OSTimeTick实现时钟节拍中断服务子示意代码如下:
void OSTickISR(void) {
保存处理器寄存器值;
OSIntEnter 或是将OSIntNesting加1;
OSTimeTick ;
OSIntExit ;
恢复处理器寄存器值;
执行中断返回指令;
}
2 时钟管理系统
2.1 μC/OSII时钟管理系统
μC/OSII原有时钟管理系统类似于Linux但是比Linux简单得多它仅向用户提供个周期性信号OSTime时钟频率可以设置在10~100 Hz时钟硬件周期性地向CPU发出时钟中断系统周期性响应时钟中断每次时钟中断到来时中断处理更新个全局变量OSTimeμC/OSII时钟中断服务核心是OSTimeTick OSTimeTick 用来判断延时任务是否延时结束从而将其置于就绪态其伪代码如下:
void OSTimeTick(void) {
OSTimeTickHook;// 用户定义时钟节拍外连
while { (除空闲任务外所有任务)
OS_ENTER_CRITICAL;//关中断
对所有任务延时时间递减;
扫描时间到期任务并且唤醒该任务;
OS_EXIT_CRITICAL;//开中断
指针指向下个任务;
}
OSTime;//累计从开机以来时间
}
在μC/OSII时钟节拍中需要执行用户定义时钟节拍外连OSTimeTickHook 以及对任务链表进行扫描并且递减任务延时这样就造成了时钟节拍OSTimeTick 有两点不足:
①在时钟中断中处理额外任务OSTimeIickHook 这样增加了中断处理负担影响了定时服务准确性;
②在关中断情况下扫描任务链表任务越多所需要时间越长而长时间关中断对中断响应有不利影响是中断处理应当避免
2.2 改进时钟管理系统
针对上述OSTimeTick 不足之处需加以改进来优化时钟节拍在Linux中般对中断响应分为两部分:立即中断服务和底半中断处理(bottom half)立即中断服务仅仅做重要并且能快速完成工作而把不太重要需要较长时间完成工作放在底半处理部分来完成这样就可以提高中断响应速度μC/OSII不支持底半处理为了减轻时钟中断处理工作量来提高μC/OSII时钟精确度可以将部分在每次时钟中断需处理工作内容放在任务级来完成这样就可以减少每次时钟中断处理CPU消耗从而提高中断响应速度和μC/OSII时钟精确度为此定义任务OSTimeTask 由它来处理原来在OSTimeTick中需要处理操作μC/OSII采用基于优先级抢占式调度策略而每次时钟中断处理结束后需要首先调度该任务执行因此让任务OSTimeTask具有系统内最高优先级由它执行用户定义时钟节拍外连OSTimeTickHook 以及对所有任务延时时间进行递减并把到期任务链入到链表OSTCBRList中OSTCBRList管理所有到期任务OSTimeTask伪代码如下:
void OSTimeTask {
OSTimeTickHook//用户定义时间处理
while { (除空闲任务外所有任务)
对所有任务延时时间进行递减;
把所有要到期任务链入到OSTCBRList链表中;
} 任务状态改为睡眠OSSched 进行任务调度;
}
在任务OSTimeTask中执行原来在时钟中断处理用户OSTimeIickHook 并实现将延时到期任务链入到OSTCBRList链表中这样在时钟中断中就只需要扫描任务到期链表而不需要扫描整个链表减少了关中断时间,OSTCBRList为新建链表它管理所有到期任务,同时需要减少OSTimeTick 执行工作量只对OSTCBRList链表扫描这样也减少了关中断时间OSTimeTick 伪
代码如下:
void OSTimeTick(void) {
OSTime;
OS_TCB* ptcb=OSTCBList;// OSTCBRList指向所有到期任务链表
while(ptchb!=null){
关中断;
唤醒任务;
开中断;
指针指向下个任务;
}
}。