中断优先级

从单片机到操作系统⑦——深入了解FreeRTOS的延时机制

半世苍凉 提交于 2019-12-01 10:20:50
没研究过操作系统的源码都不算学过操作系统 FreeRTOS 时间管理 时间管理包括两个方面:系统节拍以及任务延时管理。 系统节拍: 在前面的文章也讲得很多,想要系统正常运行,那么时钟节拍是必不可少的, FreeRTOS 的时钟节拍通常由 SysTick 提供,它周期性的产生定时中断,所谓的时钟节拍管理的核心就是这个定时中断的服务程序。 FreeRTOS 的时钟节拍isr中核心的工作就是调用 vTaskIncrementTick() 函数。具体见上之前的文章。 延时管理 FreeRTOS提供了两个系统延时函数: 相对延时函数 vTaskDelay() 绝对延时函数 vTaskDelayUntil() 。 这些延时函数可不像我们以前用裸机写代码的延时函数操作系统不允许CPU在死等消耗着时间,因为这样效率太低了。 同时,要告诫学操作系统的同学,千万别用裸机的思想去学操作系统。 任务延时 任务可能需要延时,两种情况,一种是任务被 vTaskDelay 或者 vTaskDelayUntil 延时,另外一种情况就是任务等待事件(比如等待某个信号量、或者某个消息队列)时候指定了 timeout (即最多等待timeout时间,如果等待的事件还没发生,则不再继续等待),在每个任务的循环中都必须要有阻塞的情况出现,否则比该任务优先级低的任务就永远无法运行。 相对延时与绝对延时的区别 相对延时

从0开始学FreeRTOS-(任务调度)-4

杀马特。学长 韩版系。学妹 提交于 2019-12-01 10:19:26
大家晚上好,我是杰杰,最近挺忙的,好久没有更新了,今天周末就吐血更新一下吧! # 前言 `FreeRTOS`是一个是实时内核,任务是程序执行的最小单位,也是调度器处理的基本单位,移植了`FreeRTOS`,则避免不了对任务的管理,在多个任务运行的时候,任务切换显得尤为重要。而任务切换的效率会决定了系统的稳定性与效率。 `FreeRTOS`的任务切换是干嘛的呢,`rtos`的实际是永远运行的是具有最高优先级的运行态任务,而那些之前在就绪态的任务怎么变成运行态使其得以运行呢,这就是我们`FreeRTOS`任务切换要做的事情,它要做的是找到最高优先级的就绪态任务,并且让它获得cpu的使用权,这样,它就能从就绪态变成运行态,这样子,整个系统的实时性就会很好,响应也会很好,而不会让程序阻塞卡死。 要知道怎么实现任务切换,那就要知道任务切换的机制,在不同的`cpu(mcu)`中,触发的方式可能会不一样,现在是以Cortex-M3为例来讲讲任务的切换。为了大家能看懂本文,我就抛转引玉一下,`引用《Cortex-M3权威指南-中文版》的部分语句(如涉及侵权,请联系杰杰删除)` # SVC 和 PendSV SVC(系统服务调用,亦简称系统调用)和 `PendSV`(`Pended System Call`,可悬起系统调用),它们多用于在操作系统之上的软件开发中。`SVC`

STM32学习笔记一一USART

走远了吗. 提交于 2019-11-30 18:15:54
前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。 1.串口的基本概念 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的DMA方式,可以实现高速数据通信。 2.串口通信连接 接口通过三个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。 RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。 TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时, TX引脚处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。 3.串口设置的一般步骤 对于复用功能的 IO,我们首先要使能 GPIO 时钟,然后使能复用功能时钟,同时要把 GPIO 模式设置为复用功能对应的模式,串口参数的初始化设置,包括波特率,停止位等等参数。在设置完成后就是使能串口。同时

STM32外部中断小结

烂漫一生 提交于 2019-11-30 11:49:21
外部中断 在STM32中,每个IO脚都可以作为外部中断的输入脚。 但是一个饮片不可能配置相同数量的中断线,来接收IO的状态( 上升,下拉,速度等 ),所以, 怎么使中断线和大数量的IO脚进行配对呢? 如上图所示的中断线配置相对应的IO脚,中断线的数量将大幅度的减少。 外部中断的一般配置方法 1、既然是对IO脚线配置,那IO脚的时钟是第一个需要配置的。 __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 __HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟 __HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟 2、配置好IO脚的时钟之后,接着是需要配置IO脚的状态。 (上升,下拉,速度等) 是配置IO脚的状态,需要用到 HAL_GPIO_Init(GPIOA,&GPIO_Initure); 这个函数 GPIO_Initure.Pin=GPIO_PIN_0; //PA0 GPIO_Initure.Mode=GPIO_MODE_IT_RISING; // GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速 HAL_GPIO_Init(GPIOA,&GPIO_Initure); 3

