搜索
bottom↓
回复: 9

这样写按键控制数码管动态显示,能不能称作“任务调度”

[复制链接]

出0入0汤圆

发表于 2012-10-15 14:15:32 | 显示全部楼层 |阅读模式
之前把数码管和按键都放在中断里面处理,是这样写的:http://www.amobbs.com/thread-5501382-1-1.html,因为PROTERU的原因,我一度怀疑程序在哪里出了错误呢 ,现在我把数码管刷新和按键处理都放在主程序里面,在中断里面设置标志位,主程序中判断以后选择性的执行这两个函数,想请教下达人,这是不是就是所谓的“任务调度”?如果是,那么这种方式比较好处理,因为程序执行的间隔时间都是固定的,但对于有些交互式外设,如AD,DA,LCD,必须从对方读取数据,时间间隔是离散的,应该怎样安排任务? 以上请教!

附本次程序和仿真图(仿真是看不到效果的,但通过硬件测试)
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. uchar shu=85,count;
  5. bit flag;
  6. sbit kb=P3^4;



  7. void sumaguan()
  8. {
  9.         static uchar i=0;
  10.         i++;
  11.         P0=0XFF;
  12.         P2=~(1<<(i-1));
  13.         if(i<3)
  14.                 P0=0XC0;
  15.         else if(i==3)
  16.                 P0=tab[shu/10];
  17.         else if(i==4)
  18.                 {
  19.                         P0=tab[shu%10];
  20.                         i=0;
  21.                 }
  22. }
  23. void anjianchuli()
  24. {
  25.         static uchar zhuangtai=0;
  26.         switch(zhuangtai)
  27.                 {
  28.                         case 0:
  29.                                 {
  30.                                         if(kb==0)
  31.                                                 zhuangtai++;
  32.                                 };break;
  33.                         case 1:
  34.                                 {
  35.                                         if(kb==0)
  36.                                                 zhuangtai++;
  37.                                         else
  38.                                                 zhuangtai--;

  39.                                 };break;
  40.                         case 2:
  41.                                 {
  42.                                         if(kb==0)
  43.                                                 {
  44.                                                         zhuangtai++;
  45.                                                         shu++;
  46.                                                         if(shu==100)
  47.                                                                 shu=0;
  48.                                                 }
  49.                                         else
  50.                                                         zhuangtai--;
  51.                                 };break;
  52.                         case 3:
  53.                                 {
  54.                                         if(kb==1)
  55.                                                 zhuangtai=0;
  56.                                 };break;
  57.                 }
  58.         }



  59. main()
  60. {
  61.         TMOD = 0x01;
  62.     TH0 = 0x0E8;
  63.     TL0 = 0x90;
  64.     EA = 1;
  65.     ET0 = 1;
  66.     TR0 = 1;
  67.         while(1)
  68.         {
  69.                 if(flag==1)
  70.                 {
  71.                         flag=0;
  72.                         sumaguan();
  73.                 }
  74.                 if(count>=3)
  75.                 {
  76.                         anjianchuli();
  77.                         count=0;
  78.                 }
  79.         }
  80.        
  81. }
  82. void timer0() interrupt 1
  83. {
  84.         flag=1;
  85.         count++;
  86.     TH0 = 0x0E8;
  87.     TL0 = 0x90;
  88. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-10-15 15:29:41 | 显示全部楼层
顶下,今天星期一,都在上班忙吗,没人回复哦

出0入0汤圆

发表于 2012-10-15 16:00:47 | 显示全部楼层
这个不能算作是任务调度,只是把中断程序中的内容拿出来,放在主函数中执行了。
可以想象一种极端情况,比如刷LCD的程序出错堵死了,那么另外的程序也不能执行了。
而真正的任务调度,是由一个主时钟驱动,每隔一定周期切换一次任务,假如某个线程堵死了,其他的还能执行到。

出0入0汤圆

 楼主| 发表于 2012-10-15 16:18:02 | 显示全部楼层
channe 发表于 2012-10-15 16:00
这个不能算作是任务调度,只是把中断程序中的内容拿出来,放在主函数中执行了。
可以想象一种极端情况,比 ...

的确如你所说,我在主楼就说过间隔时间离散的不能这么处理,但还想不到什么好的办法。如果举段代码示教,谢谢。

出0入0汤圆

发表于 2012-10-15 16:53:25 | 显示全部楼层
本帖最后由 channe 于 2012-10-15 16:55 编辑

代码不好写,思路是这样。
结构体
{
任务指针   //(就是程序的指针,例如你的sumaguan)
寄存器状态  //( 保存运行状态 )
任务状态 //(可以放置 请求 睡眠 等等)
} Task[n];
然后你需要一个系统滴答时钟,比如1ms的中断,最高优先级。
然后每一毫秒到了,检查 任务状态 ,如果需要调用 ,那么调用这个函数   *(任务指针)();   //调用之前把上一个正在执行的任务的寄存器保存下载,把要执行的任务的寄存器恢复。

出0入0汤圆

 楼主| 发表于 2012-10-15 17:00:27 | 显示全部楼层
好的,谢谢,我领会一下。

出0入0汤圆

 楼主| 发表于 2012-10-15 17:22:23 | 显示全部楼层
channe 发表于 2012-10-15 16:53
代码不好写,思路是这样。
结构体
{

这个思想我想应该能理解了,这是防止有些程序的执行时间大于定时器的时间间隔,那么只要到时间了,不管原有函数有没有执行完毕,都先放下,等到下一次时间周期到了后接着执行。是这样吧。


但我还是写不了,因为这个结构体里面的寄存器状态和任务状态不知道写什么。能否就我主楼的函数改写一下,万分感谢。

难点在于要强制改变中断的执行方式,因为一般是从哪里中断再回到哪里,而作为任务调度是中断后保护断点,再执行下一函数。

另外,想请教下这么安排程序的好处和不足一般在什么地方,操作系统的思想是不是就是这样的?

出0入0汤圆

发表于 2012-10-15 17:30:37 | 显示全部楼层
renwocai 发表于 2012-10-15 17:22
这个思想我想应该能理解了,这是防止有些程序的执行时间大于定时器的时间间隔,那么只要到时间了,不管原 ...

是可以防止有些程序的执行时间大于定时器的时间间隔,但主要不是为了这个。
反而每个任务都应该做成一个死循环。
然后系统的滴答时钟取多少比较好我也不知道,但不是为了防止超时那种,而应该是第一个任务执行一步,第二个任务执行一步,第一个任务,第二个任务。这样子。

出0入0汤圆

发表于 2012-10-15 17:31:46 | 显示全部楼层
参见这个文章 http://www.amobbs.com/forum.php? ... C%E7%B3%BB%E7%BB%9F

出0入0汤圆

发表于 2012-10-15 19:16:25 | 显示全部楼层
时间长的任务,用状态机分成几个子任务,使每个任务占用时间最短,消除了可恶的死等延时。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表