第2次课 MeeGo开发流程与开发基础.ppt_第1页
第2次课 MeeGo开发流程与开发基础.ppt_第2页
第2次课 MeeGo开发流程与开发基础.ppt_第3页
第2次课 MeeGo开发流程与开发基础.ppt_第4页
第2次课 MeeGo开发流程与开发基础.ppt_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2次课 MeeGo开发流程与开发基础,内容,嵌入式应用开发流程 嵌入式应用开发环境 嵌入式应用开发流程 嵌入式开发工具链 MeeGo的开发工具链 宿主机与仿真机环境配置 QT知识 Qt介绍 Qt安装 基于QT的Hello World示例程序 Qt中主要类的介绍 Qt的信号槽机制 Qt中主要控件介绍,一、嵌入式应用开发流程,嵌入式应用开发环境 交叉开发 编程语言 嵌入式应用开发流程 嵌入式开发工具链,交叉开发,通用计算机的软件开发一般都是以本地(Native)编译或开发的方式进行,嵌入式系统一般不支持本地环境开发,其软件开发通常采用交叉(Cross)开发的方式。 交叉开发环境建立在宿主机(Ho

2、st)上,宿主机又称开发机,一般是一台通用计算机,如PC。 对应嵌入式系统称为目标(Target)机。目标机指各式各样的嵌入式设备,例如手机、掌上电脑等;或者是嵌入式厂商提供的一套专用于开发的评估板(evaluation board),所以又称开发板;甚至是基于软件的模拟器。 开发时使用宿主机上的交叉编译、汇编和链接工具形成可在目标机上执行的二进制代码,然后把可执行文件下载到目标机上运行。嵌入式系统开发过程中不仅编译(包括链接等步骤)采用交叉的方式,调试也常采用交叉的方式。,交叉开发,采用交叉开发的原因 主要原因在于目标机上往往无法进行有效的本地编译。 目标机硬件本身在开发过程中还不能使用或还

3、不够稳定; 目标机平台上缺乏完整的本地编译工具、环境; 目标机系统本身性能不够导致编译太慢。 嵌入式系统的软件编译,与Windows开发不一样,不仅要编译应用程序,还要编译相应的依赖库、操作系统内核等。所以一次完整的编译非常费时。 而从硬件角度,决定编译速度的主要因素是CPU速度、内存容量和文件系统I/O速度。而这些方面在嵌入式系统上往往都要比PC差很多。这样会造成目标机系统上进行本地编译效率低下。综合以上多方面因素的考虑,嵌入式系统开发一般都采用交叉开发方式,如交叉编译(包括交叉链接)、交叉调试等。,交叉开发,宿主机和目标机的连接 一般通过串口、并口、USB或以太网等连接线进行连接。 交叉开

4、发过程 在宿主机上会安装用于嵌入式软件开发的一系列工具集,例如代码编辑工具、编译器、连接器、调试工具、软件配置管理工具等。开发者在宿主机一端完成代码编写和调试。,交叉开发,宿主机和目标机的差异 体系结构的不同。宿主机和目标机通常是异构的。宿主机一般采用x86体系结构,但是目标机的体系结构则可能非x86的,如是ARM、MIPS、PowerPC等各式各样。 处理能力不同。通常宿主机的处理速度、存储容量等会远远大于目标机。 运行的操作系统不同。宿主机一般运行通用操作系统,而目标机通常运行各种嵌入式操作系统。 输入输出方式不同。相对宿主机,目标机的输入输出功能可能比较单一。,编程语言,本书采用的主要语

5、言 由于C/C+拥有便于底层编程等诸多优点,目前C/C+为大多数嵌入式系统开发的首选语言。考虑到现实的发展状况,我们在后续章节的应用开发中首选语言也是C/C+。,嵌入式应用开发流程,典型的开发流程示意图,编码阶段,构建阶段,部署阶段,调优阶段,嵌入式应用开发流程,开发流程主要分为如下几个阶段: 1编码阶段 编码阶段是软件开发的开始,其任务是编写软件的源代码代码,使用的工具是各种编辑器。 2构建阶段 构建阶段的任务是把代码转化成可以在嵌入式硬件上可执行程序的过程。此阶段包括包括编译,链接、定址和打包等步骤 。 3部署阶段 部署是把可执行的运行时映像或可执行文件部署到嵌入式设备上,让嵌入式设备在系

