当前位置: 首页 > news >正文

怎样用手机搭建网站阿里巴巴官网电脑版

怎样用手机搭建网站,阿里巴巴官网电脑版,北京网站排名公司,游仙移动网站建设中断管理 什么是中断#xff1f;简单的解释就是系统正在处理某一个正常事件#xff0c;忽然被另一个需要马上处理的紧急事件打断#xff0c;系统转而处理这个紧急事件#xff0c;待处理完毕#xff0c;再恢复运行刚才被打断的事件。生活中#xff0c;我们经常会遇到这样…中断管理 什么是中断简单的解释就是系统正在处理某一个正常事件忽然被另一个需要马上处理的紧急事件打断系统转而处理这个紧急事件待处理完毕再恢复运行刚才被打断的事件。生活中我们经常会遇到这样的场景 当你正在专心看书的时候忽然来了一个电话于是记下书的页码去接电话接完电话后接着刚才的页码继续看书这是一个典型的中断的过程。 电话是老师打过来的让你赶快交作业你判断交作业的优先级比看书高于是电话挂断后先做作业等交完作业后再接着刚才的页码继续看书这是一个典型的在中断中进行任务调度的过程。 这些场景在嵌入式系统中也很常见当CPU正在处理内部数据时外界发生了紧急情况要求CPU暂停当前的工作转去处理这个异步事件。处理完毕后再回到原来被中断的地址继续原来的工作这样的过程称为中断。 实现这一功能的系统称为中断系统申请CPU中断的请求源称为中断源。 中断是一种异常异常是导致处理器脱离正常运行转向指向特殊代码的任何事件如果不及时地进行处理轻则系统出错重则系统瘫痪。所以正确地处理异常避免错误的发生是提高软件鲁棒性的重要一环。 中断处理与CPU架构密切相关所以本章会先介绍 ARM Cortex-M 的 CPU 架构然后结合 Cortex-M CPU 架构来介绍 RT-Thread 的中断管理机制读完本章大家将深入了解 RT-Thread 的中断处理过程如何添加中断服务程序ISR以及相关的注意事项。 Cortex-M CPU架构基础 ARM Cortex-M 处理器有一个非常不同的架构Cortex-M是一个家族系列其中包括Cortex M0/M3/M4/M7多个不同型号每个型号之间会有些区别比如说Cortex-M4 比 Cortex-M3 多了浮点计算功能等但它们的编程模型基本是一致的。 寄存器简介 Cortex-M系列CPU的寄存器组里有R0~R15共16个通用寄存器组和若干特殊功能寄存器如下图所示。 通用寄存器组里的R13作为堆栈指针寄存器Stack PointerSPR14作为连接寄存器Link RegisterLR用于在调用子程序时存放返回地址R15作为程序计数器Program CounterPC其中堆栈指针寄存器可以是主堆栈指针MSP也可以是进程堆栈指针PSP。 特殊功能寄存器包括程序状态寄存器组PSRs、中断屏蔽寄存器组PRIMASKFAULTMASKBASEPRI、控制寄存器CONTROL可以通过MSR/MRS指令访问特殊功能寄存器。 MRS R0,CONTROL; 读取CONTROL到R0中 MSR CONTROL,R0 写入R0到CONTROL寄存器中程序状态字寄存器里保存算术与逻辑标志例如负数标志零结果标志溢出标志等等。中断屏蔽寄存器组控制Cortex-M的中断除能。控制寄存器用来定义特权级别和当前使用哪个堆栈指针。 操作模式和特权级别 Cortex-M引入了操作模式和特权级别的概念分别为线程模式和处理模式如果进入异常或中断处理则进入处理模式其它情况则为线程模式。 Cortex-M有两个运行级别分别为特权级和用户级线程模式可以工作在特权级或者用户级而处理模式总工作在特权级可通过CONTROL特殊寄存器控制。 Cortex-M的堆栈寄存器SP对应两个物理寄存器MSP和PSPMSP为主堆栈PSP为进程堆栈处理模式总是使用MSP作为堆栈线程模式可以选择使用MSP或PSP作为堆栈同样通过CONTROL特殊寄存器控制。 复位后Cortex-M默认进入线程模式、特权级、使用MSP堆栈。 嵌套向量中断控制器 Cortex-M中断控制器名为NVIC嵌套向量中断控制器支持中断嵌套功能。 当一个中断触发并且系统进行响应时处理器硬件会将当前运行位置的上下文寄存器自动压入中断栈中这部分的寄存器包括PSR、PC、LR、R12、R3~R0寄存器。 当系统正在服务一个中断时如果有一个更高优先级的中断触发那么处理器同样会打断当前运行的中断服务程序然后把这个中断服务程序的上下文寄存器自动保存到中断栈中。 PendSV系统调用 PendSV也称为可悬起的系统调用它是一种异常可以像普通的中断一样被挂起专门用于辅助操作系统进行上下文切换。 PendSV异常会被初始化为最低优先级的异常。 每次需要进行上下文切换时会手动触发PendSV异常在PendSV异常处理函数中进行上下文切换。 中断向量表 中断向量表是所有中断处理程序的入口。 把一个函数用户中断服务程序同一个虚拟中断向量表的中断向量联系在一起。当中断向量对应中断发生的时候被挂接的用户中断服务程序就会被调用执行。 在Cortex-M内核上所有中断都采用中断向量表的方式进行处理即当一个中断触发时处理器将直接判定是哪个中断源然后直接跳转到相应的固定位置进行处理每个中断服务程序必须排列在一起放在统一的地址上这个地址必须要射到NVIC的中断向量偏移寄存器中。中断向量表一般由一个数组定义或在起始代码中给出默认采用起始代码给出 __Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset 处理函数DCD NMI_Handler ; NMI 处理函数DCD HardFault_Handler ; Hard Fault 处理函数DCD MemManage_Handler ; MPU Fault 处理函数DCD BusFault_Handler ; Bus Fault 处理函数DCD UsageFault_Handler ; Usage Fault 处理函数DCD 0 ; 保留DCD 0 ; 保留DCD 0 ; 保留DCD 0 ; 保留DCD SVC_Handler ; SVCall 处理函数DCD DebugMon_Handler ; Debug Monitor 处理函数DCD 0 ; 保留DCD PendSV_Handler ; PendSV 处理函数DCD SysTick_Handler ; SysTick 处理函数… …NMI_Handler PROCEXPORT NMI_Handler [WEAK]B .ENDP HardFault_Handler PROCEXPORT HardFault_Handler [WEAK]B .ENDP … … [WEAK]标识是符号弱化标识在[WEAK]前面的符号如NMI_Handler、HardFault_Handler将被执行弱化处理如果整个代码在链接时遇到了名称相同的符号如与NMI_Handler相同名称的函数那么代码将使用未被弱化定义的符号与 NMI_Handler 相同名称的函数而与弱化符号相关的代码将被自动丢弃。 以SysTick中断为例在系统启动代码上需要填上SysTick_Handler中断入口函数然后实现该函数即可对 SysTick 中断进行响应中断处理函数示例程序如下所示 void SysTick_Handler(void) {/* enter interrupt */rt_interrupt_enter();rt_tick_increase();/* leave interrupt */rt_interrupt_leave(); } 中断处理过程 RTT中断管理中将中断处理程序分为中断前导程序、用户中断服务程序、中断后续程序三部分如下图 中断前导程序 保存CPU中断现场这部分跟CPU架构相关不同CPU架构的实现方式有差异。 对于Cortex-M来说该工作由硬件自动完成。当一个中断触发并且系统进行响应时处理器硬件会将当前运行部分的上下文寄存器自动压入中断栈中这部分的寄存器包括PSR、PC、LR、R12、R3~R0寄存器。通知内核进入中断状态调用rt_interrupt_enter()函数作用是把全局变量rt_interrupt_nest加1用它来记录中断嵌套的层数。 void rt_interrupt_enter(void) {rt_base_t level;RT_DEBUG_LOG(RT_DEBUG_IRQ, (irq coming..., irq nest:%d\n,rt_interrupt_nest));level rt_hw_interrupt_disable();rt_interrupt_nest ;RT_OBJECT_HOOK_CALL(rt_interrupt_enter_hook,());rt_hw_interrupt_enable(level); } RTM_EXPORT(rt_interrupt_enter);用户中断服务程序 在用户中断服务程序ISR中分为两种情况第一张情况是不进行线程切换这种情况下用户中断服务程序和中断后续程序运行完毕后退出中断模式返回被中断的线程。 另一种情况是在中断处理过程中需要进行线程切换这种情况会调用**rt_hw_context_switch_interrupt()**函数进行上下文切换该函数跟CPU架构相关不同CPU架构的实现方式有差异。 在Cortex-M架构中rt_hw_context_switch_interrupt()的函数实现流程如图。 它将设置需要切换的线程rt_interrupt_to_thread变量然后触发PendSV异常PendSV异常是专门用来辅助上下文切换的且被初始化为最低优先级的异常。 PendSV异常被触发后不会立即进行PendSV异常中断处理程序因为此时还在中断处理中只有当中断后续程序运行完毕真正退出中断处理后才进入PendSV异常中断处理程序。 中断后续程序 通知内核离开中断状态通过调用rt_interrupt_leave()函数将全局变量rt_interrupt_nest减1. void rt_interrupt_leave(void) {rt_base_t level;level rt_hw_interrupt_disable();rt_interrupt_nest --;rt_hw_interrupt_enable(level); }恢复中断前的CPU上下文如果在中断处理过程中未进行线程切换那么恢复from线程的CPU上下文如果在中断中进行了线程切换那么恢复to线程的CPU上下文。 中断嵌套 在允许中断嵌套的情况下在执行中断服务程序的过程中如果出现高优先级的中断当前中断服务程序的执行将被打断以执行高优先级中断的中断服务程序当高优先级中断的处理完成后被打断的中断服务程序又继续得到执行如果需要进行线程调度线程的上下文切换在所有中断处理程序都运行结束时才发生。 中断栈 在系统响应中断前处理器需要把当前线程的上下文保存起来通常保存在当前线程的线程栈中再调用中断服务程序进行中断响应、处理。 在中断处理函数中很可能会有自己的局部变量这些都需要相应的栈空间来保存所以中断响应仍然需要一个栈空间来作为上下文运行中断处理函数。 中断栈可以保存在被打断线程的栈中当从中断退出时返回相应的线程继续执行。 中断栈也可以与线程栈完全分离每次进入中断时在保存完打断线程上下文后切换到新的中断栈独立运行。 在中断退出时再做相应的上下文恢复。 使用独立中断栈相对来说更容易实现并且对于线程栈使用情况也比较容易了解和掌握否则必须要为中断预留空间如果系统支持中断嵌套还需要考虑应该为嵌套中断预留多大的空间。 RTT采用的方式是提供独立的中断栈即中断发生时中断的前期处理程序会将用户的栈指针更换到系统事先留出的中断栈空间中等中断退出时再恢复用户的栈指针。 **这样中断就不会占用线程的栈空间**从而提高了内存空间的利用率且随着线程的增加这种减少内存占用的效果也越明显。 在Cortex-M处理器内核里有两个堆栈指针一个是主堆栈指针MSP是默认的堆栈指针在运行第一个线程之前和在中断和异常服务程序里使用另一个是线程堆栈指针PSP在线程里使用。 在中断和异常服务程序退出时修改LR寄存器的第2位的值为1线程的SP就由MSP切换到PSP。
http://www.w-s-a.com/news/953490/

