异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果系统不及时处理,系统轻则 出错,重着导致系统毁灭性的瘫痪。所以正确地处理异常避免错误的发生是提高软件的鲁棒性重 要的一方面,对于嵌入式系统更加如此。
异常可以分成两类,同步异常和异步异常。同步异常主要是指由于内部事件产生的异常,例如除 零错误。异步异常主要是指由于外部异常源产生的异常,例如按下设备某个按钮产生的事件。 中断,通常也叫做外部中断,中断属于异步异常。当中断源产生中断时,处理器也将同样陷入到 一个固定位置去执行指令。
当中断产生时,处理机将按如下的顺序执行: • 保存当前处理机状态信息 • 载入异常或中断处理函数到PC寄存器 • 把控制权转交给处理函数并开始执行 • 当处理函数执行完成时,恢复处理器状态信息 • 从异常或中断中返回到前一个程序执行点
中断使得CPU可以在事件发生时才予以处理,而不必让微处理器连续不断地查询是否有相应事件 发生。通过两条特殊指令:关中断和开中断可以让处理器不响应或响应中断。在执行中断服务例 程过程中,如果有更高优先级别的中断源触发中断,由于当前处于中断处理上下文环境中,根据 不同的处理器构架可能有不同的处理方式:新的中断等待挂起直到当前中断处理离开或打断当前 中断处理过程,让处理器相应这个更高优先级的中断源。后面这种情况,一般称之为中断嵌套。 在硬实时环境中,前一种情况是不允许发生的,关闭中断响应的时间应尽量的短。在软件处理上, RT-Thread允许中断嵌套,即在一个中断服务例程期间,处理器可以响应另外一个更重要的中断。
当正在执行一个中断服务例程(中断1)时,有更高的中断触发,将保存当前中断服务例程的上下 文环境,转向中断2的中断服务例程。当所有中断服务例程都运行完成时,才又恢复上下文环境转 回到中断1的中断服务例程中接着执行。
RT-Thread提供独立的系统栈,即中断发生时,中断的前期处理程序会将用户的堆栈指针更换为系 统事先留出的空间中,等中断退出时再恢复用户的堆栈指针。这样中断将不再占任务的堆栈空间, 提高了内存空间的利用率,且随着任务的增加,这种技术的效果也越明显。
中断的底半处理 RT不会对ISR的处理的时间做出任何的限制,但是RT与其它的RTOS或者是非RTOS一样,有一个要求是ISR的处理时间要尽量的短。
这样在发生中断嵌套,或屏蔽了相应中断源的 过程中,不会耽误了嵌套的其它中断处理过程,或自己中断源的下一次中断信号。
当一个中断信号发生时,ISR需要取得相应的硬件状态或者数据,如果ISR接下来要对状态或者数 据进行简单处理,比如CPU时钟脉冲中断,ISR只需增加一个系统时钟tick,然后就结束ISR。这 类中断往往所需的运行时间都比较短。对于另外一些中断,ISR在取得硬件状态或数据以后,还 需要进行一系列更耗时的处理过程,通常需要将该中断分割为两部分,即上半部分(Top Half) 和下半部分(Bottom Half)。在Top Half中,取得硬件状态和数据后,打开被屏蔽的中断,给相 关的某个thread发送一条通知(可以是RT-Thread所提供的任意一种IPC方式),然后结束ISR。而 接下来,相关的thread在接收到通知后,接着对状态或数据进行进一步的处理,这一过程称之 为Bottom Half。
关于bottom half的例程实现,在数据手册上面已经存在。请需要的朋友到官网上下载。。。
|