[LOOK] abin0415的LOOK第一帖

[复制链接]
2251|6
 楼主| abin0415 发表于 2012-5-22 21:31 | 显示全部楼层 |阅读模式
目标要求:按键1控制LED1亮灭,当按下次数为3或3的倍数时,LED3亮0.5秒后熄灭,按键2控制LED2的亮灭,当按下次数为3或3的倍数时,LED4亮0.5秒后熄灭。两个按键相互独立计数,互补干扰。
任务分析:1.按键1和按键2分别是外部中断0和外部中断1,因此可以考虑用中断的方法控制按键。建立两个中断对象,每个对象管理一个中断。
2.定义一个全局flag_t对象,使用其两个bit位,每个中断管理一个bit位。
3.在中断对象的dsr()函数里,使用do_set_bits()函数,置位对应的bit。
4.主任务等待两个事件,负责LED1和LED2,因为这两个事件的处理不耗时间,并且为这两个事件各自设置一个计数器,计数为3或3的倍数时,发送一个事件到flag。flag还需再增加两个bit ,用于任务同步。
5.另外再建两个任务专门负责LED3和LED4的亮灭。这两个任务各自阻塞等待一个bit,然后点亮LED,延时0.5s,熄灭。
具体代码见附件

本帖子中包含更多资源

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

