[LOOK] LOOK菜鸟cond应用例程

[复制链接]
 楼主| hotpower 发表于 2011-5-22 22:55 | 显示全部楼层 |阅读模式
本帖最后由 hotpower 于 2011-5-23 19:02 编辑

本例程是在Lee老师和M0菜地等网友的指导和监督下在线实时完成的。

点击下载LOOK_COND


1.COND.H
  1. #ifndef __COND_H
  2. #define __COND_H

  3. #include "look_config.h"
  4. #include <look.h>
  5. #include <instantiate>

  6. // 任务类 task_COND1_t 的定义
  7. class task_COND1_t : public task_t {
  8. public:
  9. task_COND1_t() __OPT_ATTR__; // 构造函数

  10. protected:
  11. void routine(); // 任务例程
  12. };

  13. // 任务类 COND1 的构造函数
  14. __OPT_INLINE__ task_COND1_t::task_COND1_t()
  15. {
  16. // TODO: 在此初始化 task_COND_t 的类成员
  17. }

  18. // 任务类 task_COND2_t 的定义
  19. class task_COND2_t : public task_t {
  20. public:
  21. task_COND2_t() __OPT_ATTR__; // 构造函数

  22. protected:
  23. void routine(); // 任务例程
  24. };

  25. // 任务类 COND2 的构造函数
  26. __OPT_INLINE__ task_COND2_t::task_COND2_t()
  27. {
  28. // TODO: 在此初始化 task_COND_t 的类成员
  29. }

  30. // 任务类 task_COND3_t 的定义
  31. class task_COND3_t : public task_t {
  32. public:
  33. task_COND3_t() __OPT_ATTR__; // 构造函数

  34. protected:
  35. void routine(); // 任务例程
  36. };

  37. // 任务类 COND3 的构造函数
  38. __OPT_INLINE__ task_COND3_t::task_COND3_t()
  39. {
  40. // TODO: 在此初始化 task_COND_t 的类成员
  41. }

  42. // 任务类 task_BEEP_t 的定义
  43. class task_BEEP_t : public task_t {
  44. public:
  45. task_BEEP_t() __OPT_ATTR__; // 构造函数

  46. protected:
  47. void routine(); // 任务例程
  48. };

  49. // 任务类 BEEP 的构造函数
  50. __OPT_INLINE__ task_BEEP_t::task_BEEP_t()
  51. {
  52. // TODO: 在此初始化 task_COND_t 的类成员
  53. }

  54. extern instantiate::task<task_COND1_t, LOOK_STACK_SIZE> task_COND1;
  55. extern instantiate::task<task_COND2_t, LOOK_STACK_SIZE> task_COND2;
  56. extern instantiate::task<task_COND3_t, LOOK_STACK_SIZE> task_COND3;
  57. extern instantiate::task<task_BEEP_t, LOOK_STACK_SIZE> task_BEEP;

  58. #endif // __COND_H
