中断优先级

操作系统运行机制

匿名 (未验证) 提交于 2019-12-02 23:57:01
画图操作是系统调用 交互式系统是用户交互的提出请求 使用多级反馈队列 时间片轮转 高级优先级优先 中断处理程序的入口地址在中断向量表上 动态请求释放系统资源进行系统调用 交互式系统调度算法的设计目标:较快的响应时间 较均衡的性能 程序中断与当前运行的程序有关 引起中断的事件是中断源 来源:博客园 作者: insist钢 链接:https://www.cnblogs.com/liugangjiayou/p/11456595.html

ARM NVIC控制器(基于cortex-M4)

匿名 (未验证) 提交于 2019-12-02 23:57:01
中断控制寄存器映射 中断寄存器的基地址为0xE000E000,所有中断控制/状态寄存器都只能在特权级下访问(除软件触发中断寄存器外),寄存器映射列表见表3-2。也可以参考cortex-m4使用手册,并推荐使用CMSIS函数来访问相关功能。 表3-2 中断寄存器映射 偏移量 名称 位宽 类型 复位值 描述 0x100-0x11C ISER0-ISER7 32 R/W 0x00000000 中断使能寄存器,寄存器0为(IRQ0~IRQ31),以此类推 0x180-0x19C ICER0-ICER7 32 R/W 0x00000000 中断清除使能寄存器,寄存器0为(IRQ0~IRQ31),以此类推 0x200-0x21C ISPR0-ISPR7 32 R/W 0x00000000 中断挂起寄存器,寄存器0为(IRQ0~IRQ31),以此类推 0x280-0x29C ICPR0-ICPR7 32 R/W 0x00000000 中断挂起清除寄存器寄存器0为(IRQ0~IRQ31),以此类推 0x300-0x31C IABR0-IABR7 32 RO 0x00000000 中断活动状态寄存器寄存器0为(IRQ0~IRQ31),以此类推 0x400-0x4EF IPR0-IPR59 32 R/W 0x00000000 中断优先级寄存器0寄存器0为(IRQ0~IRQ3),以此类推 0xD08

单片机知识点

匿名 (未验证) 提交于 2019-12-02 23:47:01
1. 在单片机应用系统中,为节省 I/O 引脚,多个 LED 数码管显示电路常采用 动态 显示方式。动态显示方式涉及段选和位选,共阴极位选是低电平选通,段选是高电平选  通;共阳极位选是高电平选通,段选是低电平选通。 2. 中断的处理过程按顺序包括:中断请求,中断响应,中断处理,中断返回。 4. IT=0 是脉冲触发方式,IT=1 是低电平触发方式。 5. P0,P2,P3口有第二功能,P1口只作为输入输出口。 6. 以 MCS-51 单片机为例,说明 CPU 相应中断的顺序怎样?   a. 当处于同一优先级时:按照外部中断0,定时/计时器0,外部中断1,定时/计时器1,串行口中断的顺序   b. 当处于不同优先级时:按照从高优先级到低优先级执行。   c. 当处于中断嵌套时:当一个中断正在执行的时候,如果事先设置了中断优先级寄存器 IP ,那么当一个高优先级的中断到来的时候会发生中断嵌套。 7. 与 :同时为1,结果才是1。 或:只要有一个1,结果就是1。 异或:相同是0,不同是1。 8. 定时/计数器模式1,响应中断后,需要重载计数初值。 定时1 s ,采用模式一以50 ms 为定时基准,计数20次。 9. 机器周期 = 12 个振荡周期。振荡周期 = 1 / 晶振频率 。由此可求出机器周期 T 。  定时器计数初值 X 公式:t = (2^N - X)*T 。 t

ISA真慢