6、统上电后可以启动并加载开发者编写的代码。 4调优阶段(调试、优化阶段) 此阶段主要是对软件进行调试和性能优化。 调试:即使再有经验的软件工程师,要编写完全没有错误的程序也是不可能的。嵌入式软件调试的效率都比较低,因为即使改动一行代码,都可能需要把编译、链接、重定位、烧写、下载等步骤完整走一遍,这也是调优阶段最显著的特点。快速地定位到问题可以节省大量的时间。,嵌入式应用开发流程,4调优阶段(调试、优化阶段) 优化 对于软件产品最低目标是能正确的运行,还需要优化,优化目标主要包括是速度性能、功耗性能、空间性能等方面,达到运行更快,更节能,占用空间更小等目的。 借助工具分析程序代码,精确分析性能瓶颈

7、,据此引导和建议开发者进行改进,此过程常称为代码剖析(code profiling),对应的工具常常称为剖析器(profiler)或性能分析器(performance analyzer)、 Intel的VTune 。,典型的开发工具链,工具链的概念 在嵌入式软件开发的各个阶段都相应的工具帮助用户来完成其工作,这些工具形成与开发流程对应的工具链(Toolchain),又称工具集。,嵌入式软件开发典型工具,典型的开发工具链,Moblin平台下的工具集 在Linux、Moblin平台下最有名的工具集是GNU和Intel两家。由于GNU工具集的跨平台、开放性、使用广、与其他工具兼容等特点,使得其成为嵌

8、入式应用开发的首选工具. GNU工具链 GNU的开发工具都是免费的,遵循GPL协议,任何人都可以从网上获取。同样GNU也为嵌入式系统、x86系统下的软件开发提供了完整的工具链。这些工具包含编译器、汇编器、链接器、调试工具等。这些工具它们可以以命令行形式单独运行,也可以集成到Eclipse等集成开发环境中。,典型的开发工具链,GNU工具链生成目标文件的几种途径 方法一:使用gcc命令分别编译、链接各源代码文件,生成可执行的目标文件。 方法二:用户编写makefile等配置文件,然后用make一步生成可执行的目标文件。 方法三:使用系统构建自动工具autotools制作makefile等配置文件,