相关文章:

  • 八里河风景区网站建设内容摘要网站开发基础学习
  • 上海做外贸网站的公司智慧团建网站登陆平台
  • 上海商务网站建设如何做的网站手机可以用吗
  • 产品推广营销方案seo推广员招聘
  • 做水利网站需要多少钱山东市网站建设
  • 做网站找哪里如何修改wordpress颜色
  • 招商加盟网站系统站长工具 seo查询
  • 工商局网站清算组备案怎么做电商培训机构
  • 做好门户网站建设做本地团购网站怎么样
  • wordpress主题和预览不同20条优化防疫措施方案
  • 艾奇视觉网站建设网站推广需要几个人做
  • 2008 iis 添加网站wordpress固定链接标签加上页面
  • 宁波企业网站制作推荐网站优化人员
  • 大型资讯门户网站怎么做排名沈阳建设工程有限公司
  • 开发中英文切换网站如何做江苏网站建设费用
  • 网站论文首页布局技巧桥东网站建设
  • 网站开发项目经理工资北京微信网站
  • 山西山西省建设厅网站微信备份如何转换为wordpress
  • 同城网站开发实用网站模板
  • 郑州做网站哪家公司好国外购买空间的网站有哪些
  • 资讯cms网站有那些餐饮品牌策划设计公司
  • 网站策划选题网站布局优化
  • 网站建设3000字wordpress 微信 主题制作
  • 代做寄生虫网站网站菜单效果
  • 网站备案为什么这么慢目录更新 wordpress
  • 视频在线制作网站Wordpress 外链图片6
  • 网站域名后缀有什么用网站建设的投资预算怎么写
  • 化妆品网站建设网站惠州网站关键字优化
  • 保定网站制作企业下载天眼查企业查询官网
  • 中山企业网站建设公司制作一个景点的网站