关于STM32F中按键中断分析

南笙酒味 提交于 2019-11-30 03:05:40
  在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入中断控制就很有必要,,一旦有中断时间发生,则程序立马跳转到中断向量的执行程序中,执行完成后就恢复到正常的程序状态。   在STM32F中采用中断控制器NVIC来设定中断。按照中断初始化配置的结构体文件,我们需要在NVIC初始化结构体配置如下:   void EXti_PB12_Config(void)   {   //定义结构体   GPIO_InitTypeDef GPIO_InitStructure;   EXTI_InitTypeDef EXTI_InitStructure;   //开启外设时钟   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);   NVIC_Configuration();   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   GPIO_Init(GPIOB, &GPIO_InitStructure);   //

TMS320F28377学习笔记——SCI串行通信接口

淺唱寂寞╮ 提交于 2019-11-29 23:43:40
本章介绍串行通信接口(SCI)模块的功能和操作。 SCI是一种双线异步串行端口,通常称为UART。 SCI模块支持CPU和使用标准非归零(NRZ)格式的其他异步外设之间的数字通信。 SCI接收器和发送器每个都有一个16级深FIFO,用于减少服务开销,每个都有自己独立的使能和中断位。 两者都可以独立操作以进行半双工通信,或同时进行全双工通信。 为了指定数据完整性,SCI检查接收到的数据是否存在中断检测,奇偶校验,溢出和帧错误。 比特率可通过16位波特选择寄存器编程为不同的速度。 SCI模块的功能包括: •两个外部引脚: SCITXD:SCI发送输出引脚 SCIRXD:SCI接收输入引脚 如果不用于SCI,则两个引脚都可以用作GPIO。 •波特率可编程为64K不同速率 •数据字格式 一个开始位 数据字长度可编程为1至8位 可选偶数/奇数/无奇偶校验位 一个或两个停止位 •四个错误检测标志:奇偶校验,溢出,成帧和​​中断检测 •两种唤醒多处理器模式:空闲线和地址位 •半双工或全双工操作 •双缓冲接收和发送功能 •发送器和接收器操作可以通过具有状态标志的中断驱动或轮询算法来完成。 •发送器和接收器中断的独立使能位(BRKDT除外) •NRZ(不归零)格式 •13个SCI模块控制寄存器位于控制寄存器帧中,从地址7050h开始 该模块中的所有寄存器都是8位寄存器,连接到外设帧2.当访问寄存器时

SylixOS定时器测试误差分析

元气小坏坏 提交于 2019-11-29 14:38:41
测试模型 1.1 测试流程 图 1.1 运行流程 如图 1.1所示为测试代码运行流程,通过GPIO拉高到拉低的时间来判断定时器的精准度。 1.2 测试方法 1.2.1 测试模型 利用ZYNQ内部私有定时器,设置定时时间250μs并绑定中断。在中断服务程序中拉高GPIO,下一次进入中断服务程序时拉低GPIO并且发送二进制信号量。在应用程序中创建高优先级任务接收二进制信号量并且模拟负载,创建10个中优先级任务模拟负载,连接示波器测量时间。 1.2.2 测试干扰项 其他不同优先级的中断; 其他负载程序; 二进制信号量; 1.3 测试结果 程序运行时会产生如图 1.2所示波形。 图 1.2 正常波形 使用示波器抓波功能,如图 1.3图 1.4所示抓取电平拉低与拉高的时间间隔,经过12小时抓取小于242μs的的波形未出现,经过12小时抓取大于258μs的波形未出现。 图 1.3 抓取小于242μs波形 图 1.4 抓取大于258μs波形 测试结果可以看到误差范围在242μs到258μs之间,所以误差大小为±8μs。 误差分析 从程序运行流程来看,到达定时时间250μs后: ○1中断产生; ○2响应中断服务程序; ○3拉GPIO; (一) 如果到达250μs定时时间时,中断产生之前发生系统关中断,则中断无法响应;SylixOS最大关中断时间7μs;此时则可能产生误差; (二)

uCOS-Ⅱ源码分析之uC-CPU文件夹

岁酱吖の 提交于 2019-11-29 14:38:26
此文共连载分析三个uCOS-Ⅱ的三个源码文件夹:uC-CPU 、uC-LIB 、uCOS-Ⅱ uC-LIB文件夹目录: ARM-Cortex-M3 / cpu_a.asm、cpu_c.c、cpu.h cpu_def.h cpu_def.h 这个文件中定义了一些 CPU 有关的宏定义,分为三类: 1、CPU 字节长度的定义,理想情况下 CPU 的字长应该是由 sizeof() 函数计算出来的,但是 sizeof() 函数必须在 CPU 运行中才能进行计算,所以在 uCOS 中直接用宏定义定义了出来 #define CPU_WORD_SIZE_32 4 // 定义 CPU 字节长度为 4 字节 2、CPU 字节顺序的定义,也就是 CPU 的大/小端模式的定义。 #define CPU_ENDIAN_TYPE_NONE 0 // 不知道是大端模式还是小端模式 #define CPU_ENDIAN_TYPE_BIG 1 // 大端模式 #define CPU_ENDIAN_TYPE_LITTLE 2 // 小端模式 3、临界区的定义和配置,临界区是指一个共用资源的程序片段,但共用资源程序片段一次只能被一个线程占用,当有一个线程正在访问临界区时,其他线程或进程就必须等待,以临界区共用资源的互斥使用(举例:打印机的使用,一个用户正在使用打印机,在未使用完成时

操作系统运行机制

醉酒当歌 提交于 2019-11-29 05:12:56
画图操作是系统调用 交互式系统是用户交互的提出请求 使用多级反馈队列 时间片轮转 高级优先级优先 并发执行和顺序执行的不同特性: 1.并发程序在执行期间具有相互制约的关系 2.程序与计算不在一一对应 3.并发程序结果不可更改 4.并发执行的过程失去了封闭性 中断处理程序的入口地址在中断向量表上 动态请求释放系统资源进行系统调用 open文件操作类 允许抢位的系统中 一个进程从运行——>就绪 可能的事件为该进程的时间片用完 用户态到核心态通过唯一途径访管指令 核心态到用户态通过修改程序状态字PSW进行 异常:程序性中断 访管指令异常 中断:时钟中断 I/O中断 控制台中断 硬件故障中断 交互式系统调度算法的设计目标:较快的响应时间 较均衡的性能 程序中断与当前运行的程序有关 处理器包括两类寄存器:一类为用户可见寄存器 第二类为控制和状态寄存器 引起中断的事件是中断源 处理器暂停当前程序 转而进入中断处理程序 中断响应 正在出来运行程序的暂停点 中断断点 系统分为三类环境:批处理环境 交互式环境 实时环境 过程调用在调用完成前返回调用程序系统先运行调度程序再返回调用程序 PCB进程控制块主要有:进程名 进程号 存储信息 优先级 当前状态 资源清单 家族关系 消息队列 进程队列 当前打开文件 批处理调度算法:先来先服务 最短作业优先 响应比最高者优先 时间片轮转

linux中断

北城以北 提交于 2019-11-29 00:40:23
INT-中断 按照CPU与中断源(把能够提出中断请求的设备和事件称为中断源)的位置关系可分为 内部中断和外部中断。 内部中断:也称为异常中断,属于非屏蔽中断,是处理器检测到异常情况或执行软件 中断指令引起的一种中断。通常有:除法出错中断(INT0)、断点中断(INT3)、 溢出中断(INT4)和单步执行中断(INT1)等。异常又分为故障和陷阱。 外部中断:也称为硬件中断,是由CPU外部引脚触发的一种中断, 分为不可屏蔽中断NMI(INT2)和可屏蔽中断INTR。 中断源的优先权级别 内部中断最高(除单步执行中断),其次为NMI中断,再次为INTR中断。单步执行中断最低 中断响应 CPU在每条指令执行结束之后,都会去查询有无中断申请。 PIC-可编程中断控制器 PIC(programming interrupt controller),8259可编程中断控制芯片可以管理8个中断源, 通过级联可以构成64个中断向量系统 工作过程:当PIC向cpu处理器的INT引脚发送一个中断信号时候,处理器停下所做事情 询问PIC需要执行那个服务请求,PIC发送终端号,查询中断向量表,执行中断服务程序 原理:8259A芯片可以处于编程状态和操作状态,cpu可以通过IN/OUT指令对芯片 进行初始化编程,还可以通过操作字命令修改中断处理方式,完成了初始化编程, 芯片即进入操作状态