文档详情

天脉(ACoreOS)操作系统培训:异常、中断与定时器

ni****g
实名认证
店铺
PPT
456KB
约31页
文档ID:610939768
天脉(ACoreOS)操作系统培训:异常、中断与定时器_第1页
1/31

单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第六章,异常、中断与定时器,异常处理与信号机制,中断效劳程序,系统时钟、高精度时钟、看门狗定时器,2,提纲,异常处理概述,异常为CPU产生的正常执行流程外的事件如,trap和断点指令、零除、浮点或整形溢出、非法指令或地址错等,异常将产生“内部中断,操作系统在系统初始化阶段安装异常处理程序,这些程序在异常发生时被调用,并可调用用户定义的异常处理程序,异常处理程序通过发送信号与用户任务进行通信3,异常处理概述,异常,与不同体系结构相关,本培训教程仅讨论异常的通用处理不同体系结构相关处理,可参考硬件手册4,信号,5,信号,信号类似一种软中断,信号发送给指定任务,用于通知发生某种异步事件,任务在接收到指定信号后,执行相应的信号处理,信号处理完成后,正常任务执行被恢复除非信号引起异常发生,6,信号,信号机制建议使用于通常的任务间通信,信号可能以非常高的优先级被处理,如信号到达时,任务正采用优先级继承或优先级天花板,打断任务正常执行流程最好创立多个任务,而不采用在一个任务内通过信号实现多种操作,可能引入重入的问题,当任务执行的信号处理程序与任务正常代码调用相同的接口时,任务通常采用信号量实现对临界区的互斥访问,假设任务在临界区访问时接收信号,如果信号处理中获取该互斥信号量,同样获取成功,但资源互斥访问可能被破坏,7,注册一个信号,注册一个信号处理程序,signal(signo,handler),signo,信号类型,handler,信号处理程序,返回先前安装的信号处理程序,或者返回,SIG_ERR,8,异常处理与信号机制,中断效劳程序,系统时钟、高精度时钟、看门狗定时器,9,提纲,中断,中断允许外部设备通知,CPU,特定事件发生,当发生外部中断时,用户安装的处理程序被执行,中断发生时占用中断时间,而不是任务执行时间,目标板定时器是常见中断源,可以辅助了解外部中断的工作原理,10,中断处理例如-PowerPC,11,中断处理例如说明,PowerPC有单独的外部中断引脚。

板级支持包BSP可以支持外部中断控制器实现中断嵌套中断表中中断入口数量取决于BSP中中断控制器的能力目前中断向量表最多可支持256个外部中断的处理流程,保存CPU存放器,从中断控制器中读取中断号,调用用户连接的中断处理程序用户关心,清中断控制器状态,恢复CPU存放器并返回,12,中断和优先级,中断可以抢占最高优先级的任务,13,中断栈,系统使用独立中断栈,中断栈在系统初始化阶段分配,中断栈在生成操作系统时配置,系统支持中断嵌套,中断栈配置时应充分考虑嵌套时最大栈使用情况,14,中断效劳执行限制,任务只有中断效劳执行完成后才能执行,中断效劳中限制使用操作系统机制,特别是中断不能够阻塞,不能够调用ACoreOs_semaphore_obtain()/semTake(),不能够调用malloc内部使用信号量,不能够调用I/O系统程序如,printf(),参考指南给出了每个函数能否在中断效劳程序调用的限制说明,15,中断效劳编制指南,尽可能保证中断效劳程序简短,延迟低级别和同优先级的中断,延迟所有任务,调试困难,防止使用浮点操作,浮点操作速度较慢,用户必须自行保存和恢复浮点相关存放器,尽可能将处理移交给任务处理,任务处理时间更长,时间要求更低,16,典型的中断效劳,读和写存储器映射的I/O存放器,与任务通信采用如下方式,写存储区,非阻塞形式写到消息队列,释放二进制信号量,17,中断效劳调试,中断效劳中采用logMsg()将信息输出到指定的控制台(仅使用于配置VxWorks兼容包情形),logMsg(“foo=%dn,foo,0,0,0,0,0);,发送请求给tLogTask执行printf()的功能,类似printf()功能,须注意如下事项:,参数必须是4个字节,格式外字符串和6个参数,采用系统级调试功能可以调试中断效劳,任务级不可以调试中断效劳程序,18,异常处理与信号机制,中断效劳程序,系统时钟、高精度时钟、看门狗定时器,19,提纲,定时器,目标板的定时器周期性地中断CPU,定时器周期间隔到达时,可以执行用户连接处理程序,可用于:,查询硬件状态,检查系统错误,防止不准确操作,操作系统提供通用的接口操作两个定时器,系统时钟,高精度时钟如果可用,如果目标板有其他的定时器,可以编写额外驱动程序进行控制,20,系统时钟,系统时钟中断效劳为系统时钟脉冲,周期到达,增加tick计数,更新延迟和超时,检查时间片轮转调度,系统时钟到达时,可能引起系统重调度,系统时钟的频率可以配置,根据用况配置,sysClkRateSet()设置时钟频率,int sysClkRateGet()返回时钟频率,sysClkRateSet()不仅仅在系统初始化阶段调用,21,看门狗定时器,系统时钟的用户接口,在指定时间延时后执行C程序,在时间延时到达时,连接的程序执行,作为系统时钟ISR的一局部,满足中断效劳的限制,22,看门狗定时器,以VxWorks兼容包提供看门定时器为例,创立看门狗定时器,WDOG_ID wdCreate(void),创立成功返回看门狗ID,失败返回NULL。

