[LOOK] 学习体会第六贴——实现在任务中调用其他类成员函数

[复制链接]
2691|6
 楼主| gdmgb520 发表于 2011-9-26 23:04 | 显示全部楼层 |阅读模式
看了CPP类的定义,成员函数的调用,参考了LOOK例程,尤其是LOOK_RTC,终于实现在任务中底啊用另外一个对象的成员函数来控制LED闪烁。到此,对LOOK和CPP有了一点点的了解了。

实现的功能是在task_led1任务中调用led3对象的led_off()函数实现LED1灯的闪烁。是在LOOK_LED的基础上改写的。
贴代码:
led.cpp
  1. #include "led.h"

  2. #define LOOK_H 1

  3. #if LOOK_H == 0
  4. #include "NUC1xx.h"
  5. #include "NUC1xxM051Seriescfg.h"
  6. #else
  7. #define __HAVE_GPIO
  8. #include <nuc120re3an.h>
  9. using namespace nuvoton;
  10. #endif

  11. // 任务类 task_led3_t 的定义
  12. class task_led3_t : public task_t {
  13. public:
  14.         __INLINE__ task_led3_t();        // 构造函数
  15.        
  16. public:
  17.         void led_off(void);
  18. };

  19. // 任务类 task_led3_t 的构造函数
  20. __INLINE__ task_led3_t::task_led3_t()
  21. {
  22.         // TODO: 在此初始化 task_led3_t 的类成员
  23. }

  24. void task_led3_t::led_off(void)
  25. {
  26.         static uint32_t data = 0b100;
  27.         GPIOA.DMASK(-1)
  28.                  .DMASK2(0);
  29.     GPIOA.DOUT = data;
  30.         data ^= 0b100;
  31. }

  32. task_led3_t led3;         //创建对象

  33. // 任务类 task_led_t 的例程
  34. void task_led1_t::routine()
  35. {
  36.         // TODO: 在此编写 task_led_t 例程的内容
  37.         uint32_t data = ~0b1000;
  38.         while (true) {
  39.                 // TODO: 在此编写 task_led_t 例程的内容
  40.                 data &= 0b111000;
  41.                 data <<= 1;
  42.                 data += data >> 3;
  43. #if LOOK_H == 0
  44.                 GPIOAs.DMASK.Regs = ~0b111000;
  45.                 GPIOAs.DOUT.Regs = data;
  46. #else
  47.                 GPIOA.DMASK(-1)
  48.                      .DMASK5(0)
  49.                          .DMASK4(0)
  50.                          .DMASK3(0);
  51.             GPIOA.DOUT = data;
  52. #endif
  53.                 delay(LOOK_TICKS_PER_SEC / 2);
  54.                 led3.led_off();
  55.         }
  56. }
  57. // 任务类 task_led_t 的例程
  58. void task_led2_t::routine()
  59. {
  60.         // TODO: 在此编写 task_led_t 例程的内容
  61.         uint32_t data = 0b100;
  62.         while (true) {
  63.                 // TODO: 在此编写 task_led_t 例程的内容
  64. #if LOOK_H == 0
  65.                 GPIOAs.DMASK.Regs = ~0b100;
  66.                 GPIOAs.DOUT.Regs = data;
  67. #else
  68.                 GPIOA.DMASK(-1)
  69.                          .DMASK2(0);
  70.             GPIOA.DOUT = data;
  71. #endif
  72.                 data ^= 0b100;
  73.                 delay(LOOK_TICKS_PER_SEC / 10);
  74.         }
  75. }



  76. #ifdef LOOK_SCHEDULING_PRIORITY
  77. instantiate::task<task_led1_t, LOOK_STACK_SIZE> task_led1(0);
  78. instantiate::task<task_led2_t, LOOK_STACK_SIZE> task_led2(0);
  79. #else
  80. instantiate::task<task_led1_t, LOOK_STACK_SIZE> task_led1;
  81. //instantiate::task<task_led2_t, LOOK_STACK_SIZE> task_led2;
  82. //instantiate::task<task_led3_t, LOOK_STACK_SIZE> task_led3;
  83. #endif


led.h
  1. #include "look_config.h"
  2. #include <look.h>
  3. //#include <instantiate>

  4. // 任务类 task_led1_t 的定义
  5. class task_led1_t : public task_t {
  6. public:
  7.         __INLINE__ task_led1_t();        // 构造函数
  8.        
  9. protected:
  10.         void routine();                // 任务例程
  11. };

  12. // 任务类 task_led1_t 的构造函数
  13. __INLINE__ task_led1_t::task_led1_t()
  14. {
  15.         // TODO: 在此初始化 task_led1_t 的类成员
  16. }

  17. //extern instantiate::task<task_led1_t, LOOK_STACK_SIZE> task_led1;

  18. // 任务类 task_led2_t 的定义
  19. class task_led2_t : public task_t {
  20. public:
  21.         __INLINE__ task_led2_t();        // 构造函数
  22.        
  23. protected:
  24.         void routine();                // 任务例程
  25. };

  26. // 任务类 task_led2_t 的构造函数
  27. __INLINE__ task_led2_t::task_led2_t()
  28. {
  29.         // TODO: 在此初始化 task_led2_t 的类成员
  30. }


  31. extern instantiate::task<task_led1_t, LOOK_STACK_SIZE> task_led1;
  32. extern instantiate::task<task_led2_t, LOOK_STACK_SIZE> task_led2;



睡觉,有问题 的朋友尽管留言,大家一起琢磨。

这几天我都是一头雾水。
nixianmin 发表于 2011-9-26 23:10 | 显示全部楼层
哈哈,我也搞LOOK和C++一头雾水,大家一起写,一起交流
lixiaoxu2meng 发表于 2011-9-27 07:31 | 显示全部楼层
顶 收藏了 以后学习 呵呵
 楼主| gdmgb520 发表于 2011-9-27 08:19 | 显示全部楼层
昨天太晚了,没有详细写,只是贴了代码。

昨天实现的程序对我意义重大,这是迈出了很有意义的一步,譬如我可以创建一个TFT类,建立一些控制TFT的成员函数,然后创建一个任务和一个TFT对象,在任务中调用TFT类对象的成员函数实现TFT的显示、刷新等等。

建议像我一样还没有入门的盆友先看CPP类的定义,再看几个菜农大叔的初级LOOK例程,LED控制的就可以了。然后看大叔的LOOK_RTC例程。基本就可以看出点门道了。
john_lee 发表于 2011-9-27 22:39 | 显示全部楼层
一头雾水就发帖提问,或在qq群提问,给我留言也可以。
 楼主| gdmgb520 发表于 2011-9-27 23:10 | 显示全部楼层
5# john_lee

谢谢老师。
今天晚上实现了在lOOK里使用TFT,呵呵,把菜农大叔的lcd_demo搬到LOOK了。现在去发帖。呵呵
 楼主| gdmgb520 发表于 2011-9-28 13:23 | 显示全部楼层
在这贴学习的基础上实现了LOOK上TFT,详情请见

https://bbs.21ic.com/icview-272187-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:了解新东西才知道自己的不足。 www.elecbench.com

67

主题

452

帖子

1

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