与世无争的帅哥 提交于 2019-12-02 23:31:19
计划没有变化快,周一计划的任务几乎没怎么做,时间完全交给了一个BUG; 最近大家在做新主板的功能,同事说DeviceNet不通,尽管我对DeviceNet一点不懂,不过好歹之前测过CAN模块在新主板上的功能,于是负责起了这个bug; 电脑连上CAN分析仪,包都看不到,上哪通去?搞硬件的同时出差了,没人懂连线的方法,算了,自己试吧;反复接线,终于接通了,在我这的环境,改了改代码,能够看到数据包了; 同事拿过去一看,依然不行,然后问我怎么改的代码,我跟她一起看的时候,注意到我们的代码里的波特率居然跟标准的不一样??什么?这。。。改成一样的,拿到同事环境,果然那边也通了;问了下上面,说是跟具体硬件有关,以前是故意这样写的; 连上DeviceNet模块吧,一试,不通啊!!同事说把发送周期调大一点吧,改之,果然,通了; 好吧!这是为什么??难道是别的线程的优先级太高了,抢占了当前发送线程??于是我把相关的3个线程绑定到一个CPU上,而且只有他们3个线程;他们的优先级也规划好;启动,依然不通; 打日志吧;看到错误是发送缓冲区已满;还是怀疑优先级影响了调度,于是将填充队列线程的优先级降低,不受其他线程影响;启动,依然不通;但是这个填充线程还是调用了,证明,两个更高优先级的线程主动放弃了CPU; 于是在库写函数的前后加日志,以确定是否写入卡住了;果然,经过一些拍之后,就会出现一次卡主的情况

编码器学习笔记(1)

匿名 (未验证) 提交于 2019-12-02 22:56:40
达成目标:测出电机的转速以及位置 单片机:stm32F4 主要详细配置以下部分: (1)定时器中断及中断配置(定时器中断中转化电机转动速度与位置参数) (2)外部中断及外部中断配置 1)定时器中断配置及中断函数 定时器中断配置 TIM3_Int_Init( 1000 - 1 , 8400 - 1 ) ; 定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数5000次为500ms 1)定义中断及抢占优先级名称 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; 2)使能TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE) ; 3)设置自动重装载寄存器周期的值 TIM_TimeBaseInitStructure.TIM_Period = arr; 4)设置时钟频率除数的预分频值 TIM_TimeBaseInitStructure.TIM_Prescaler = psc; 5)设置向上计数模式 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; 6)设置时钟分割 TIM

linux0.11进程调度详解