启动或重启动看门定时器,STATUS wdStart(WDOG_ID wdId,int delay,FUNCPTR pRoutine,int parameter),wdId看门狗ID,由创立wdCreate返回,delay延时的tick值,pRoutine延时时间到时调用程序,parameter传递给调用程序的参数,23,看门狗定时器,wdStart()当指定延时时间到达时,可以执行一次看门狗效劳为了周期执行,看门狗效劳必须自身调用wdStart()进行重启动,只有最近调用wdStart()启动的看门狗才能运行,为了运行多个看门狗效劳程序,必须使用多个看门狗定时器,24,如何使用看门狗,使用看门狗周期执行,wdId=wdCreate();,wdStart(wdId,DELAY_PERIOD,myWdIsr,0);,void myWdIsr(int param),doit(param);,wdStart(wdId,DELAY_PERIOD,myWdIsr,param);,doit()效劳可能,查询硬件设备,解除特定任务阻塞,检查系统是否存在错误,25,截止期超时检测,从截止期超时中恢复,26,WDOG_ID wdId;,void foo(void),wdId=wdCreate();,/*,必须在,10,秒内完成每个周期,*/,FOREVER,wdStart(wdId,DELAY_10_SEC,fooISR,0);,fooDoWork();,void fooISR(int param),/*,处理截止期超时,*/,fooDoWork()必须每10秒运行,如果执行小于10秒钟,看门狗重新启动fooISR()没有被调用。

如果fooDoWork()执行时间超过10秒钟,那么看门狗程序fooISR()将被调用处理紧急事件,停止看门狗,取消先前启动的看门狗,STATUS wdCancel(WDOG_ID wdId),消亡看门狗定时器取消任何先前的启动,STATUS wdDelete(WDOG_ID wdId),27,查询考虑,任务和中断执行时均可以进行查询,中断效劳里面查询较为可靠,任务里面查询可能受到系统的轻微影响,在任务里面查询可能有如下两种情况,任务延时如,taskDelay:更快,但时间可能漂移,wdStart()+semGive():更加健壮,28,查询警告,以下代码是正确的,只有当系统时钟频率是15Hz的整数倍,void myWdISR(),wdStart(myWdId,sysClkRateGet()/15,myWdISR,0);,pollMyDevice();,为了防止系统在每个时钟tick开销过大,不能够将系统时钟频率设置过高,可以使用高精度时钟以很高频率进行查询,29,高精度时钟,对于高频率的查询,可采用高精度时钟,系统提供操作高精度时钟的效劳,sysAuxClkConnect()连接ISR到高精度时钟,sysAuxClkRateSet()设置高精度时钟频率,sysAuxClkEnable()启动高精度时钟,sysAuxClkDisable()停止高精度时钟,一些目标板没有高精度时钟,30,综述,使用定时器进行查询,31,。

下载提示
相似文档
正为您匹配相似的精品文档