单片机多任务程序的框架

2019-04-15 17:19发布

下面说的单片机也主要是51与台系芯片,也就是现在的工作。其它应用不在讨论范围。才识有限,也敬请前辈们勘误,指教。 一个真正意义的单片机系统肯定会是多任务的,怎样建立一个多任务程序的框架1 前后台系统:      前台是中断程序,后台是执行主程序,当中断来了,就转到前台来执行时间性要求高的任务。不断的切换。2 分时扫描(主程序中执行)  分时扫描思想:  分时扫描就是在中断中采用一些时间标志,在主程序里分时处理功能模块;  时间精度要求很高的只能在中断中处理(比如单工通讯),但中断中尽量不要写过多的程序(计时程序是必须的);  这种方法好想也叫时间片扫描;  核心思想实现的几个步骤:  第一,用中断来计时,中断时间50或100us(这是我的习惯,数值根据自己程序设置);  第二,在中断程序中以50或100us为基准放3个计时器(就是计数器)并有时间标志;100US 1MS 10MS  500MS 都可行但时间要求精准    第三,在主程序的循环里面放一个专门处理时间的子程序。  第四,“程序是跑着来等,而不是站着来等”,(引用别人的话)/**************************************************************************************************程序名称:T2中断处理功能描述:定时100US中断一次中断10次=100x10=1Ms 输入变量:输出变量:无影响标志位:***************************************************************************************************/void Timer2_ISR() interrupt 5{            TF2=0;                  //中断到来           B_100USFlag=1;          //100us时间标志           R_1MSCount++;           //1MS计数器++           if(R_1MSCount==10)      //判断1MS时间是否到           {             R_1MSCount=0;         //清除数据             B_1MSFlag=1;          //1MS时间标志             R_10MSCount++;        //10MS计数器++             if(R_10MSCount==10)   //判断10MS时间是否到             {               R_10MSCount=0;      //清除数据               B_10MSFlag=1;       //10MS时间标志             }            }} 接下来看看我的主程序   while(1){  这里清除看门狗//===========================1OOUS处理的事件=============================   if(B_100USFlag==1)  {    B_100USFlag=0;    ADCScan_Por();   //ADC检测程序  }//===========================1ms处理的事件=============================  if(B_1MSFlag==1)   {    B_1MSFlag=0;    Key_Scan();    //按键程序    ADC_ValPor();  //AD数据处理子程序(也可以在10MS处理)   }  //===========================10ms处理的事件=============================  if(B_10MSFlag==1)   {    B_10MSFlag=0;    LCD_Por();         //LDC显示子程序   } } 很是简单明了吧!我一直是这样用的;觉得还好,当然,这里只是说一种可行的办法而已,不是说只有这种办法,如果大家有好的思想也分享一下哦,编写程序是一门艺术,写出来很容易,但是写得好,写得精巧,那就很难了。3)无特殊要求要将看门狗与低压复位打开(具体要求根据实际情况进行配置) 最后感谢大家能看完,在下还是菜鸟,希望能得到前辈们的指导,拜谢  2014/3/23四非人QQ:189708929