[LOOK] LOOK+红杏头文件 学习第三帖:事件标志类小探

[复制链接]
 楼主| Swallow_0322 发表于 2011-6-9 20:33 | 显示全部楼层 |阅读模式
本帖最后由 hotpower 于 2011-6-19 01:24 编辑

   在第二帖基础上,用事件标志代替全局变量,增加蜂鸣器任务,完成该例程练习,望各位高手不吝赐教!
  
    LOOK实现四个小任务:
    ① task_led_t: 助学板上四个LED小灯轮流点亮,有两种显示模式,方式1为LED1--->LED2--->LED3--->LED4--->LED1循环,方式2为LED4--->LED3--->LED2--->LED1--->LED4循环,初始化为方式2;
② task_key_t: 助学板上KEY2通过查询的方式判断按下调整LED的循环方式;
③ 继承于interrupt_t的中断抽象类Key_t: 助学板上KEY1设置为下降沿中断,中断滞后服务函数内置位蜂鸣器鸣叫事件标志;
④ task_beep_t: 助学板上蜂鸣器响3声,该任务由KEY1同步。


初始化设置:时钟配置为 XTL12M_EN: 外部 4~24MHz 晶振使能
                    GPA2~5 GPB10 配置为输出模式
                   GPB14~15     配置为输入模式


关于flag_t:
ANY是wait()事件标志的集合中,任何一个事件到达都可以唤醒任务,相当于“或”运算;
ALL是wait()事件标志的集合中,所有事件全部到达时才能唤醒任务,相当于“与”运算;
当期待的事件标志只有一位时,无所谓ANY,ALL。
KEEP表示到达的事件标志,在唤醒了等待的任务后,该事件不消失(可以继续唤醒其它任务);
COSUME表示到达的事件标志,在唤醒了等待的任务后,该事件消失。


源程序:
led.h

  1. #include "look_config.h"
  2. #include <look.h>
  3. #include <instantiate>
  4. // 任务类 task_led_t 的定义
  5. class task_led_t : public task_t {
  6. public:
  7. task_led_t() __OPT_ATTR__; // 构造函数
  8. protected:
  9. void routine(); // 任务例程
  10. };
  11. // 任务类 task_led_t 的构造函数
  12. __OPT_INLINE__ task_led_t::task_led_t()
  13. {
  14. // TODO: 在此初始化 task_led_t 的类成员
  15. }
  16. // 任务类 task_key_t 的定义
  17. class task_key_t : public task_t {
  18. public:
  19. task_key_t() __OPT_ATTR__; // 构造函数
  20. int8_t key_read() __OPT_ATTR__;
  21. protected:
  22. void routine(); // 任务例程
  23. };

  24. // 任务类 task_key_t 的构造函数
  25. __OPT_INLINE__ task_key_t::task_key_t()
  26. {
  27. // TODO: 在此初始化 task_led_t 的类成员
  28. }
  29. // 任务类 task_beep_t 的定义
  30. class task_beep_t : public task_t {
  31. public:
  32. task_beep_t() __OPT_ATTR__; // 构造函数
  33. protected:
  34. void routine(); // 任务例程
  35. };

  36. // 任务类 task_key_t 的构造函数
  37. __OPT_INLINE__ task_beep_t::task_beep_t()
  38. {
  39. // TODO: 在此初始化 task_led_t 的类成员
  40. }

  41. extern instantiate::task<task_led_t, LOOK_STACK_SIZE> task_led;
  42. extern instantiate::task<task_key_t, LOOK_STACK_SIZE> task_key;
  43. extern instantiate::task<task_beep_t, LOOK_STACK_SIZE> task_beep;
