感受面向对象编程的魅力(uCosII C++类封装篇)(2)
- UID
- 1029342
- 性别
- 男
|
感受面向对象编程的魅力(uCosII C++类封装篇)(2)
/*
// t2任务运行函数。
// 功能:无限等待信号量t2WaitEvent,当有信号时引发1秒蜂鸣器长鸣,其后恢
// 复t1任务,任务t2再次自身进入信号量t2WaitEvent的无限等待状态。
*/
void t2Run(void *p)
{
INT8U err = 0;
while(1)
{
t2WaitEvent.Pend(0,&err);
buzz.Clear();
CuCos::TimeDlyHMSM(0,0,1,0);
buzz.Set();
CuCos::TimeDlyHMSM(0,0,0,50);
t1.Resume();
}
p = p;
}
/*
// t3任务运行函数。
// 功能:简单的一秒间隔led1闪烁。
*/
void t3Run(void *p)
{
static CGPIO led1("P0.22",1);
while(1)
{
led1.Set();
CuCos::TimeDlyHMSM(0,0,1,0);
led1.Clear();
CuCos::TimeDlyHMSM(0,0,1,0);
}
p = p;
}
/*
// 为求原汁原味体现一个task对象的封装,下面设计一个子类实现一个特定任务
// 的处理,在此我们可以认为一个任务就是一个子系统,通过一个子类表现一个
// 特有任务的具体属性和行为,注意这种设计方法与传统的面向对象编程模式是
// 有区别的。子系统是一个有自主能力主体,例如在MyTask子系统中我们有两
// 个IO资源m_key1和m_led4分别对应着电路板上的按键Key1和发光二极管Led4,
// 通过检查key1按键状态控制led4的二值状态(亮/灭)。重载基类了Run函数为
// 求体现类的封装特性及表现一个任务的内聚能力,它是一个强制的运行接口,
// 当任务启动时便能自动地从重载的Run函数开始运行(具体调用的中转过程在
// 基类中已经实现)。
*/
class CMyTask : public CTask // 注意这里的派生关系!!!
{
public:
CMyTask(INT32U StkSize) : CTask(StkSize),m_key1("P0.16",0),m_led4("P0.25",1,0)
{
// 注意带参数的构造处理方法!!!
}
protected:
virtual void Run(void *p); // 需要重载Run()函数实现任务执行
private:
// 这是任务用到的一些资源定义,当然添加子系统的其他的属性和方法也是允许的
CGPIO m_key1;
CGPIO m_led4;
};
/*
// t4任务运行函数。
// 通过函数重载实现重写Run函数,该函数也就是任务运行函数。
// 功能:通过检查key1按键状态控制led4的二值状态(亮/灭)。
*/
void CMyTask::Run(void *p) // Run函数将会被uCosII系统自动运行!
{
while(1)
{
if(m_key1.GetStatus() == 0) // 判断按键是否按下
{
if(m_led4.GetStatus() == 0)
{
m_led4.Set();
}
else
{
m_led4.Clear();
}
while(m_key1.GetStatus() == 0)
{
CuCos::TimeDly(20); // 等待按键释放
}
}
else
{
CuCos::TimeDly(10);
}
}
p = p;
} |
|
|
|
|
|