本次的笔记整理的内容包括“C++ boost库”、“ARM11应用开发”、“DirectShow”、“黑莓应用比赛”、“MFC”、“51”、“Linux”、“数值算法”、“软件安装及库配置”相关内容。回头整理这些知识点对可能理清线路框架和思维方向有用。
在windows下使用boost库需要在开发环境中设置boost库的路径。某些库(如thread)需要使用开发环境的命令行编译后才能使用。
在linux下使用boost库时,在无集成开发环境的时候(字符界面下或者在Desktop gedit下编程)只需要在编译必须编译的boost库后将得到boost库何头文件拷贝到指定的目录下即可以使用boost库。
将所需实现的功能明确后,可以定位到boost库的某个组件上,然后在程序中调用这个组件来帮助实现目标功能。在使用boost库中的组件时一般遵循的流程是:
timer在boost库中应该算是最简单的组件了。但是对timer组件的一个使用就已经能够代表boost库的入门了。可以将timer库作为索引去认识boost库。看timer组件的内部实现形式,可能会对为什么使用库及使用库的步骤有一些概念。
了解多线程需要从thread的执行本质开始到多线程之间的同步(通信)。其实,对应封装库来说,对多线程之间的同步只是给用户提供了一个同步的逻辑而已(条件变量+互斥量机制)。个人觉得在能够使用好这些封装库后再去封装自己的库,不要一开始就对自己的要求那么高(一开始就要知道条件变量+互斥量的封装的内部原理)。除非眼前的项目非要逼你去了解不可。对于thread这样的库,总结它的封装机制越彻底越好,将它看透了兴许自己就会实现更好的了。
在boost库中,所有跟通信相关的组件都在asio下,asio从此也因为其下的所有通信组件而开始闻名。串口通信类serial_port、网络通信ip及ip下的子类。但开发为asio定制了一必须使用io_service类的机制。根据实际的通信流程也差不多规定了使用asio下各子组件的步骤。不管谁封装一个这样的组件,相比都有类似的机制和使用步骤。
根据bind和function的功能就可以看出,二者的设计是为了解决线程函数只能是一个参数等的限制。用得最多的目的是为了封装一些比较复杂的对象。我想,类似二者的C++组件很多。
ARM11开发板可以分为可上操作系统和无操作系统两种情况。
开发板在无操作系统的情况下,需要对ARM芯片的结构了解清楚(最差要了解编程所对应ARM模块的寄存器),这些结构是你编程达目标功能的指引,此时所有的编程必须基于这些结构的逻辑规定。而且还需要知道外围电路的各种芯片的结构。编程所要做的是查看数据手册(datasheet),根据目标功能,去确定每一个模块(芯片、寄存器等)的逻辑规定,然后编程实现。
对于上了操作系统的开发板,此时的开发板具有操作系统的一切特性。此时对开发板写程序,和windows程序相比就多一个下载的过程(可能程序大小有所被限制),操作系统已经帮你屏蔽了所有的硬件特性。而且如果此时编写跟硬件相关的驱动程序,体验效果会更加的明显。
此次通过SD卡将android系统移植到ARM11之上。主要的操作就是修改配置环境。但是我知道真正的做一次系统移植的过程是很漫长的,而且涉及内核相关方面。我想,如果真要是通过后提的这种方式,我也能够做到。开发平台的搭建也是初学者的开始学习的一个点。
在Java常见的一个开发环境eclipse中操作过一次之后,见识了一种新的图形界面布局方式XML文件布局。需要在此文件中编写的代码语法使人觉得简单易懂。而且程序的目录结构是比较完善的,出了XML等布局文件之外还有定义各种全局变量的文件及存放外部资源的文件。至于主程序文件的程序架构相信对于面向对象的的程序设计语言都会涉及,有程序架构,编译器或者系统就会为你做很多已经被封装或者完成的事情,基本都有自动调用的机制。
DirectShow开发工具及凭证已被加入到微软公司SDK平台的一部份。如果不使用DirectShow下的Filter则只需要安装windows sdk,然后在开发环境中为项目设置好库的目录就可以使用了。如果要继承DirectShow的Filter则需要进一步编译(Build)BaseClasses以生产对应的库文件。
之前对DirectShow的应用主要是了解到了关于微软DirectShow中的一些术语,并促进我对C++类和接口的认识,加强调用了调用意识。但对此库的更深认识如去了解DirectShow的接口是如何获取图像的或者对数据流的处理。若是以后再次遇到,应该在实现程序功能的同时明白这些原理。
[ DirectShow简介]。
COM(Component Object Model,组件对象模型)。COM作为模型本身只是一种规范而不是实现。
在COM规范下,用C++来实现各种各样功能专一的部分可以被称为COM组件,COM组件就是一个C++类。一个简单的COM组件从一个纯虚类那里继承而来。在客户端程序中,可调用已经实现的函数来创建COM组件。
Filter、Pin是COM组件。
既然Pin是C++类,那么可以将它的功能编写为输入Pin(接收数据的Pin),输出Pin。
Filter由一个或者多个Pin组成,Filter之间通过Pin相互连接[如果两个Filter要连接(连接目的是为了传输数据)就使用内部子类(Pin)提供的函数方法来连接],构成一条顺序的链路。没有输入Pin的被看做Source Filters;又有输入Pin既有输出Pin的被叫做Transform Filter;仅有输入Pin的被称为Rendering Filters。
Filter Graph是Filter的“容器”,由多个Filters的连接(目的是传输数据)而成Filter Graph。在Filter Graph中,Filter之间传输的数据是以Sample(一个封装了一定大小数据内存的COM组件)的形式来传输的。
不可否认字符界面的程序给人一种神秘高级的感觉(Linux的启功过程)。同时对于初学计算机语言的同学来说,为掌握计算机语言的语法、特性、功能及程序稳定性的方面,字符界面编程对他们来说是一种很好的选择。同时,在字符界面下,还可以直接使用编译工具使用命令参数来编译源文件,会在无形中加深初学者对命令行(用到的地方多)及编译过程的认识。而且一开始就进入图形界面对于初学者来说很有难度。
字符界面虽然具有如此的优势。但是在程序用户界面这一块却显得不太乐观。在字符界面下的工具软件的使用者必须具备一定的命令行素养才能使用此工具软件,毕竟字符界面的Linux不像window那样好上手使用。再者在如今的时代,面向用户的界面可算得是五彩缤纷,不是彩虹胜似彩虹。一般来说,如果用C来进行图形界面的开发,那么“解析图片”、“载入图片”、“绘制图片”的过程显然是不可少,完成这些流程的并非就是亲手用C敲的代码,已经有不拘于程序语言的库如OpenGL图形库来替你完成图形界面的载入及显示。
从字符界面到图形界面可以算得上是学习计算机语言的第二次革命。第一次革命且最重要、本质的一次革命是在字符界面下编写一个很成功的应用。当有一天看计算机语言代码(函数、接口)觉得很清晰时,后悔当初没有狠下心花更多的时间和耐心去真正看懂一个函数。因为看懂一次后就懂了。或许,这本就是一个渐变的过程。
在字符界面之下也有像“初始化”的编程步骤(如Linux ncurses的使用)。但带来的效果却没有在图形界面之上的来得明显。对于不同的系统,不同的应用,初始化的目的就不尽相同了。像“开启库”、“系统环境”、“加载驱动”等初始化操作都比较常见。很可能有一天,自己就开始亲自编写系统初始化的代码了。对于初学者,最大的难度是去明白与物理系统所对应的概念。如有一个初始化函数的功能是“创建上下文(context)”的,可能应用都做完了,都还没有意识到这个context到底是指什么。
顶点数组法是我在图形界面之上第一次接触的绘图方法。它必需的资源是“源图片句柄”;必需需要的数据是“顶点数组”及“纹理数组”。有了资源和数据之后,OpenGl的绘图函数将提供库函数给你使用,编写代码者需要做的就是掌握“绘图步骤”并且理解“函数功能含义及参数变换带来的效果”。当然,对于第一次涉入的同学难度是必然有的。
MFC( Microsoft Foundation Class,微软基础类)是微软公司开发的一个类库。以C++类的形式封装了Windows的API。可对MFC库类的任意类进行扩展(继承)使用。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
为了让开发人员很好的使用MFC库,在实现MFC时还包含了一个应用程序框架。以减少应用程序开发人员的工作量。但,也就是应用程序架构提高了初学者入门的门槛。在最初进入MFC应用程序的时候,初学者会陷入MFC的内部机制及程序架构之间,当然,对于长远来说,这些陷入都是值得的。
如果开发者一味的深入MFC应用程序的内部机制中,那么可能在很长一段时间里都不会有应用出生。如果开发者在最开始就明白了MFC应用程序的“外部机制(在哪里添加代码)”,一些应用随着开发者的努力就会诞生。但是由此可能会忽略MFC的一些内部优秀的机制。从而,这就需要权衡。个人觉得,是要先浅后深还是深入浅出看需要吧。
对于51单片机。了解其每个模块的内部结构(至少知道怎么编程实现功能)是必须的。需要用高级思维使用中断编程,这是区别与操作系统的编程机制。对于芯片的外围电路,输出决定输入,而输入的逻辑由上一层的输出控制,环环相扣。编程 +了解结构就可以形成高手。
对于51这方面,还要退一步讲。就是纯粹的根据输入输出设计中间的硬件环节。这部分就包含了许多需要掌握的东西,数学是首先需要的,然后是像数、模二电等许多的专业知识,还必须掌握想AD一样的计算机辅助软件。有这些基础应该是教为传统的方式去达到设计硬件环节的目的。
最开始接触linux是在通过学校局域网用putty登陆到Linux服务器中,此服务器是IBM制造,好大的一个硬件块块。后来又断网的限制就在笔记本上安装了Vmware,然后再在虚拟机内安装了Linux。虚拟的世界就是追求完美,虚拟机内的Linux照样可以支持putty的连接。在linux字符界面下所做的事情包含了我能列举出来的在字符界面下编程的所有好处。
目前未深入的是驱动、内核相关、进程编程模块。
在Linux字符界面下编程难免会使用Linux的命令。尤其是脚本程序的编写还会涉及许多在平时不常用的命令,还会涉及“正则表达式”、“文件字段”操作等知识。我那个时候只是为了应用,现在虽能快速拾起但空口已不能说出个什么所以然来。故而若以后继续接触这一块的时候,需要补进。
简单的欧拉法、梯形法、龙格库塔法解微分方程不仅让我明白了一把高数中微积分的神秒。还联系了C语言。不过这中间至少要怎么升一下级。
软件的安装到后来都不会难。一般都会伴有指导步骤,只是有的时候有的软件子组件不需要安装。关于库的配置,最简单的是带在开发环境里的,在程序中直接包含相关头文件就可使用;再简单的是需要单独下载库然后放在某路径下,再在开发环境中设置库的路径,在程序中包含其头文件;再再简单的一种就是用开发环境编译一下生成必须的库,然后在开发环境中设置所需库的路径,然后在程序中包含头文件。
软件、库…没多少说的,必要的基础。
看书显出了有几分的重要性。
现身的水平跟过往经历成一定正相关,但最重要的是那副带热情和专注的学习能力及稍带神秘感领悟能力。
小段落。小段落。
[2013-10-27]