中断处理

uC/OS-III和FreeRTOS的区别

落花浮王杯 提交于 2019-12-16 07:30:22
在阅读完uC/OS-III(V3.03.01)和FreeRTOS(V10.0.1)的源码后,我对RTOS有了较深的认识。现将它们之间的一些区别总结出来,有利于大家理解这两个RTOS。 1、uCOS-III中所有的内核对象(如任务控制块、消息队列、信号量等)都是静态创建的,需要用户提供。FreeRTOS中的内核对象支持动态和静态两种创建方法。 (PS: 其实系统提不提供动态创建功能并不那么重要,因为在静态创建的方法的基础上加入内存管理机制,就能自已封装实现动态创建函数) 2、uCOS-III中的任务状态较多,因为它存在“基本状态+挂起状态”这类状态,FreeRTOS中挂起态是个单独的状态。在FreeRTOS中,如果suspend一个正在阻塞的任务,API内部会把任务从相应阻塞表中删除,并将其挂在xSuspendedTaskList上,当该任务被resume后,它就是就绪态,而不会重新返回阻塞态。而uCOS-III中的任务即便在阻塞时被suspend了,它依然处于阻塞态(即等待某个事件发生),如果在suspend的过程中事件发生了,它将解除阻塞态,变为纯粹的挂起态;如果在resume后,该事件仍未发生,它将解除挂起态,变为阻塞态。 (PS: 我感觉uCOS-III中的“挂起”更能称之为“挂起”) 3、为了实现中断和任务的同步,需要在中断中进行post操作,uC/OS

关于8051的bootloader实现方式

馋奶兔 提交于 2019-12-15 20:58:04
一, 基本硬件需求 要实现IAP功能,需要51单片机可以在程序里修改代码空间的Flash,或者至少可以修改用户程序区的Flash,新出的51大部分都能满足这个要求 二, 空间划分 一般bootloader位于单片机代码空间的起始地址,用户程序在后面。这个需要根据实际的需求来决定,bootloader功能简单,就少占用一些,bootloader功能复杂的就多占用一些。除此之外,一般还要根据Flash的页为界线划分。附带的工程模板里,bootloader使用0x0000-0x0fff区间,用户程序使用0x1000以后的空间。 三, 中断的处理 51单片机的中断入口一般位于0地址开始的区间,无法修改,但是根据上面的空间划分方式,这个区间位于bootloader的范围,是不能随意更改的。所以代码里用了一个软件的方式对中断入口做了重映射处理,后面将结合具体的代码介绍实现方式。 四, Bootloader的处理 1, 建立工程的时候,选择把Startup.a51添加到工程 2, 在Startup.a51里添加如下代码: ORG 0003H LJMP 2003H ORG 000BH LJMP 200BH ORG 0013H LJMP 2013H ORG 001BH LJMP 201BH ORG 0023H LJMP 2023H …………………………. 根据具体型号的中断数量和地址

ARM的异常与裸机开发

☆樱花仙子☆ 提交于 2019-12-15 20:20:15
2019-12-15 关键字:嵌入式开发、异常处理、嵌入式裸机开发 1、ARM的异常 异常在嵌入式开发中是很常见的事件,它也是非常重要的事件。简单来说,异常就是一种会打断程序正常执行的事件。异常通常又称为“中断”。 异常的种类大致可分为如下几种: 1、中断 IRQ / FIQ 由外部硬件触发的中断。 2、软中断 soft interrupt 由系统调用的中断事件,由软件产生的中断事件。 3、复位 Reset 4、未定义指令 5、数据异常 例如数据越界等。 中断: ARM 有两级外部中断:1、FIQ;2、IRQ。 但大多数的嵌入式系统都有多于两个的外部中断源,为了能正常响应所有的外部中断事件,就需要一个“中断控制器”。 嵌入式系统的中断响应架构大致如下图所示: 当在短时间内产生大量中断事件时,CPU无法保证能及时响应所有的中断事件。为了避免发生丢失中断的问题,每一个中断事件都会作一个“记录”,即我们常见的设置“中断标志位”。当CPU查到中断标志位的值有效时,就会发起一个中断事件。当然,一个中断事件我们一般只需要处理一次,因此,通常我们要在中断处理函数中将对应的中断标志位作清除操作。 ARM 系统会有一个“中断向量表”的机制来专门存储中断响应函数地址。 2、裸机开发 什么是祼机开发? 祼机开发就是指在嵌入式开发板中,直接编写程序控制硬件设备的开发模式。在开发板上没有操作系统

新唐51单片机----挖坑