匿名 (未验证) 提交于 2019-12-02 21:59:42
sched_init() set_tss_desc() & set_ldt_desc() ltr() & lldt() LATCH do_timer() 璺宠浆 文章写的有些长,把相关的、用到的函数都列出来了,看完应该能对进程调度相关的代码有一定了解 sched_init() kernel/sched.c : 385 该函数只有36~40行与进程调度有关,只想了解进程调度的同学可以忽略该函数其他部分 void sched_init( void ) { int i; struct desc_struct * p; if ( sizeof ( struct sigaction) != 16 ) panic( "Struct sigaction MUST be 16 bytes" ); //以下两行初始化init任务(任务0)的任务状态段描述符和局部数据表描述符 //详细介绍见下文 set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss)); set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt)); p = gdt+ 2 +FIRST_TSS_ENTRY; //指向gtd表中init任务的后一个任务的任务状态段描述符 for (i= 1 ;i<NR_TASKS;i++) { /

AVR_Interrupt

我是研究僧i 提交于 2019-12-02 03:01:36
https://blog.csdn.net/dandri/article/details/54799300 #AVR中断系统与基本应用(ATMega16)##一、中断的基本概念###1.1中断的基本概念 中断是指计算机自动响应的一个中断请求信号,暂时停止(中断)当前程序的执行,转而执行为外部设备服务 的型号(中断服务程序),并在执行完服务程序后自动返回原程序的过程。具有的优势实现实时处理实现分时操作,提高MCU的处理效率进行故障处理待机状态的唤醒###1.2中断的处理过程 由于MCU处理完中断之后需要返回原程序,因此,要在执行中断之前,要将主程序中断处的地址,即断点处(实际上是程序计数器PC的当前地址值——即即将执行的主程序的下一条指令,即图中的k + 1处)保护起来,称为保护断点除了保护断点,在程序执行之前,还要把有关的数据保护起来,称为中断现场保护,方便在返回主程序的时候继续执行,这一过程称为恢复现场和恢复断点简单说,在响应中断的时候,MCU的硬件系统会将断点地址压进系统的堆栈保护,而在执行中断返回指令时,硬件系统又会自动将断点地址弹出到程序计数器PC中。###1.3中断源、中断信号和中断向量中断源一般可分为内部中断和外部中断典型的中断有定时器溢出中断,ADC完成中断等系统中的外部设备也可以作为中断源,这些中断源位于单片机外部

单片机成长之路(51基础篇) - 026 基于stm89c52之单片机看门狗

早过忘川 提交于 2019-12-01 17:09:50
基于stc89c52的看门狗,代码如下: main.c 1 #include "stc89c5x_Quick_configuration.h"    // 自定义头文件 2 #include "data.h" 3 #include "bsp_gpio.h" 4 #include "bsp_wdt.h" 5 6 void init_OS_Time(void){ 7 DATA.Time.Time_Interrupt = 1; // 设置步长 8 DATA.Time.Interrupt_count = 0; // 设置单位步数 9 DATA.Time.Time_s = 0; // 时间 s 10 DATA.Time.Time_h = 0; // 时间 h 11 DATA.Time.Time_day = 0; // 时间 日 12 DATA.Time.Time_month = 0; // 时间 月 13 DATA.Time.Time_year = 0; // 时间 年 14 } 15 16 void main(void){ 17 init_OS_Time(); 18 init_WDT(); 19 while(1){ 20 ; 21 } 22 } bsp_wdt.h 1 #ifndef __BSP_WDT_H_ 2 #define __BSP_WDT_H_ 3 4 /*-----------

STM32串口通信配置(USART1+USART2+USART3+UART4) (转)

可紊 提交于 2019-12-01 15:27:08
  一、串口一的配置(初始化+中断配置+中断接收函数)   1 /*===============================================================================   2 Copyright:   3 Version:   4 Author:   5 Date: 2017/11/3   6 Description:   7 配置独立看门狗初始化函数,在主函数中运行IWDG_ReloadCounter进行喂狗主函数必须在4s内进行一次喂狗不然系统会复位;   8 函数功能是将接收固定长度的字符串,并将接收后的字符串通过串口发送出去   9 revise Description:   10 ===============================================================================*/   11 #include "stm32f10x_usart.h"   12 #include "stm32f10x.h"   13 #include "stm32f10x_iwdg.h"   14   15 u8 USART1_RX_BUF[21];   16 u8 USART1_RX_CNT=0;   17   18 void IWDG_Configuration

STM32之串口DMA接收不定长数据

风流意气都作罢 提交于 2019-12-01 13:37:59
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口中断,在中断中读取数据就行了! 中断就是打断程序正常运行,怎么能保证高效呢?经常把主程序打断,主程序还要不要运行了? 同学B:串口可以配置成用DMA的方式接收数据,等接收完毕就可以去读取了! 这个同学是对的,我们可以使用DMA去接收数据,不过DMA需要定长才能产生接收中断,如何接收不定长的数据呢? DMA简介 题外话:其实,上面的问题是很有必要思考一下的,不断思考,才能进步。 什么是DMA DMA :全称Direct Memory Access,即直接存储器访问 DMA 传输将数据从一个地址空间复制到另外一个地址空间。CPU只需初始化DMA即可,传输动作本身是由 DMA 控制器来实现和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。这样的操作并没有让处理器参与处理,CPU可以干其他事情,当DMA传输完成的时候产生一个中断,告诉CPU我已经完成了,然后CPU知道了就可以去处理数据了,这样子提高了CPU的利用率,因为CPU是大脑,主要做数据运算的工作,而不是去搬运数据。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。 在STM32的DMA资源 STM32F1系列