×
hotpower 发表于 2012-5-22 22:28 | 显示全部楼层
请将主程序贴出来
 楼主| abin0415 发表于 2012-5-23 08:06 | 显示全部楼层
  1. #include "Look_cond.h"
  2. #include "utils/debug.h"
  3. #include "numicro/sfr/gpio"

  4. #define FLAG_KEY1 1     
  5. #define FLAG_KEY2 1<<1
  6. #define FLAG_LED3 1<<2
  7. #define FLAG_LED4 1<<3

  8. flag_t Flag(0);

  9. // eint_t 类提供了 INT0/INT1 的接口
  10. // 当 INT0/INT1 发生时,对象将发送相应的 int 消息到 mbox。
  11. class eint_t : public interrupt_t {
  12. public:
  13.         __INLINE eint_t();

  14. protected:
  15.         bool isr(int vector);
  16.         void dsr(int vector, uintptr_t count);
  17. };

  18. // eint 构造函数
  19. __DEBUG//debug调试不优化便于调试
  20. __INLINE eint_t::eint_t()
  21. {
  22.         using namespace sfr::gpio;
  23.         attach(EINT0_IRQn);//绑定外部中断0
  24.         attach(EINT1_IRQn);//绑定外部中断1
  25.         GPIOB.IEN(0).IF_EN15(1).IF_EN14(1);//开启Key1,Key2中断
  26.         vector_t::enable(EINT0_IRQn);//使能外部中断0即Key1中断
  27.         vector_t::enable(EINT1_IRQn);//使能外部中断1即Key2中断
  28. }

  29. // eint 中断服务例程
  30. __DEBUG//debug调试不优化便于调试
  31. bool eint_t::isr(int vector)
  32. {
  33.         using namespace sfr::gpio;
  34.         GPIOB.ISRC = GPIOB.ISRC;                        // 清中断 flag
  35.         return true;
  36. }

  37. // eint 中断滞后服务例程
  38. __DEBUG//debug调试不优化便于调试
  39. void eint_t::dsr(int vector, uintptr_t count)
  40. {
  41.         using namespace sfr::gpio;
  42.         if (vector == EINT0_IRQn)//Key2中断
  43.         {
  44.                 Flag.do_set_bits(2);//在中断中唤醒任务2
  45.         }
  46.         else if (vector == EINT1_IRQn)//Key1中断
  47.         {
  48.                 Flag.do_set_bits(1);//在中断中唤醒任务1
  49.         }
  50. }

  51. eint_t eint;                                                                        // 创建 eint 对象

  52. instance_task1_Look_cond_t task1_Look_cond(1);        // 任务实例

  53. // 任务类 task1_Look_cond_t 的例程
  54. __DEBUG//debug调试不优化便于调试
  55. void task1_Look_cond_t::routine()
  56. {
  57.         // TODO: 在此编写 task1_Look_cond_t 例程的内容
  58.         using namespace sfr::gpio;
  59.         int cnt1 = 0;//按键1的计数变量
  60.         int cnt2 = 0;//按键2的计数变量
  61.         while (true) {
  62.                 // TODO: 在此编写 task1_Look_cond_t 例程的内容
  63.                 int flag = Flag.wait(FLAG_KEY1|FLAG_KEY2, flag_t::ANY_CONSUME);//阻塞等待Key1中断
  64.                 if (flag & FLAG_KEY1)
  65.                 {
  66.                         GPIOA.DOUT().DOUT2 ^= 1;//LED1闪烁
  67.                         cnt1 ++;
  68.                         if (cnt1%3 == 0)//每按键3次,LED3 亮0.5秒钟
  69.                         {
  70.                                 Flag.do_set_bits(FLAG_LED3);//唤醒任务2
  71.                         }
  72.                 }
  73.                 else if (flag & FLAG_KEY2)
  74.                 {
  75.                                 GPIOA.DOUT().DOUT3 ^= 1;//LED2闪烁
  76.                                 cnt2 ++;
  77.                                 if (cnt2%3 == 0)//每按键3次,LED4 亮0.5秒钟
  78.                                 {
  79.                                         Flag.do_set_bits(FLAG_LED4);//唤醒任务3
  80.                                 }
  81.                 }
  82.         }
  83. }

  84. instance_task2_Look_cond_t task2_Look_cond(2);        // 任务实例

  85. // 任务类 task1_Look_cond_t 的例程
  86. __DEBUG//debug调试不优化便于调试
  87. void task2_Look_cond_t::routine()
  88. {
  89.                 using namespace sfr::gpio;
  90.           while (true)
  91.                 {
  92.                                 int flag = Flag.wait(FLAG_LED3,flag_t::ANY_CONSUME);//阻塞等待LED3的标志
  93.                           if (flag)
  94.                                 {
  95.                                                 GPIOA.DOUT().DOUT4(0);//LED3亮
  96.                                     delay(LOOK_TICKS_PER_SEC / 2);//延时亮0.5S
  97.                                     GPIOA.DOUT().DOUT4(1);//LED3灭
  98.                                 }
  99.                 }
  100. }

  101. instance_task3_Look_cond_t task3_Look_cond(3);        // 任务实例

  102. // 任务类 task3_Look_cond_t 的例程
  103. __DEBUG//debug调试不优化便于调试
  104. void task3_Look_cond_t::routine()
  105. {
  106.         // TODO: 在此编写 task3_Look_cond_t 例程的内容
  107.         using namespace sfr::gpio;
  108.         while (true)
  109.         {
  110.                         int flag = Flag.wait(FLAG_LED4, flag_t::ANY_CONSUME);//阻塞等待LED4的标志
  111.                         if (flag)
  112.                         {
  113.                                 GPIOA.DOUT().DOUT5(0);//LED4亮
  114.                                 delay(LOOK_TICKS_PER_SEC / 2);//延时亮0.5S
  115.                                 GPIOA.DOUT().DOUT5(1);//LED4灭
  116.                         }
  117.         }
  118. }

hotpower 发表于 2012-5-23 09:45 | 显示全部楼层
在板子上全速运行通过否?
 楼主| abin0415 发表于 2012-5-23 10:25 | 显示全部楼层
能达到设计的效果
hotpower 发表于 2012-5-23 11:46 | 显示全部楼层
继续,look
 楼主| abin0415 发表于 2012-5-23 13:28 | 显示全部楼层
谢谢大叔支持。:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:细节决定成败,态度决定高度。

17

主题

2103

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部