led.cpp

  1. #include "NUC1xx.h"
  2. #include "NUC1xxM051Seriescfg.h"
  3. #include "led.h"

  4. flag_t Flag(0);  //位0为LED闪烁模式  位1为蜂鸣器任务同步标志

  5. class Key_t : public interrupt_t { //创建继承于interrupt_t的中断抽象类
  6. public:
  7. Key_t() __OPT_ATTR__; //构造函数
  8. protected:
  9. bool isr(int vector); //中断服务例程
  10. void dsr(int vector, uintptr_t count); //中断滞后服务例程
  11. };
  12. // Key_t 构造函数
  13. inline Key_t::Key_t()
  14. {
  15. attach(EINT1_IRQn); //连接外部中断1
  16. GPIOBs.IEN.Bits.Bit15 = 1; //GB15 使能下降沿或低电平中断
  17. GPIOBs.IMD.Bits.Pin15 = 0; //GB15 中断模式为边沿触发中断
  18. vector_t::enable(EINT1_IRQn); //使能外部中断1
  19. }
  20. // Key_t 中断服务例程
  21. bool Key_t::isr(int vector)
  22. {
  23. GPIOBs.ISRC.Regs = GPIOBs.ISRC.Regs; // 清中断 flag
  24. return true; //返回true 表示需要调度器调度本对象的 dsr() 例程,进行后续处理。
  25. }
  26. // Key1_t 中断滞后服务例程
  27. void Key_t::dsr(int vector, uintptr_t count)
  28. {
  29. if (vector == EINT1_IRQn)
  30. {
  31.   Flag.do_set_bits(0b010);;
  32. }
  33. }
  34. Key_t Key; // 创建Key对象
  35. // 任务类 task_led_t 的例程
  36. void task_led_t::routine()
  37. {
  38. // TODO: 在此编写 task_led_t 例程的内容
  39. GPIOAs.DMASK.Regs = ~0b111100;
  40. GPIOAs.DOUT.Regs = ~0b100;
  41. while (true)
  42. {
  43.   // TODO: 在此编写 task_led_t 例程的内容
  44.   uint32_t data = GPIOAs.DOUT.Regs & 0b111100;
  45.   int flag = Flag.peek();//Flag.wait(0b01, flag_t::ANY_KEEP);
  46.   if (flag)
  47.   {
  48.    data <<= 1;
  49.    data += data >> 4;
  50.   }
  51.   else
  52.   {
  53.    data >>= 1;
  54.    data += data << 4;
  55.   }
  56.   GPIOAs.DOUT.Regs = data;
  57.   delay(LOOK_TICKS_PER_SEC);
  58. }
  59. }
  60. // 任务类 task_key_t 的例程
  61. void task_key_t::routine()
  62. {
  63. // TODO: 在此编写 task_led_t 例程的内容
  64. while (true)
  65. {
  66.   // TODO: 在此编写 task_led_t 例程的内容
  67.   if (key_read())
  68.   {
  69.    int ** = Flag.peek();
  70.    if (**&0b01)
  71.     Flag.mask_bits(~0b01); //清除事件标志 位0
  72.    else
  73.     Flag.set_bits(0b01); //置位事件标志 位0
  74.   }
  75.   delay(LOOK_TICKS_PER_SEC/10);
  76. }
  77. }
  78. // 任务类 task_key_t 的成员函数
  79. __OPT_INLINE__ int8_t task_key_t::key_read()
  80. {
  81. uint32_t Key_Tmp = TRUE;
  82. static uint32_t Key_Record = TRUE;  //按键记录
  83. Key_Tmp = GPIOBs.PIN.Bits.Pin14;
  84. if(Key_Tmp==TRUE)      //无有效按键按下
  85. {
  86.   Key_Record = TRUE;     //清除按键记录
  87.   return FALSE;      //程序退出
  88. }
  89. if(Key_Record!=Key_Tmp)    //为新按键
  90. {
  91.   Key_Record=Key_Tmp;    //保存本次结果
  92.   delay(LOOK_TICKS_PER_SEC/100);  //延时去抖动
  93.   Key_Tmp = GPIOBs.PIN.Bits.Pin14;
  94.   if(Key_Tmp==Key_Record)
  95.   return TRUE;
  96. }
  97. return FALSE;
  98. }
  99. // 任务类 task_beep_t 的例程
  100. void task_beep_t::routine()
  101. {
  102. // TODO: 在此编写 task_led_t 例程的内容
  103.     GPIOBs.DOUT.Bits.Pin10 = 0;//蜂鸣器不响
  104. while (true)
  105. {
  106.   // TODO: 在此编写 task_led_t 例程的内容
  107.   int flag = Flag.wait(0b010, flag_t::ANY_CONSUME);  
  108.     if (flag)
  109.     {
  110.       for (uint32_t i = 0; i < 6; i ++)
  111.    { //蜂鸣器响三次
  112.         GPIOBs.DOUT.Bits.Pin10 ^= 1;  //蜂鸣器响PB10=1,不响PB10=0
  113.              delay(LOOK_TICKS_PER_SEC );  //断续间隔
  114.    }
  115.      }
  116. }
  117. }

  118. #ifdef LOOK_SCHEDULING_PRIORITY
  119. instantiate::task<task_key_t, LOOK_STACK_SIZE> task_key(0);
  120. instantiate::task<task_beep_t, LOOK_STACK_SIZE> task_beep(1);
  121. instantiate::task<task_led_t, LOOK_STACK_SIZE> task_led(2);
  122. #else
  123. instantiate::task<task_key_t, LOOK_STACK_SIZE> task_key;
  124. instantiate::task<task_beep_t, LOOK_STACK_SIZE> task_beep;
  125. instantiate::task<task_led_t, LOOK_STACK_SIZE> task_led;
  126. #endif
li923661521 发表于 2011-6-9 20:41 | 显示全部楼层
沙发?
plc_avr 发表于 2011-6-9 21:11 | 显示全部楼层
晕,沙发被抢了,只有地板啦...
hotpower 发表于 2011-6-10 00:11 | 显示全部楼层
俺打地道
murex 发表于 2011-6-10 08:44 | 显示全部楼层
俺不是只能钻地壳了
weshiluwei6 发表于 2011-6-13 09:08 | 显示全部楼层
支持大哥的 很好 紧跟学习哈
hotpower 发表于 2011-6-13 11:08 | 显示全部楼层
水王放假了?好好学习,游戏少玩
weshiluwei6 发表于 2011-6-25 08:34 | 显示全部楼层
7# hotpower

没放假  最近去导师要俺画图 忙了下 水王回来了 大叔
dake1478 发表于 2014-3-20 14:30 | 显示全部楼层
学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:播种一种行为,收获一种习惯;播种一种习惯,收获一种性格;播种一种性格,收获一种人生!

121

主题

1393

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:播种一种行为,收获一种习惯;播种一种习惯,收获一种性格;播种一种性格,收获一种人生!

121

主题

1393

帖子

4

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