本课是节选《裸奔嵌入式实时操作系统HotTask51概况介绍》里几个非典之常用战法。
二.中断 HotTask51和任何RTOS一样,必须具备一个专用的硬件定时器作为系统运行跳动的 脉搏,即任务节拍定时器,节拍在固定的间隔内产生硬件中断,随即引发执行节拍中断 服务程序。
HotTask51的节拍中断级别选择MCS51硬件中断系统的最低级别的定时器T2.选择它 主要是T2具有时间常数自动装载功能,再就是有几个与HotTask51的"天地巧合及姻缘"。
其一就是MCS51由于资源的紧缺,优先级是事先按顺序依次排列固定死的,每个中 断的级别只有高低之分。而HotTask51所需的最低中断优先又恰好是IP.5.
其二的巧合就是MCS51在Intel设计之初的8031上只有2个定时器T1/T0. 虽可实现 时间常数的自动装载,但定时器计数位数不能满足在大部分12MHz主频1MHz的10mS节拍 之应用,在其后的MCS51系列里都配置了16位T2定时器为基本配置。满足了长节拍需求。
其三的巧合更为怪异并20余年找不出答案所在--T2定时器溢出标志TF2必须手工清 除。在T1/T0的硬件中断服务程序中,TF1/TF0被硬件中断自动清零。
多年来一直不解为什么???Intel为何做出这样的设计,为何与T1/T0不同,为何升 级T2定时器自动装载寄存器组RCAP2H/RCAP2L而留下了总被菜鸟遗忘的TF2=0;语句。
现在终于明白了TF2的用途---判断节拍中断是硬件中断还是由软中断引发。 在MCS51系列里,无软中断指令和软中断向量表,在后来的ARM/DSP等“高档MCU”系列都 有软中断指令和软中断向量表。
MCS51系列虽无标准的软中断定义,但却实际存在软中断之应用. 最具代表的有TI=1;这条“软中断指令”, 它代表串口硬件发送空或完,引发中断以便 串口的连续数据发送 。
MCS51系列的软中断非典应用当属用INT0/INT1作为控制IO, 其控制后的处理程序 只用一条NOP来替代,而真的处理程序却在其对应的外部中断INTX服务程序中。这属于 一种“任务隐身”的“加密”方式,是正向工程对付逆向工程的一种非常规之“战法”。
MCS51系列的软中断最可恶的应用是定时器未启动(TRX=0),但中断位开放(ETX=1) 搞个TFX=1,即“软中断”去执行秘密任务。 若TimerXIsr()中断服务程序是个死循环,则TFX = X != Y;即可把"敌人"搞死~~~ 因为正确地表达式永远为TFX = 0;//即永远不会死循环~~~
所以,TF2不清零,则任务提前退出或其他中断降级为事件时,可以用一些手段 跳入节拍中断服务程序而不会改变TF2的状态,那么,在真的节拍未到时,不会进行 任务的节拍就绪判断处理。更深的应用自己琢磨。
三. 事件
在HotTask51中,定义事件为硬件中断服务程序采用调用一次RETI后隐身达到降低 其原有中断级别并继续处理更为复杂和耗时的任务。
中断隐身后最大的好处在于既能继续工作又能放行同级中断任务去执行此时的急需 任务。而且“自成”任务环而不需设置标志、发送消息等方法回到 主循环中等待运行。
当然非典型应用是要付出代价的,但只要严格遵守"非典型应用操作规范",那么 “可恶的非典”就能造福与其应用,并能达到奇妙之效果。
重申:“非典”绝非“技巧”,也不能等同看待,因为本不是一个“数量级的产物”。
团长以后会陆续地散播些流毒给大家~~~
如: mov a,#250 djnz b,$+4;//b<>0执行nop,b==0,执行a=0; mov a,#0
课毕。
团长放毒结束要去“吸毒”了~~~
HotC51@126.com 2009.2.23 于菜地。 团部:http://group.ednchina.com/1623/
|
|
文章评论(0条评论)
登录后参与讨论