9、然后用make一步生成可执行的目标文件。,二、MeeGo的开发工具链,交叉开发: 宿主机:生成目标可执行文件和调试的机器,一般是一台PC 目标机:MeeGo运行平台,手机、上网本或者仿真器(qemu),MeeGo交叉开发的实际环境,MeeGo交叉开发的仿真环境,仿真,仿真的情景,仿真(1),仿真(2),二、MeeGo的开发工具链,几个术语,1、QEMU MeeGo的虚拟机(emulator)仿真环境之一或者叫仿真器。 2、Xephyr ( Xephyr是一种运行Linux下的MeeGo仿真器。 3、MADDE MADDE (MeeGo Application Develop and Debug

10、 Environment (background) is a tool that assists in the download and installation of the Target. (MeeGo应用开发与调试环境)是一个帮助下载与安装目标机的工具。 4、mad-admin mad-admin is the MADDE command-line tool. You can install multiple Targets and switch easily between them in Qt Creator (described later). 我的理解:mad-admin是一个安

11、装MADDE和查看其安装信息的命令行工具。 5、xhost + access control disabled, clients can connect from any host:开放全部用户和IP地址用户远程使用X server的权限:,二、MeeGo的开发工具链,3、宿主机Qt开发工具链: $ ls -l /opt/meego/meego-sdk-qt/bin,1、Installing the MeeGo SDK安装对应CPU架构的编译工具链(1) $ sudo apt-get install meego-sdk,2、Install MeeGo Target安装对应CPU架构的编译工具链

12、(2),$ sudo mad-admin create -f meego-netbook-ia32-1.1 用来下载下载meego-core-ia32-madde-sysroot-1.1-fs.tar.bz2,Create a MeeGo target using MADDE,三、宿主机与仿真机环境配置,2、配置QT Creator,1、打开上网本仿真器(目标机) $ mad remote -r meego-netbook-ia32-qemu-1.1.20101031.2037-sda-runtime poweron 登录到目标机里面去: $ ssh meego p 6666

13、 进入目标机(不管是仿真器还是实际机都要执行如下步骤),运行如下命令: $ xhost +,3、配置工程的 build 环境,4、 编译生成 MeeGo 目标文件,在QT Creator环境里面打开一个.pro工程文件,5、选择目标机 Run 环境,6、 部署运行与停止运行,四、QT介绍,Qt介绍 Qt安装 基于QT的Hello World示例程序 Qt中主要类的介绍 Qt的信号槽机制 Qt中主要控件介绍,21,Qt介绍,Qt是跨平台的应用程序和UI框架,包括 跨平台类库 集成开发环境 跨平台IDE 一次性开发可在不同桌面和嵌入式操作系统部署,22,Qt特征一,面向对象 Qt具有模块设计和注重

14、软件构件或元素的可重用性的特点 构件支持 Qt提供信号signal和槽slot的概念,支持对象之间在彼此不知道对方的情况下合作,使得Qt适合构件编程 友好的联机帮助 Qt提供了大量的联机参考文件,23,Qt特征二,便利性 Qt是跨平台的GUI工具包,对编程者隐藏了处理不同窗口系统时的潜在问题 国际化 Qt为本地化应用提供了完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言,24,Qt特征三,丰富的API函数 Qt为开发者提供了大量的函数 可用户化外观 Qt支持主题,基于Qt的应用程序能够在Windows外观,Motif外观以及其他一些用户外观主题之间切换 完整的组件工具 Qt编程

15、的基本模块叫做组件,Qt含有用来创建专业外观用户界面需要的所有组建,25,Qt介绍,Who uses Qt? Write code once to target multiple platforms Create amazing user experience Do more with less and faster Blend web and native code in a single application,26,Qt SDK,Qt SDK,27,Qt中主要的类介绍,QObject QObject类是所有能够处理signal,slot和事件的Qt对象的基类,原型如下: QObject:

16、QObject(Qobject *parent=0,const char *name=0) 在上面的函数中,如果parent为0则构造一个无父的对象;如果对象是一个组件,则它会成为顶层窗口。,28,Qt中主要的类介绍,2. QApplication QApplication类负责GUI应用程序的控制流和主要的设置,它包括主事件循环体,负责处理和调度所有来自窗口系统和其他资源的事件 处理应用程序的开始,结束以及会话管理 QApplication是QObject类的子类,29,Qt中主要的类介绍,3. Qwidget QWidget是所有用户接口对象的基类,继承了 QObject类的属性 组件是用

17、户界面的单元组成部分,接收鼠标, 键盘和从其它窗口系统来的事件 QWidget类有很多成员函数,但一般不直接使用,而通过子类继承来使用其函数功能 QWidget 是QObject类的子类,30,信号和槽,信号和槽机制是Qt的一个主要特征,是Qt与其它工具包最不相同的部分。 在图形用户界面编程中,经常会出现窗口的一个部件发生的变化会被通知给另一个部件。 Qt采用信号和槽实现对象部件之间的通信,31,信号和槽的声明一,在Qt程序设计中,包含signals和slot的类都要加上Q_OBJECT的定义。下面给出一个在类中定义signal和slot的例子 class Student:public Qob

18、ject Q_OBJECT public: Student() myMark = 0; int getMark() const return myMark; public slots: void setMark(int newMark); signals: void markChanged(int newMark); private: int myMark; ,32,信号和槽的声明二,Signal的发出一般在事件的处理函数中,利用emit发出signal,下面的例子中在事件处理结束后发出signal void Student:setMark(int newMark) if(newMark !=

19、 myMark) myMark = newMark; emit markChanged(myMark); ,33,信号和槽的连接一,在signal和slot声明以后,需要使用connect()函数将它们连接起来。Connect()函数属于QObject类的成员函数,能够连接signal和slot,也能够连signal和signal。函数原型如下 bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *slot) 其中第一个和第三个参数指出signal和slot属于的

20、对象或组件,34,信号和槽的连接二,使用connect()函数进行连接的时候,还需要用到SIGNAL()和SLOT()两个宏,使用方法如下: QLabel *label = new QLabel; QScrollBar *scroll = new QScrollBar; QObject:connect(scroll, SIGNAL(valueChanged(int), label, SLOT(setNum(int);,35,信号和槽的连接方式一,同一个信号连接到多个槽 connect(slider, SIGNAL(valueChanged(int), spinBox, SLOT(setValu

21、e(int); connect(slider, SIGNAL(valueChanged(int), this, SLOT(updateStatusBarIndicator (int); 多个信号连接到同一个槽 Connect(lcd, SIGNAL(overflow(), this, SLOT(handleMathError(); Connect(calculator, SIGNAL(divisionByZero(), this, SLOT(handleMathError();,36,信号和槽的连接方式二,一个信号连接到另外一个信号 connect(lineEdit, SIGNAL(textC

22、hanged(const Qstring 取消一个连接不是很常用,因为Qt会在一个对象被删除后自动取消这个对象所包含的所有连接,37,Qt安装,Qt 下载 ,38,Qt安装,下载安装文件Qt_SDK_Lin32_offline_v1_1_beta_en.run,在linux上安装步骤如下: 1.添加执行权限 chmod u+x Qt_SDK_Lin32_offline_v1_1_beta_en.run 2.运行安装文件 ./ Qt_SDK_Lin32_offline_v1_1_beta_en.run 3. 添加环境变量 将Qt安装目录下的bin目录加入到环境变量PATH中,39,Hello W

23、orld程序实例,创建目录 mkdir /examples/hello 创建源文件 touch hello.cpp 编写源文件 vi hello.cpp,40,Hello World程序实例,切换到hello目录 cd /examples/hello 创建平台独立的工程文件project file qmake project 创建平台独立的Makefile文件 qmake 编译工程 make 运行程序 ./hello,41,Qt对话框,对话框是一种特殊的窗口,一般用来提供反馈信息或从用户获取输入。 给用户提供了同应用程序进行交互的方式,42,Qt对话框,模态对话框 最普遍的

24、对话框。在未消失前用户不能够与同一个应用程序的其他窗口进行交互,直到该对话框关闭。 非模态对话框 当对话框打开的同时,用户还可与同一应用程序的其他窗口进行交互。,43,Qt对话框,Qt对话框的类层次结构图,44,几种Qt内置对话框介绍,颜色对话框QColorDialog,允许用户选择设置颜色 错误对话框QErrorDialog,显示错误信息 文件对话框QFileDialog,允许用户选择一个或多个文件或目录 字体对话框QFontDialog,允许用户选择、设置字体 输入对话框QInputDialog,允许用户输入文本信息 页设置对话框QPageSetupDialog,可配置与打印相关的页面设置

25、 进度对话框QProgressDialog,指示出一项操作的工作进度,而且提示用户该操作是否停滞 打印对话框QPrintDialog,配置打印机相关选项,45,几种Qt内置对话框介绍,颜色对话框QColorDialog,允许用户选择设置颜色 错误对话框QErrorDialog,显示错误信息 文件对话框QFileDialog,允许用户选择一个或多个文件或目录 字体对话框QFontDialog,允许用户选择、设置字体 输入对话框QInputDialog,允许用户输入文本信息 页设置对话框QPageSetupDialog,可配置与打印相关的页面设置 进度对话框QProgressDialog,指示出一

26、项操作的工作进度,而且提示用户该操作是否停滞 打印对话框QPrintDialog,配置打印机相关选项,46,查找对话框示例,通过一个简单的查找对话框的实现了解Qt中对话框的创建过程,布局管理,信号和槽机制以及一些简单控件的使用,47,查找对话框示例,头文件finddialog.h 1 #ifndef FINDDIALOG_H 2 #define FINDDIALOG_H 3 #include 4 class QCheckBox; 5 class QLabel; 6 class QLineEdit; 7 class QPushButton; 8 class FindDialog : public

27、 QDialog 9 10 Q_OBJECT 11 public: 12 FindDialog(QWidget *parent = 0);,48,查找对话框示例,13 signals: 14 void findNext(const QString 27 #endif,49,查找对话框示例,12行FindDialog的构造函数是典型的Qt窗口部件类的定义方式。Parent参数指定了父窗口部件。该参数默认值是一个空指针,意味着该对话框没有父对象。 13行开始的signal部分声明了当用户单击Find按钮时对话框发出的两个信号。,50,查找对话框示例,1 #include 2 #include fi

28、nddialog.h 3 FindDialog:FindDialog(QWidget *parent) 4 : QDialog(parent) 5 6 label = new QLabel(tr(Find ,51,查找对话框示例,15 connect(lineEdit, SIGNAL(textChanged(const QString ,52,查找对话框示例,通过connect函数实现了信号和槽的连接 只要行编辑器中的文本发生变化,就会调用私有槽enableFindButton 当用户单击Find按钮时,会调用findClicked私有槽 当用户单击Close时,对话框关闭,53,查找对话框示

29、例,21 QHBoxLayout *topLeftLayout = new QHBoxLayout; 22 topLeftLayout-addWidget(label); 23 topLeftLayout-addWidget(lineEdit); 24 QVBoxLayout *leftLayout = new QVBoxLayout; 25 leftLayout-addLayout(topLeftLayout); 26 leftLayout-addWidget(caseCheckBox); 27 leftLayout-addWidget(backwardCheckBox); 28 QVBox

30、Layout *rightLayout = new QVBoxLayout; 29 rightLayout-addWidget(findButton); 30 rightLayout-addWidget(closeButton); 31 rightLayout-addStretch(); 32 QHBoxLayout *mainLayout = new QHBoxLayout; 33 mainLayout-addLayout(leftLayout); 34 mainLayout-addLayout(rightLayout); 35 setLayout(mainLayout); 36 setWi

31、ndowTitle(tr(Find); 37 setFixedHeight(sizeHint().height(); 38 ,54,查找对话框示例,Qt提供了布局管理器布局子窗口部件 通过QHBoxLayout,QVBoxLayout和QGridLayout这三个布局的不同嵌套组合,就可以构建出相当复杂的对话框。,55,查找对话框示例,39 void FindDialog:findClicked() 40 41 QString text = lineEdit-text(); 42 Qt:CaseSensitivity cs = 43 caseCheckBox-isChecked() ? Qt:

32、CaseSensitive :Qt:CaseInsensitive; 44 if (backwardCheckBox-isChecked() 45 emit findPrevious(text, cs); 46 else 47 emit findNext(text, cs); 48 49 50 void FindDialog:enableFindButton(const QString 53 ,56,查找对话框示例,以上两个函数是对话框中用到的槽 当用户单击Find按钮时,就会调用findClicked槽。而该槽会发射findPrevious或findNext信号,这取决于Search bac

33、kward选项的取值 只要用户改变了行编辑器中的文本,就会调用enableFindButton槽。如果在行编辑器中有文本,该槽就会启用Find按钮,否则它会禁用Find按钮,57,查找对话框示例,创建main.cpp文件测试FindDialog窗口部件 1 #include 2 #include finddialog.h 3 int main(int argc, char *argv) 4 5 QApplication app(argc, argv); 6 FindDialog *dialog = new FindDialog; 7 dialog-show(); 8 return app.ex

34、ec(); 9 ,58,Qt主窗口介绍,应用程序的主窗口提供了用于构建应用程序用户界面的框架 主窗口一般包括菜单栏,工具栏,状态栏,中央窗口部件等子控件 在Qt中,通过子类化QMainWindow可以创建一个应用程序的主窗口,59,Qt主窗口介绍,60,Qt主窗口介绍,下面通过一个简单的代码分析了解Qt中主窗口的创建过程 实现主窗口的源代码分别放在mainwindow.h和mainwindow.cpp中,61,Qt主窗口介绍,Mainwindow.h class MainWindow : public QMainWindow Q_OBJECT public: MainWindow(QWidget *parent = 0); MainWindow(); private slots: void newFile(); void openFile(); void cut(); void copy(); private: void createActions(); void createMenus(); void createStatusBar(); void createToolsBar();,62,Qt主窗口介绍,private: QMenu *fileMenu; QM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论