打印

驱动框架以及面向对象的设计方法的示例

[复制链接]
8532|52
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
IceAge|  楼主 | 2008-1-9 23:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了所长的心得,正好这段有时间,我也把以前的 c++ 框架示例翻出来,讲解一下。

这个示例功能很简单,但我认为把 c++ 精华基本上都暴露出来了,同时也演示了一个驱动框架建立的过程。程序工作在文本的 dos 下,以前是用turbo c++, 现在使用 vc++ 重做了一下。

界面:2 个 label, 2 个button, 1 个edit.
功能:用 tab 切换焦点,回车作为button 按下,在label 上显示些东西。

程序没有注释,因为是打算讲解的。

主程序 (main.cpp) 如下:

#include "Application.h"
int main()
{
    Application app;
    app.Run();
    return 0;
}

很简单吧? 

相关帖子

沙发
IceAge|  楼主 | 2008-1-9 23:24 | 只看该作者

application 也很简单,这个基本框架同样也

适用于嵌入式 “裸奔“ 设计,让大家了解消息如何传递以及如何触发事件 

Application.h

#pragma once
#include "Container.h"
#include "label.h"
#include "button.h"
#include "EditBox.h"

class Application
{
    CContainer window;
    Label    label1;
    Label    label2;
    Button    button1;
    Button    button2;
    EditBox    edit1;

public:
    Application(void);
    void Run() { window.Run(); }

    void OnButton1_Pressed(void* sender, int para);
    void OnButton2_Pressed(void* sender, int para);
};


Application.cpp

#include "application.h"

Application::Application(void)
{
    label1.SetRect(10, 2, 20, 1);
    label2.SetRect(10, 3, 20, 1);
    button1.SetRect(40, 2, 10, 1);
    button2.SetRect(40, 6, 10, 1);
    edit1.SetRect(10, 6, 10, 1);
    button1.SetText("Button1");
    button2.SetText("Button2");

    window.AddControl(&label1);
    window.AddControl(&label2);
    window.AddControl(&button1);
    window.AddControl(&button2);
    window.AddControl(&edit1);

    button1.OnEnterKeyPressed.BindingHandler(this, Application::OnButton1_Pressed);
    button2.OnEnterKeyPressed.BindingHandler(this, Application::OnButton2_Pressed);
}


void Application::OnButton1_Pressed(void* sender, int para)
{
    label1.SetText("Test 1");
}

void Application::OnButton2_Pressed(void* sender, int para)
{
    label1.SetText("Test 2");
}


秘密在 window.Run() 里。下面准备详细介绍,同时讲解 c++ 一些主要特性,以及object-oriented design 过程。

使用特权

评论回复
板凳
老狼| | 2008-1-9 23:39 | 只看该作者

大半夜的,咱来听听课!

使用特权

评论回复
地板
yewuyi| | 2008-1-10 08:31 | 只看该作者

占坑……

使用特权

评论回复
5
machunshui| | 2008-1-10 09:52 | 只看该作者

用C++没有必要

C++看着简单,学着简单。
但是用起来不简单!

用起来还很不简单!
不是说写个类,生成个对象,做点封装,用C++编译器编译的程序,就是C++程序。

C++基本是为了大型程序而生的,单片机里这么点大程序用C++意义不大.
既提高不了程序的健壮性,又浪费空间,降低速度。

使用特权

评论回复
6
农民讲习所| | 2008-1-10 10:12 | 只看该作者

再温习一遍

使用特权

评论回复
7
koon| | 2008-1-10 10:58 | 只看该作者

受教

使用特权

评论回复
8
IceAge|  楼主 | 2008-1-10 21:41 | 只看该作者

关于 c++ 应用的问题

一般小型的 mcu 的系统使用 c++ 确实没必要,但是掌c++ 是必要的,且不说你不可能在 mcu 的小井里呆上几年后仍然同后进比拚小型 c 程序,就是 c++ 的设计思想对 c 和 汇编程序的冲击也是令人吃惊的。一个精通 c++ 的程序员所做的assembly /c 程序与不通 c++ 的截然不同。

一技精而百技通。掌握了 c++, 可以说,其他任何语言都不在话下了。我以前曾经花了两三个小时把 java 书看了一遍,又花了两三个小时帮人做了一个 java severlet 的shopping cart 程序。 


上面的 main 和 application, 基本上变成了script 描述性,即说明要做什么 (what) ,而没有怎么做(how), 这是我所推崇的 金字塔 组织结构。再看一个异步电机控制的汇编程序:

Startup:
         PWM_Init(PWMSYNC_ISR);
        Buffer_Init(DATA_BUFFER, BUFFER_SIZE);
        Controller_Init(Speed_Ref, Flux_Ref);
        Speed_Estimator_Init;
        GetData_Init;
        GetTachoSpeed_Init;
 MAIN:                           
         nop;
         nop;
    jump MAIN;
    
