[LOOK] LOOK_FLAG半主机例程及源码(2011.8.4更新)

[复制链接]
3324|9
 楼主| hotpower 发表于 2011-8-3 12:59 | 显示全部楼层 |阅读模式
本帖最后由 hotpower 于 2011-8-4 13:13 编辑

建议ICP采用5008版本

1.Cortex.rar(覆盖以前的LOOK安装目录)

2.LOOK_FLAG

3.贴图


4.程序片段

  1. #include "Look_Flag.h"
  2. #define LOOK_H 1
  3. #define LOOK_SEMIHOST
  4. #if LOOK_H == 0
  5. #include "NUC1xx.h"
  6. #include "NUC1xxM051Seriescfg.h"
  7. #else
  8. #include <nuc120re3an.h>
  9. using namespace nuvoton;
  10. #endif
  11. #ifdef LOOK_SEMIHOST
  12. #include <ostream>
  13. #include <semihosting>
  14. using namespace redapricot;
  15. ostream_t<semihosting::console_t, 128> cout;
  16. #endif

  17. flag_t Flag(0);
  18. class Keyboard_t : public interrupt_t {
  19. public:
  20. __INLINE__ Keyboard_t();
  21. protected:
  22. bool isr(int vector);
  23. void dsr(int vector, uintptr_t count);
  24. };
  25. // Keyboard_t 构造函数
  26. __INLINE__  Keyboard_t::Keyboard_t()
  27. {
  28. #ifdef LOOK_SEMIHOST
  29. cout << "Keyboard_t构造函数开始" << endl;
  30. #endif
  31. attach(EINT0_IRQn);
  32. attach(EINT1_IRQn);
  33. #if LOOK_H == 0
  34. GPIOBs.IEN.Regs = (1 << Pin15) | (1 << Pin14);   // 开启中断
  35. #else
  36. GPIOB.IEN(0)
  37.       .IF_EN15(1)
  38.    .IF_EN14(1); // 开启中断
  39. #endif
  40. vector_t::enable(EINT0_IRQn);
  41. vector_t::enable(EINT1_IRQn);
  42. #ifdef LOOK_SEMIHOST
  43. cout << "Keyboard_t构造函数结束" << endl;
  44. #endif
  45. }
  46. // Keyboard_t 中断服务例程
  47. bool Keyboard_t::isr(int vector)
  48. {
  49. #if LOOK_H == 0
  50. GPIOBs.ISRC.Regs = GPIOBs.ISRC.Regs;   // 清中断 flag
  51. #else
  52. //注意:下句被优化了
  53. // GPIOB.ISRC = GPIOB.ISRC;   // 清中断 flag
  54. //注意:下句不能被优化,特别注意()是建立缓存
  55. GPIOB.ISRC = GPIOB.ISRC();   // 清中断 flag
  56. #endif
  57. #ifdef LOOK_SEMIHOST
  58. cout << "中断Keyboard_t清除中断标志" << endl;
  59. #endif
  60. return true;
  61. }
  62. // Keyboard_t 中断滞后服务例程
  63. void Keyboard_t::dsr(int vector, uintptr_t count)
  64. {
  65. static uint32_t n = 0b01;
  66. if (vector == EINT0_IRQn)//Key2
  67. {
  68.   Flag.do_set_bits(n);
  69.   n <<= 1;
  70.   if (n == 8) n = 0b111;
  71.   else if(n > 8) n = 1;
  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(0b111);
  79. #ifdef LOOK_SEMIHOST
  80. cout << "中断Keyboard_t按下Key1键" << endl;
  81. #endif
  82. }
  83. }
  84. Keyboard_t Key;         // 创建Key对象

  85. // 任务类 task_Look_Flag_Led1_t 的例程
  86. void task_Look_Flag_Led1_t::routine()
  87. {
  88. #ifdef LOOK_SEMIHOST
  89. cout << "任务task_Look_Flag_Led1_t开始:" << endl;
  90. #endif
  91. // TODO: 在此编写 task_Look_Flag_Led1_t 例程的内容
  92. while (true) {
  93.   // TODO: 在此编写 task_Look_Flag_Led1_t 例程的内容
  94.   int flag = Flag.wait(0b001, flag_t::ANY_CONSUME);
  95.   if (flag)
  96.   {
  97. #ifdef LOOK_SEMIHOST
  98. cout << "任务task_Look_Flag_Led1_t flag=" << flag << endl;
  99. #endif
  100.       uint32_t data = ~0b100;
  101.    for (uint32_t i = 0; i < 8; i ++){
  102. #ifdef LOOK_SEMIHOST
  103. cout << "任务task_Look_Flag_Led1_t LED闪烁" << flag << endl;
  104. #endif
  105. #if LOOK_H == 0
  106.        GPIOAs.DMASK.Regs = ~0b001100;
  107.       GPIOAs.DOUT.Regs = data;
  108. #else
  109. //       GPIOA.DMASK = ~0b001100;
  110.        GPIOA.DMASK(-1)
  111.             .DMASK3(0)
  112.          .DMASK2(0);

  113.     GPIOA.DOUT = data;
  114. #endif
  115.     data ^= 0b1100;
  116.             delay(LOOK_TICKS_PER_SEC / 10);
  117.    }
  118. #if LOOK_H == 0
  119.    GPIOAs.DMASK.Regs = ~0b001100;
  120.    GPIOAs.DOUT.Regs = 0b001100;
  121. #else
  122. //   GPIOA.DMASK = ~0b001100;//节约4字节
  123.    GPIOA.DMASK(-1)
  124.         .DMASK3(0)
  125.      .DMASK2(0);
  126. //   GPIOA.DOUT = 0b001100;
  127.    GPIOA.DOUT(0)
  128.         .DOUT3(1)
  129.      .DOUT2(1);
  130. #endif
  131. #ifdef LOOK_SEMIHOST
  132. cout << "任务task_Look_Flag_Led1_t延时" << LOOK_TICKS_PER_SEC / 10 << "mS" << endl;
  133. #endif
  134.    delay(LOOK_TICKS_PER_SEC / 10);
  135.   }
  136.   
  137. }
  138. }

  139. // 任务类 task_Look_Flag_Led2_t 的例程
  140. void task_Look_Flag_Led2_t::routine()
  141. {      
  142. #ifdef LOOK_SEMIHOST
  143. cout << "任务task_Look_Flag_Led2_t开始:" << endl;
  144. #endif
  145. // TODO: 在此编写 task_Look_Flag_Led2_t 例程的内容
  146. while (true) {
  147.   // TODO: 在此编写 task_Look_Flag_Led2_t 例程的内容
  148.   int flag = Flag.wait(0b010, flag_t::ANY_CONSUME);
  149.   if (flag)
  150.   {
  151. #ifdef LOOK_SEMIHOST
  152. cout << "任务task_Look_Flag_Led2_t flag=" << flag << endl;
  153. #endif
  154.       uint32_t data = ~0b100000;
  155.    for (uint32_t i = 0; i < 8; i ++){
  156. #ifdef LOOK_SEMIHOST
  157. cout << "任务task_Look_Flag_Led2_t LED闪烁" << flag << endl;
  158. #endif
  159. #if LOOK_H == 0
  160.        GPIOAs.DMASK.Regs = ~0b110000;
  161.       GPIOAs.DOUT.Regs = data;
  162. #else
  163. //       GPIOA.DMASK = ~0b110000;//节约4字节
  164.        GPIOA.DMASK(-1)
  165.             .DMASK5(0)
  166.          .DMASK4(0);
  167.     GPIOA.DOUT = data;
  168. #endif
  169.     data ^= 0b110000;
  170.             delay(LOOK_TICKS_PER_SEC / 10);
  171.    }
  172. #if LOOK_H == 0
  173.    GPIOAs.DMASK.Regs = ~0b110000;
  174.    GPIOAs.DOUT.Regs = 0b110000;
  175. #else
  176. //   GPIOA.DMASK = ~0b110000;
  177.    GPIOA.DMASK(-1)
  178.         .DMASK5(0)
  179.         .DMASK4(0);
  180. //   GPIOA.DOUT = 0b110000;
  181.    GPIOA.DOUT(0)
  182.         .DOUT5(1)
  183.      .DOUT4(1);
  184. #endif
  185. #ifdef LOOK_SEMIHOST
  186. cout << "任务task_Look_Flag_Led2_t延时" << LOOK_TICKS_PER_SEC / 10 << "mS" << endl;
  187. #endif
  188.    delay(LOOK_TICKS_PER_SEC / 10);
  189.   }
  190. }
  191. }

  192. // 任务类 task_Look_Flag_Beep_t 的例程
  193. void task_Look_Flag_Beep_t::routine()
  194. {
  195. #ifdef LOOK_SEMIHOST
  196. cout << "任务task_Look_Flag_Beep_t开始:" << endl;
  197. #endif
  198. // TODO: 在此编写 task_Look_Flag_Beep_t 例程的内容
  199. while (true) {
  200.   // TODO: 在此编写 task_Look_Flag_Beep_t 例程的内容
  201.   int flag = Flag.wait(0b100, flag_t::ANY_CONSUME);
  202.   if (flag)
  203.   {
  204. #ifdef LOOK_SEMIHOST
  205. cout << "任务task_Look_Flag_Beep_t flag=" << flag << endl;
  206. #endif
  207.    for (uint32_t i = 0; i < 6; i ++){//蜂鸣器响三次
  208. #ifdef LOOK_SEMIHOST
  209. cout << "任务task_Look_Flag_Beep_t蜂鸣器发声" << endl;
  210. #endif
  211. #if LOOK_H == 0
  212.      GPIOBs.DOUT.Bits.Pin10 ^= 1;//蜂鸣器响PB10=1,不响PB10=0
  213. #else
  214.      #if LOOK_H == 1
  215.      GPIOB.DOUT().DOUT10 ^= 1;
  216. //   #else
  217. //     GPIOB.DOUT()
  218. //          .DOUT10.lambda([](uint32_t data) { return data ^ 1; });
  219.       #endif
  220. #endif
  221. #ifdef LOOK_SEMIHOST
  222. cout << "任务task_Look_Flag_Beep_t延时" << LOOK_TICKS_PER_SEC / 20 << "mS" << endl;
  223. #endif
  224.            delay(LOOK_TICKS_PER_SEC / 20);//断续间隔
  225.    }
  226. #if LOOK_H == 0
  227.    GPIOBs.DOUT.Bits.Pin10 = 0;//蜂鸣器不响
  228. #else
  229. //   GPIOB.DOUT().DOUT10 = 0;
  230.    GPIOB.DOUT().DOUT10(0);
  231. #endif
  232. #ifdef LOOK_SEMIHOST
  233. cout << "任务task_Look_Flag_Beep_t关闭蜂鸣器" << endl;
  234. #endif
  235.   }
  236. }
  237. //
  238. }
  239. #ifdef LOOK_SCHEDULING_PRIORITY
  240. instantiate::task<task_Look_Flag_Led1_t, LOOK_STACK_SIZE> task_Look_Flag_Led1(1);
  241. instantiate::task<task_Look_Flag_Led2_t, LOOK_STACK_SIZE> task_Look_Flag_Led2(2);
  242. instantiate::task<task_Look_Flag_Beep_t, LOOK_STACK_SIZE> task_Look_Flag_Beep(0);
  243. #else
  244. instantiate::task<task_Look_Flag_Led1_t, LOOK_STACK_SIZE> task_Look_Flag_Led1;
  245. instantiate::task<task_Look_Flag_Led2_t, LOOK_STACK_SIZE> task_Look_Flag_Led2;
  246. instantiate::task<task_Look_Flag_Beep_t, LOOK_STACK_SIZE> task_Look_Flag_Beep;
  247. #endif

本帖子中包含更多资源

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

×
jutyy 发表于 2011-8-3 13:12 | 显示全部楼层
去看看,学习
Swallow_0322 发表于 2011-8-3 14:07 | 显示全部楼层
大叔辛苦!
标记学习!
uniquehope 发表于 2011-8-3 14:30 | 显示全部楼层
uniquehope 发表于 2011-8-3 14:30 | 显示全部楼层
虽然不是很懂~~~~:loveliness:
 楼主| hotpower 发表于 2011-8-3 15:48 | 显示全部楼层
是老师辛苦!网友们晕着累。
wang0225 发表于 2011-8-3 16:12 | 显示全部楼层
顶起!哈哈
 楼主| hotpower 发表于 2011-8-3 17:20 | 显示全部楼层
下午我又做了几个例程,很不错!
uniquehope 发表于 2011-8-4 19:46 | 显示全部楼层
:'(又一次看了,不是很懂~~
电子write_cai 发表于 2011-8-6 09:39 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1460

主题

21617

帖子

508

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