2.COND.CPP

  1. #include "COND.h"
  2. #include "NUC1xx.h"
  3. #include "NUC1xxM051Seriescfg.h"
  4. int sum = 0;
  5. flag_t flag(0);
  6. mutex_t mutex;
  7. cond_t cond;
  8. class Keyboard_t : public interrupt_t {
  9. public:
  10. Keyboard_t() __OPT_ATTR__;
  11. protected:
  12. bool isr(int vector);
  13. void dsr(int vector, uintptr_t count);
  14. };
  15. // Keyboard_t 构造函数
  16. inline Keyboard_t::Keyboard_t()
  17. {
  18. attach(EINT0_IRQn);
  19. attach(EINT1_IRQn);
  20. GPIOBs.IEN.Regs = (1 << Pin15) | (1 << Pin14);   // 开启中断
  21. vector_t::enable(EINT0_IRQn);
  22. vector_t::enable(EINT1_IRQn);
  23. }
  24. // Keyboard_t 中断服务例程
  25. bool Keyboard_t::isr(int vector)
  26. {
  27. GPIOBs.ISRC.Regs = GPIOBs.ISRC.Regs;   // 清中断 flag
  28. return true;
  29. }
  30. // Keyboard_t 中断滞后服务例程
  31. void Keyboard_t::dsr(int vector, uintptr_t count)
  32. {
  33. if (vector == EINT0_IRQn)//Key2
  34. {
  35.   flag.do_set_bits(0b110);
  36. }
  37. else if (vector == EINT1_IRQn)//Key1
  38. {
  39.   flag.do_set_bits(0b101);
  40. }
  41. }
  42. Keyboard_t Key;         // 创建Key对象
  43. // 任务类 task_COND1_t 的例程
  44. void task_COND1_t::routine()
  45. {
  46. // TODO: 在此编写 task_COND1_t 例程的内容
  47. while (true) {
  48.   // TODO: 在此编写 task_COND1_t 例程的内容
  49.   int ** = flag.wait(0b001, flag_t::ANY_CONSUME);
  50.   if (**)
  51.   {
  52.    mutex.lock();
  53.    sum++;
  54.    if (sum < 2) mutex.unlock();
  55.    else{
  56.     mutex.unlock();
  57.     cond.signal();
  58.    }
  59.   }
  60. }
  61. }
  62. // 任务类 task_COND2_t 的例程
  63. void task_COND2_t::routine()
  64. {
  65. // TODO: 在此编写 task_COND2_t 例程的内容
  66. while (true) {
  67.   // TODO: 在此编写 task_COND2_t 例程的内容
  68.   int ** = flag.wait(0b010, flag_t::ANY_CONSUME);
  69.   if (**)
  70.   {
  71.    mutex.lock();
  72.    sum++;
  73.    if (sum < 2) mutex.unlock();
  74.    else{
  75.     mutex.unlock();
  76.     cond.signal();
  77.    }
  78.   }
  79. }
  80. }
  81. // 任务类 task_COND3_t 的例程
  82. void task_COND3_t::routine()
  83. {
  84. // TODO: 在此编写 task_COND3_t 例程的内容
  85. static int count = 1;
  86. while (true) {
  87.   // TODO: 在此编写 task_COND3_t 例程的内容
  88.   mutex.lock();
  89.   while (sum < 2){
  90.    cond.wait(mutex);
  91.    mutex.unlock();
  92.    sum = 0;
  93.    break;
  94.   }
  95.   GPIOAs.DMASK.Regs = ~0b111100;
  96.   GPIOAs.DOUT.Regs = (count << 2) ^ 0b111100;
  97.   if (++count >= 16) count = 1;
  98. }
  99. }
  100. // 任务类 task_BEEP_t 的例程
  101. void task_BEEP_t::routine()
  102. {
  103. // TODO: 在此编写 task_BEEP_t 例程的内容
  104. while (true) {
  105.   // TODO: 在此编写 task_BEEP_t 例程的内容
  106.   int ** = flag.wait(0b100, flag_t::ANY_CONSUME);
  107.   if (**)
  108.   {
  109.    for (uint32_t i = 0; i < 6; i ++){//蜂鸣器响三次
  110.      GPIOBs.DOUT.Bits.Pin10 ^= 1;//蜂鸣器响PB10=1,不响PB10=0
  111.            delay(LOOK_TICKS_PER_SEC / 20);//断续间隔
  112.    }
  113.    GPIOBs.DOUT.Bits.Pin10 = 0;//蜂鸣器不响
  114.   }
  115. }
  116. }
  117. #ifdef LOOK_SCHEDULING_PRIORITY
  118. instantiate::task<task_COND1_t, LOOK_STACK_SIZE> task_COND1(0);
  119. instantiate::task<task_COND2_t, LOOK_STACK_SIZE> task_COND2(0);
  120. instantiate::task<task_COND3_t, LOOK_STACK_SIZE> task_COND3(0);
  121. instantiate::task<task_BEEP_t, LOOK_STACK_SIZE> task_BEEP(0);
  122. #else
  123. instantiate::task<task_COND1_t, LOOK_STACK_SIZE> task_COND1;
  124. instantiate::task<task_COND2_t, LOOK_STACK_SIZE> task_COND2;
  125. instantiate::task<task_COND3_t, LOOK_STACK_SIZE> task_COND3;
  126. instantiate::task<task_BEEP_t, LOOK_STACK_SIZE> task_BEEP;
  127. #endif

本帖子中包含更多资源

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

×
lzlz70707 发表于 2011-5-22 23:00 | 显示全部楼层
准备山寨
murex 发表于 2011-5-22 23:03 | 显示全部楼层
强大的山寨
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1460

主题

21619

帖子

508

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1460

主题

21619

帖子

508

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