RTS;
{********************************************************************************
* PWM Interrupt Service Routine                                                 *
********************************************************************************}
PWMSYNC_ISR:
    Calc_Iabc_Offsets;
    Get_Iabc;
    Get_Vdc; 
    ABC_DQ(Ia, Ids);
    Speed_Estimator;
    Speed_Controller;
    Flux_Controller;
    Ide_Controller;
    Iqe_Controller;
    DQe_DQs_SinCos(Vde_ref, Vds_ref, SinA);    
    DQ_ABC(Vds_ref, Va_ref);
    PWM_Update_From_ABC(Va_ref, Vb_ref, Vc_ref);
    Get_TachoSpeed;
    Buffer_Record(Wr_Tacho, Wr);
    rti;

能看出是用汇编写的么? 

使用特权

评论回复
9
ra_rabbit| | 2008-1-10 21:44 | 只看该作者

也学习以下

使用特权

评论回复
10
农民讲习所| | 2008-1-10 21:47 | 只看该作者

俺一直欣赏俺一个朋友说的一句话:

学会C++也学会了做人。

使用特权

评论回复
11
sz_kd| | 2008-1-10 21:49 | 只看该作者

晕,学会C++也学会了做人????????

使用特权

评论回复
12
lpf336| | 2008-1-10 21:51 | 只看该作者

占座

使用特权

评论回复
13
IceAge|  楼主 | 2008-1-10 21:52 | 只看该作者

不过话又说回来,在 mcu 的论坛里讲 c++

可能是有些浪费了,我还是贴出程序让大家看,然后再讲。

好吧,我承认,我是看到人气不足泄气了。


相关链接:http://www.adrive.com/public/38b9c9b56448fc59d40431ee9b34660deda3250cef1c0ed3f979670b2087134d.html

使用特权

评论回复
14
hq_y| | 2008-1-10 22:06 | 只看该作者

顶一下~~~~~~~~~~

使用特权

评论回复
15
IceAge|  楼主 | 2008-1-10 22:12 | 只看该作者

呵呵,c++ 程序员眼里的人与 c 的人不同

普通的 c:
void Walk(struct Human* human) 
{
     if (human->handicapped)
         Handicapped_Walk(human);
     else
         HealthyHuman_Walk(human);  
}  


c++: 
class Human { virtual void Walk(); } 
class HandicappedHuman : public Human { virtual void Walk(); } 

Human* h = new Human();
h->Walk();
h = new HandicappedHuman();
h->Walk();

使用特权

评论回复
16
平常人| | 2008-1-10 22:13 | 只看该作者

哈哈,学会C++也学会了做人,要把自己包装好

该藏的藏(private),该露的露(public),当然有些需要半遮半掩(protected)。

使用特权

评论回复
17
IceAge|  楼主 | 2008-1-10 22:26 | 只看该作者

在做人(create)方面

C++ 的四个主要特性:抽象,封装,继承,多态 比 c 强出很多。

  

使用特权

评论回复
18
HWM| | 2008-1-10 22:30 | 只看该作者

OOP思想当然强多了。

使用特权

评论回复
19
machunshui| | 2008-1-10 23:28 | 只看该作者

OOp的思想加c++或者java之类的手段

OOp的思想加c++或者java之类的手段,是写C++程序的要素.

但程序小了,逻辑关系简单了,体现不出c++的优势.

抽象,封装,继承,多态四个方面,C++而言最重要的是多态.

C++语法里面还是很多花花肠子的,看着简单,实际不简单.

运算符重载,纯虚函数,模板等等概念上很简单,用起来却不简单.

上位机软件用C++除了c++本身的特点,
最大的一个好处是可以用C++的STL模板库,确实给编程带来了很大的方便.

但mcu程序,逻辑关系简单了,用C++是用牛刀杀**,费力不讨好.

使用特权

评论回复
20
IceAge|  楼主 | 2008-1-11 00:19 | 只看该作者

不要把 mcu 就局限在小小的8bit 8051, pic 上

如今的嵌入式 mpu 功能越来越强大,资源越来越丰富,相对应的程序越来越复杂,用 c 应付越来越吃力。这也就是 c++,甚至java 在 embedded 越来越流行的原因,不能顺应潮流的人终究会被淘汰掉。

关于多态,说 virtual 是c++ 的核心并不过分。我以前的一个帖子说过,virtual 的实质是函数指针,在 c 下可以用 callback 来实现 generic 行为/ 动作/接口,以把 特殊的或是需要定制的代码 从 通用代码中 剥离出去。


 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

325

帖子

4

粉丝