人盡茶涼 提交于 2019-12-15 01:40:18
1、定时器3中断与串口0中断冲突 开启了串口0中断,同时开启了定时器3中断,串口0中断处理函数如下: void SerialPort0_ISR(void) interrupt 4 { if (RI==1) //这个中断时接收跟发送共用的 { UART_RxData(&UART_DevRx); clr_RI; } } 以上中断处理函数中未清除发送完成产生的中断,如果在产生发送完成中断之后,使用定时器3中断。 定时器3中断将不能响应。 2、串口0连续接收失败 使用官方的DEMO:UART0_mode_3 发现电脑串口连续发送10个字节数据,产生接收数据丢失的现象。 但是间隔一定时间发送1个字节数据,发送一个10字节数据,没有数据丢失。 来源: CSDN 作者: 爱FC的捷哥 链接: https://blog.csdn.net/a3748622/article/details/103459723

I/O中断原理

老子叫甜甜 提交于 2019-12-14 18:50:28
目录 I/O中断原理 前言 什么是中断 中断类型 硬件中断 软件中断 I/O中断流程 无中断 有中断 中断处理 相关文献 I/O中断原理 前言 在 Windows内核原理-同步IO与异步IO 和 《高性能网络通讯原理》 两篇文章中,都出现了 中断 这两个字。本篇文章会对中断操作的原理进行说明。 什么是中断 中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。 我们知道CPU是按指令顺序进行执行的,操作系统每过大约15ms会发生一次线程调度(Windows下),根据线程优先级先调度优先级高的线程。但是实际情况并没有那么简单,若我们接收到一个网络请求,如果要等当前线程执行完或15ms线程调度之后才去处理网络请求,网卡缓冲区很有可能会被占满,此时就发生了丢包。 中断类型 中断分为硬件中断和软件中断。 硬件中断 硬件中断即为硬件发出的中断信号,如I/O中断和硬件失效中断。 I/O中断:由I/O控制器产生,用于发送信号通知操作完成等信号。 硬件失效中断:如掉电或存储器奇偶错之类的故障。 软件中断 软件中断即为非硬件发出的中断信号,如程序中断和时钟中断。 程序中断:一些指令产生的异常(如算数移除、除数为0等)。 时钟中断

汇编语言中断类型

余生颓废 提交于 2019-12-13 12:39:38
0H 除以零 1H 单步(用于DEBUG) 2H 非屏蔽中断 3H 断点指令(用于DEBUG) 4H 溢出 5H 打印屏幕 6H 保留 7H 保留 8259中断向量 8H 定时器 9H 键盘 AH 彩色/图形 BH 异步通讯(secondary) CH 异步通讯(primary) DH 硬磁盘 EH 软磁盘 FH 并行打印机 BIOS中断 10H 屏幕显示 11H 设备检验 12H 测定存储器容量 13H 磁盘I/O 14H 串行通讯口I/O 15H 盒式磁带I/O 16H 键盘输入 17H 打印机输出 18H BASIC入口代码 19H 引导装入程序 1AH 日时钟 提供给用户的中断 1BH Ctrl-Break控制的软中断 1CH 定时器控制器的软中断 数据表指针 1DH 显示器参量表 1EH 软盘参量表 1FH 图形表 DOS中断 20H 程序结束 21H 系统功能调用 22H 结束退出 23H Ctrl-Break退出 24H 严重错误处理 25H 绝对磁盘读功能 26H 绝对磁盘写功能 27H 驻留退出 28H-2EH DOS保留 2FH 打印机 30H-3FH DOS保留 BASIC中断 40H-5FH 保留 60H-67H 用户软中断 68H-7FH 保留 80H-85H 由BASIC保留 86H-F0H BASIC中断 F1H-FFH 保留 来源: CSDN 作者:

计算机组成原理常见题(六)

那年仲夏 提交于 2019-12-13 05:32:41
1.假定用若干个16Kx1位的存储器芯片组成一个64Kx8位的存储器,芯片内各单元连续编址,则地址BFF0H所在的芯片的最小地址是(C) A.40000H B.60000H C.8000H D.0000H 2.假设一个同步总线的工作频率为33MHZ,总线有32位数据线,每个总线时钟传输一次数据,则该总线的最大数据传输率为(B) A.66MB/s B.132MB/s C.528MB/s D.1056MB/s 3.假设某条指令的一个操作数采用一次间接寻址方式,指令中给出的地址码为1200H,地址1200H中的内容为12FCH,地址12FCH中的内容为38B8H,地址38B8H中的内容为88F9H,则该操作数为() A.1200H B.12FCH C.38B8F D.88F9H 4.相联存储器是按(B)进行寻址访问的寄存器 A.地址指定方式 B.内容指定方式 C.堆栈访问方式 D.队列访问方式 5.假定某程序p由一个100条指令构成的循环组成,该循环共执行50次,在某系统S中执行程序p花了20000个时钟周期,则系统S在执行程序p时CPI是多少? 在20000个时钟周期中共执行100x50=5000条指令,CPI=20000/5000=4 CPI:执行每一条指令所花的时钟周期数 CPI=执行指令所花的时钟周期数/执行了多少条指令 6.设某机主存容量为16MB,Cache容量为16KB

28335GPIO及外部中断配置介绍

ぐ巨炮叔叔 提交于 2019-12-13 03:20:06
本文转载连接: https://blog.csdn.net/E_ROAD_BY_U/article/details/53083151 弄了两周终于把28335的启动流程、寄存器及中断向量表的映射方法、内存的划分等有了一个全面的了解,今天看到久违的LED灯的闪烁,顿扫阴霾。特在此总结下28335GPIO及外部中断配置介绍。其实对于一个微控制器,只要能够独立实现这两个功能,也算是入门了。 一、GPIO口介绍 外界二进制信息(数字量)要被CPU处理,要给存储器存放,就需要外界信息源与两者之间的交换接口,这样的交换接口若用来进行通用目的数字量的输入输出,就被称为通用数字量输入/输出接口,简称GPIO。F28335 DSP有多达88个GPIO口,对应着芯片引出的88个引脚,随着芯片的封装与尺寸的确定,引脚数目是有限的,所以这88个引脚多数都是功能复用的,即可以灵活配置为输入引脚,也可以灵活配置为输出引脚,即可以作为通用I/O引脚,也可以作为特殊功能口(如SCI、SPI、ECAN等),非常灵活,用户根据需要,可以通过GPIO MUX(输入输出多路选择器,复用开关)寄存器来进行相关配置。 F28335DSP将这88个GPIO口分成了A、B、C三大组,A组包括GPIO0至GPIO31,B组包括GPIO32至GPIO63,C组包括GPIO64至GPIO87,每个引脚都复用了多个功能,同一时刻

STM32开发 -- 低功耗模式详解

£可爱£侵袭症+ 提交于 2019-12-12 10:08:48
很多单片机都有低功耗模式,STM32 也不例外。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗。 这部分不是我负责,但是也是有必要看一下的。 参看: STM32F1开发指南-库函数版本_V3.2.pdf STM32中文参考手册_V10.pdf 一、低功耗模式 在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。 STM32有三种低功耗模式: ● 睡眠模式 (Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行) ● 停止模式 (所有的时钟都已停止) ● 待机模式 (1.8V电源关闭) 此外,在 运行模式 下,可以通过以下方式中的一种降低功耗: ● 降低系统时钟 在运行模式下,通过对预分频寄存器进行编程,可以降低任意一个系统时钟(SYSCLK、 HCLK、 PCLK1、 PCLK2)的速度。进入睡眠模式前,也可以利用预分频器来降低外设的时钟。 ● 关闭APB和AHB总线上未被使用的外设时钟。 在运行模式下,任何时候都可以通过停止为外设和内存提供时钟(HCLK和PCLKx)来减少功耗。为了在睡眠模式下更多地减少功耗

STM32 学习笔记 -- EXIT外部中断 按键的误触发问题

橙三吉。 提交于 2019-12-12 09:01:59
版权声明:本文为CSDN博主「menghuanshen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/menghuanshen/article/details/89424062 ———————————————— EXIT外部中断 按键的误触发问题 最近在调试按键作为外部中断exti进行触发动作,发现每次按键按下和按键抬起都会多次进入中断函数,造成程序不稳定,经过反复调试和查阅资料,最后终于已经把这个问题解决,现在总结一下: 1、EXTI重复配置两次导致误触发中断的问题 如果重复两次配置EXTI的话,由于第一次已经打开中断,当进行第二次配置中断的时候,会把中断引脚首先配置成默认引脚,然后在配置成目的引脚,这样由于默认引脚是低电平,所以在切换的过程中就会进入一次中断!!具体请参见: http://bbs.elecfans.com/jishu_942011_1_1.html 2、STM32F407 外部中断误触发问题 现象:调试STM32F407低功耗的时候,使用的PA0做个唤醒源,发现在没有触发EXTI的时候,MCU居然被唤醒。 原因:PA0配置成EXTI(上拉输入),一直被误触发。 解决方式:将PA1配置成浮空输入(GPIO_PuPd_NOPULL),并且外部上拉一个4.7k电阻