[LOOK] 根据菜农大叔的LOOK_COND改的半主机调试例子

[复制链接]
 楼主| wang0225 发表于 2011-8-18 12:28 | 显示全部楼层 |阅读模式
本帖最后由 wang0225 于 2011-8-18 15:12 编辑
  1. #include "COND.h"
  2. #define LOOK_H 1
  3. #define LOOK_SEMIHOST 1
  4. #if LOOK_H == 0
  5. #include "NUC1xx.h"
  6. #include "NUC1xxM051Seriescfg.h"
  7. #else
  8. #define __HAVE_GPIO
  9. #include <nuc120re3an.h>
  10. using namespace nuvoton;
  11. #endif
  12. #ifdef LOOK_SEMIHOST
  13. #include <ostream>
  14. #include <semihosting>
  15. using namespace redapricot;
  16. ostream_t<semihosting::console_t, 128> cout;
  17. #endif
  18. int sum = 0;
  19. flag_t flag(0);
  20. mutex_t mutex;
  21. cond_t cond;
  22. class Keyboard_t : public interrupt_t {
  23. public:
  24. __INLINE__ Keyboard_t();
  25. protected:
  26. bool isr(int vector);
  27. void dsr(int vector, uintptr_t count);
  28. };
  29. // Keyboard_t 构造函数
  30. __INLINE__ Keyboard_t::Keyboard_t()
  31. {
  32. #ifdef LOOK_SEMIHOST
  33. cout << "Keyboard_t构造函数开始" << endl;
  34. #endif
  35. attach(EINT0_IRQn);
  36. attach(EINT1_IRQn);
  37. #if LOOK_H == 0
  38. GPIOBs.IEN.Regs = (1 << Pin15) | (1 << Pin14);   // 开启中断
  39. #else
  40. GPIOB.IEN(0)
  41.       .IF_EN15(1)
  42.    .IF_EN14(1); // 开启中断
  43. #endif
  44. vector_t::enable(EINT0_IRQn);
  45. vector_t::enable(EINT1_IRQn);
  46. #ifdef LOOK_SEMIHOST
  47. cout << "Keyboard_t构造函数结束" << endl;
  48. #endif
  49. }
  50. // Keyboard_t 中断服务例程
  51. bool Keyboard_t::isr(int vector)
  52. {
  53. #if LOOK_H == 0
  54. GPIOBs.ISRC.Regs = GPIOBs.ISRC.Regs;   // 清中断 flag
  55. #else
  56. //注意:下句被优化了
  57. // GPIOB.ISRC = GPIOB.ISRC;   // 清中断 flag
  58. //注意:下句不能被优化,特别注意()是建立缓存
  59. GPIOB.ISRC = GPIOB.ISRC();   // 清中断 flag
  60. #endif
  61. #ifdef LOOK_SEMIHOST
  62. cout << "中断Keyboard_t清除中断标志" << endl;
  63. #endif
  64. return true;
  65. }
  66. // Keyboard_t 中断滞后服务例程
  67. void Keyboard_t::dsr(int vector, uintptr_t count)
  68. {
  69. if (vector == EINT0_IRQn)//Key2
  70. {
  71.   flag.do_set_bits(0b110);
  72. #ifdef LOOK_SEMIHOST
  73. cout << "中断Keyboard_t按下Key2键" << endl;
  74. #endif
  75. }
  76. else if (vector == EINT1_IRQn)//Key1
  77. {
  78.   flag.do_set_bits(0b101);
  79. #ifdef LOOK_SEMIHOST
  80. cout << "中断Keyboard_t按下Key1键" << endl;
  81. #endif
  82. }
  83. }
  84. Keyboard_t Key;         // 创建Key对象
  85. // 任务类 task_COND1_t 的例程
  86. void task_COND1_t::routine()
  87. {
  88. // TODO: 在此编写 task_COND1_t 例程的内容
  89. #ifdef LOOK_SEMIHOST
  90. cout << "任务task_COND1_t开始:" << endl;
  91. #endif
  92. while (true) {
  93.   // TODO: 在此编写 task_COND1_t 例程的内容
  94.   int 标志寄存器 = flag.wait(0b001, flag_t::ANY_CONSUME);
  95.   if (标志寄存器)
  96.   {
  97. #ifdef LOOK_SEMIHOST
  98. cout << "任务task_COND1_t 标志寄存器=" << 标志寄存器 << endl;
  99. #endif
  100.    mutex.lock();
  101. #ifdef LOOK_SEMIHOST
  102. cout << "任务task_COND1_t mutex.lock()" << endl;
  103. #endif
  104.    sum++;
  105.    if (sum < 2) {mutex.unlock();
  106. #ifdef LOOK_SEMIHOST
  107. cout << "任务task_COND1_t mutex.unlock()" << endl;
  108. #endif
  109.    }
  110.    else{
  111.     mutex.unlock();
  112.     cond.signal();
  113. #ifdef LOOK_SEMIHOST
  114. cout << "任务task_COND1_t cond.signal()" << endl;
  115. cout << "任务task_COND1_t mutex.unlock()" << endl;
  116. #endif
  117.    }
  118.   }
  119. }
  120. }
  121. // 任务类 task_COND2_t 的例程
  122. void task_COND2_t::routine()
  123. {
  124. // TODO: 在此编写 task_COND2_t 例程的内容
  125. while (true) {
  126.   // TODO: 在此编写 task_COND2_t 例程的内容
  127. #ifdef LOOK_SEMIHOST
  128. cout << "任务task_COND2_t开始:" << endl;
  129. #endif
  130.   int 标志寄存器 = flag.wait(0b010, flag_t::ANY_CONSUME);
  131.   if (标志寄存器)
  132.   {
  133. #ifdef LOOK_SEMIHOST
  134. cout << "任务task_COND2_t 标志寄存器=" << 标志寄存器 << endl;
  135. #endif
  136.    mutex.lock();
  137. #ifdef LOOK_SEMIHOST
  138. cout << "任务task_COND2_t mutex.lock()" << endl;
  139. #endif
  140.    sum++;
  141.    if (sum < 2) {mutex.unlock();
  142. #ifdef LOOK_SEMIHOST
  143. cout << "任务task_COND2_t mutex.unlock()" << endl;
  144. #endif      
  145.    }
  146.    else{
  147.     mutex.unlock();
  148.     cond.signal();
  149. #ifdef LOOK_SEMIHOST
  150. cout << "任务task_COND2_t cond.signal()" << endl;
  151. cout << "任务task_COND2_t mutex.unlock()" << endl;
  152. #endif
  153.    }
  154.   }
  155. }
  156. }
  157. // 任务类 task_COND3_t 的例程
  158. void task_COND3_t::routine()
  159. {
  160. // TODO: 在此编写 task_COND3_t 例程的内容
  161. static int count = 1;
  162. #ifdef LOOK_SEMIHOST
  163. cout << "任务task_COND3_t开始:" << endl;
  164. #endif
  165. while (true) {
  166.   // TODO: 在此编写 task_COND3_t 例程的内容
  167.   mutex.lock();
  168. #ifdef LOOK_SEMIHOST
  169. cout << "任务task_COND3_t mutex.lock()" << endl;
  170. #endif
  171.   while (sum < 2){
  172.    cond.wait(mutex);
  173. #ifdef LOOK_SEMIHOST
  174. cout << "任务task_COND3_t 收到cond.signal()" << endl;
  175. #endif
  176.    mutex.unlock();
  177.    sum = 0;
  178.    break;
  179.   }
  180. #if LOOK_H == 0
  181.        GPIOAs.DMASK.Regs = ~0b111100;
  182.       GPIOAs.DOUT.Regs = (count << 2) ^ 0b111100;
  183. #else
  184.    GPIOA.DMASK(-1)
  185.         .DMASK5(0)
  186.      .DMASK4(0)
  187.      .DMASK3(0)
  188.      .DMASK2(0);
  189.    GPIOA.DOUT = (count << 2) ^ 0b111100;
  190. #endif
  191.   if (++count >= 16) count = 1;
  192. #ifdef LOOK_SEMIHOST
  193. cout << "任务task_COND3_t 相应LED亮灭" << endl;
  194. #endif
  195. }
  196. }
  197. // 任务类 task_BEEP_t 的例程
  198. void task_BEEP_t::routine()
  199. {
  200. // TODO: 在此编写 task_BEEP_t 例程的内容
  201. #ifdef LOOK_SEMIHOST
  202. cout << "任务task_BEEP_t开始:" << endl;
  203. #endif
  204. while (true) {
  205.   // TODO: 在此编写 task_BEEP_t 例程的内容
  206.   int 标志寄存器 = flag.wait(0b100, flag_t::ANY_CONSUME);
  207.   if (标志寄存器)
  208.   {
  209. #ifdef LOOK_SEMIHOST
  210. cout << "任务task_BEEP_t 标志寄存器=" << 标志寄存器 << endl;
  211. #endif   
  212.    for (uint32_t i = 0; i < 6; i ++){//蜂鸣器响三次
  213. #if LOOK_H == 0
  214.       GPIOBs.DOUT.Bits.Pin10 ^= 1;//蜂鸣器响PB10=1,不响PB10=0
  215. #else
  216.       GPIOB.DOUT().DOUT10 ^= 1;
  217. #endif
  218.            delay(LOOK_TICKS_PER_SEC / 20);//断续间隔
  219.    }
  220. #if LOOK_H == 0
  221.    GPIOBs.DOUT.Bits.Pin10 = 0;
  222. #else
  223.    GPIOB.DOUT().DOUT10(0);
  224. #endif
  225. #ifdef LOOK_SEMIHOST
  226. cout << "任务task_BEEP_t关闭蜂鸣器" << endl;
  227. #endif
  228.   }
  229. }
  230. }
  231. #ifdef LOOK_SCHEDULING_PRIORITY
  232. instantiate::task<task_COND1_t, LOOK_STACK_SIZE> task_COND1(0);
  233. instantiate::task<task_COND2_t, LOOK_STACK_SIZE> task_COND2(0);
  234. instantiate::task<task_COND3_t, LOOK_STACK_SIZE> task_COND3(0);
  235. instantiate::task<task_BEEP_t, LOOK_STACK_SIZE> task_BEEP(0);
  236. #else
  237. instantiate::task<task_COND1_t, LOOK_STACK_SIZE> task_COND1;
  238. instantiate::task<task_COND2_t, LOOK_STACK_SIZE> task_COND2;
  239. instantiate::task<task_COND3_t, LOOK_STACK_SIZE> task_COND3;
  240. instantiate::task<task_BEEP_t, LOOK_STACK_SIZE> task_BEEP;
  241. #endif
  242. 工程暂不传啦,大家自己先照着改试下

本帖子中包含更多资源

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

×
 楼主| wang0225 发表于 2011-8-18 13:21 | 显示全部楼层
只有自己试过才知道这个多好啊:lol
hotpower 发表于 2011-8-18 13:30 | 显示全部楼层
有图才有真相~~~
 楼主| wang0225 发表于 2011-8-18 15:13 | 显示全部楼层
大叔我,我传拉一张图片:)
 楼主| wang0225 发表于 2011-8-22 09:13 | 显示全部楼层
给自己加一层啦
hotpower 发表于 2011-8-22 10:27 | 显示全部楼层
继续努力,不能为了选美而学习。
学习是为自己而非别人。
 楼主| wang0225 发表于 2011-8-22 15:51 | 显示全部楼层
谨记大叔这句话:学习是为自己而非别人!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

185

帖子

1

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