设备驱动编译器
1、安装scons
(1) 下载python2.7, 使用x86_32位,因为scons只有32位安装包可用;
(2) 下载scons2.3.0;
(3) 安装python 和 scons, 将C:\Python27\Scripts写入PATH;
(4) 下载安装pywin32 ,It is recommended you install pywin32 if you want to do parallel builds (scons -j)
2、安装boost库(1.49版本).
解压后双击bootstrap.bat,生成bjam.exe后,cd到目录c:\boost下,(将boost_1_49更名为boost了)编译boost。
编译命令:C:\boost>bjam variant=release --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
这是使用VS2010环境编译的release版本,编译完成后,生成C:\boost\stage\lib文件夹,下面有6个lib库:
如果要编译成debug版本,使用命令:bjam variant=debug --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
编译完成后,生成C:\boost\stage\lib文件夹,下面有10个lib库和dll:
此处为MongoDB文档中对于编译boost库的要求原文:
When using bjam, MongoDB expects
variant=debug for debug builds, and variant=release for release builds
threading=multi
link=static runtime-link=static for release builds
address-model=64 for 64 bit(64位的话,把32换为64)。link=static runtime-link=static,boost需要编译成静态库,因为mongodb只会去链接boost的静态库
address-model=64在win7 64环境下此项必须,不加在编译mongodb的c++ client时会出现链接错误。
3、下载mongo2.4.6源码 http://www.mongodb.org/downloads官网下载
编译Mongoclient.lib
cmd命令提示符下,cd到解压后的文件目录,例如我放在了E盘,E:\mongodb-src-r2.4.6,输入命令:
scons –-dd --32 mongoclient.lib // build C++ client driver library
Add --64 or --32 to get the 64- and 32-bit versions, respectively. Replace --release with --dd to build a debug build.
编译后在mongodb\build\win32\32\dd\client_build\生成mongoclient.lib.
4、测试程序
就用Mongodb自带的例子吧,使用VS2010打开E:\mongodb-src-r2.4.6\src\mongo\client\examples中的simple_client_demo.vcxproj,编译,会提示生成simple_client_demo.sln,保存。
使用debug模式,配置工程环境:打开工程->属性,配置Configuration Properties下的VC++ Directories,头文件路径添加C:\boost,Lib库路径添加boost的lib,以及mongodb client的lib:
C:\boost\stage\lib
E:\mongodb-src-r2.4.6\build\win32\32\dd\client_build
进入C/C++下面的Code Generation,将Runtime Library设置为Multi-threaded Debug (/MTd)
进入Linker下面的Input,设置Additional Dependencies,添加ws2_32.lib,psapi.lib,Dbghelp.lib,mongoclient.lib
将E:\mongodb-src-r2.4.6\build\win32\32\dd\mongo\base下生成的error_codes.h和error_codes.cpp文件,拷贝到E:\mongodb-src-r2.4.6\src\mongo\base目录下。
ok,编译、运行.
5、问题解决
error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(dbclient.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(assert_util.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(jsobj.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(status.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(mutexdebugger.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
VS的版本不匹配,lib是在更高级的版本中编译生成的,而使用的时候,是在低级版本中使用的,所以出现了不匹配的错误。例如,我在VS2010 SP1和VS2012的环境下编译的,而使用是在VS2010上使用,所以在编译时,出现了以上问题。
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymCleanup
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymGetMoleInfo64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymInitialize
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_StackWalk64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymFromAddr
在工程依赖库中添加Dbghelp.lib
其它问题,看看你手头的编译器、编译出来的boost库版本、mongoclient.lib的版本,是否对应好了。
Ⅱ 低级语言开发的程序特点
低级语言提供了操纵计算机系统底层硬件的能力。熟练的程序员通常使用低级语言编写操作系统、设备驱动程序和编译器之册戚类的底层系统软件。低级语言使用CPU的指令集直接调用处理器、寄存器和内存地址,并在这些操作中保持非常高的效率。由于不同的CPU提供的指令集有所不同,所以低级语言依赖于计算此尺机。
低级语言是指机器语言和汇编语言。
1)机器语言(machinelanguage)是一种指令集的体系。这种指令集,称机器码(machinecode),是电脑的CPU可直接解读的数据。
2)汇编语言是汇编指令集、伪指令集和使用它们规则的统称,使用具有一定含义的符号为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式州扒陵指令。
Ⅲ 如何学习linux设备驱动
通常,内核的升级对从事linux应用程序开发的人员来说影响较小,因为系统调用基本保持兼容,影响比较大的是驱动开发人员。每次内核的更新都可能导致许多内核函数原型上的变化,其中既有内核本身提供的函数,也有硬件平台代码提供的函数,后者变化的更加频繁。这一点从许多经典书籍就可验证,当你按照手里的经典着作,如:Alessandro的《linux设备驱动程序》,编写驱动时,发现并不能够成功的在你的linux平台上编译通过、或不能正常执行,原因就在于你用的内核和书里的不一致。
本文从两个方面去解释这个问题,一方面是如何写好linux设备驱动,另一方面是如何应对不断升级的内核。
如何写好Linux设备驱动
Linux设备驱动是linux内核的一部分,是用来屏蔽硬件细节,为上层提供标准接口的一种技术手段。为了能够编写出质量比较高的驱动程序,要求工程师必须具备以下几个方面的知识:
● 熟悉处理器的性能
如:处理器的体系结构、汇编语言、工作模式、异常处理等。对于初学者来说,在还不熟悉驱动编写方法的情况下,可以先不把重心放在这一项上,因为可能因为它的枯燥、抽象而影响到你对设备驱动的兴趣。随着你不断地熟悉驱动的编写,你会很自然的意识到此项的重要性。
● 掌握驱动目标的硬件工作原理及通讯协议
如:串口控制器、显卡控制器、硬件编解码、存储卡控制器、I2C通讯、SPI通讯、USB通讯、SDIO通讯、I2S通讯、PCI通讯等。编写设备驱动的前提就是需要了解设备的操作方法,所以这些内容的重要程度不言而喻。但不是说要把所有设备的操作方法都熟悉了以后才可以写驱动,你只需要了解你要驱动的硬件就可以了。
● 掌握硬件的控制方法
如:中断、轮询、DMA 等,通常一个硬件控制器会有多种控制方法,你需要根据系统性能的需要合理的选择操作方法。初学阶段以实现功能为目的,掌握的顺序应该是,轮询->中断->DMA。随着学习的深入,需要综合考虑系统的性能需求,采取合适的方法。
● 良好的GNU C语言编程基础
如:C语言的指针、结构体、内存操作、链表、队列、栈、C和汇编混合编程等。这些编程语法是编写设备驱动的基础,无论对于初学者还是有经验者都非常重要。
● 良好的linux操作系统概念
如:多进程、多线程、进程调度、进程抢占、进程上下文、虚拟内存、原子操作、阻塞、睡眠、同步等概念及它们之间的关系。这些概念及方法在设备驱动里的使用是linux设备驱动区别单片机编程的最大特点,只有理解了它们才会编写出高质量的驱动。
● 掌握linux内核中设备驱动的编写接口
如:字符设备的cdev、块设备的gendisk、网络设备的net_device,以及基于这些基本接口的framebuffer设备的fb_info、mtd设备的mtd_info、tty设备的tty_driver、usb设备的usb_driver、mmc设备的mmc_host等。
Linux内核为设备驱动编写者提供了标准的接口,驱动编写者无需精通内核的各个部分,只需要明确内核提供给我们的接口,并实现此接口就可以了。内核提供的接口采用的是面向对象的思路,即把目标设备抽象成一个对象,通常利用一个结构体来描述这个对象。驱动工程师的任务就是实现这个对象。这个结构体中会包含设备的属性(用变量表示)和操作方法(用函数指针表示)。如:字符设备的cdev
struct cdev {
struct kobject kobj;
struct mole *owner;
const struct file_operations *ops; // 操作方法结合,其它项都是属性
struct list_head list;
dev_t dev;
unsigned int count;
};
开始阶段可以以模仿为主,即套用一些固定的模板、参考例程。
如何应对不断升级的内核
内核升级对驱动的影响主要体现在,(1)驱动接口定义的变化;(2)内核的一些功能函数的名称、参数、头文件、宏定义的变化;(3)平台代码关于硬件操作方面封装的一些函数的变化;(4)设备模型的影响。
● 驱动接口定义的变化
如:2.4内核中字符设备驱动的注册接口是:
int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)
而2.6内核中已经不建议使用这种方法了,改为:
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
这种接口定义及注册方法带来的变化,发生的并不频繁。解决方案是:参考内核中的代码。这种接口定义及注册方法在内核中非常容易找到,如:字符设备驱动的注册方法及接口定义可以参照内核driver/char/目录下的很多实例。
● 内核的一些功能函数的名称、参数、头文件、宏定义的变化
如:中断注册函数的格式及参数在2.4内核、2.6内核低版本和高版本之间都存在差别,在2.6.8中,中断注册函数的定义为:
int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irq_flags, const char * devname, void *dev_id)
irq_flags的取值主要为下面的某一种或组合: SA_INTERRUPT、SA_SAMPLE_RANDOM、SA_SHIRQ
在2.6.26中,中断注册函数的定义为:
int request_irq(unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id)
typedef irqreturn_t (*irq_handler_t)(int, void *); irq_flags的取值主要为下面的某一种或组合:(功能和2.6.8的对应)IRQF_DISABLED、IRQF_SAMPLE_RANDOM、IRQF_SHARED
当出现这些问题时,编译过程中,编译器会给我们比较明确的错误提示,根据这些提示你可以判断出是否是缺少头文件问题、是否是函数参数定义有误等。解决问题的最好办法还是到你的目标内核中找信息。此时找问题的方法可以借助于搜索,如:你可以在新的内核中搜索request_irq,看新内核中的驱动是如何使用它的,这种方法非常有效。
● 平台代码关于硬件操作方面封装的一些函数的变化
内核中,硬件平台相关的代码在内核更新过程中变化比较频繁,和我们的设备驱动也是息息相关,所以在针对一个新内核编写设备驱动前,一定要熟悉你的平台代码的结构。有时平台虽然提供了内核要求的接口函数,但使用起来功能却并不完善。下面还是先举个例子说明平台代码更新对设备驱动的影响。
如:在linux-2.6.8内核中,调用set_irq_type(IRQ_EINT0,IRQT_FALLING);去设置S3C2410的IRQ_EINT0的中断触发信号类型,你会发现不会有什么效果。跟踪代码发现内核的set_irq_type函数需要平台提供一个针对硬件平台的实现函数
static struct irqchip s3c_irqext_chip = {
.mask = s3c_irqext_mask,
.unmask = s3c_irqext_unmask,
.ack = s3c_irqext_ack,
.type = s3c_irqext_type
};
s3c_irqext_type就是linux内核需要的实现函数,而s3c_irqext_type在2.6.8中的实现为: static int s3c_irqext_type(unsigned int irq, unsigned int type)
{
irqdbf("s3c_irqext_type: called for irq %d, type %d\n", irq, type);
return 0;
}
原来并没有实现。而在较高版本的内核,如2.6.26内核中,这个函数是实现了的。所以你一定要小心。当平台函数不好用时,一定要查查原因,或者直接操作硬件寄存器来达到目的。
● 2.6内核设备模型对驱动的影响
在2.6内核中写设备驱动和在2.4内核中有着很大的不同,主要就是在设备驱动中融入了比设备驱动本身结构还复杂、还难以理解的设备模型。初学驱动时你可以不理会设备模型,但你会发现内核里的驱动代码基本上都是融入了设备模型的了。所以很多时候你不得不面对现实,还是要弄懂它,并且它也的注册方法也会随着内核的升级而发生变化。解决此类问题的最好方法还是参考目标内核驱动代码。
Ⅳ cpu进行写操作的时候可能运行的程序
CPU写操作时,可以运行的程序包括操作系统、应用程序、设备驱动程序、系统工具等。操作系统可以控制和管理计算机的硬野搭件资源,如内存、硬盘空间、处理器和外部设备,并且提供用户界面,以便用户高脊岩可以更加轻松地使用计算机。应用程序是用于完成特定任务的软件,如文字处理、绘图、游戏等。设备驱动程序是用于控制外部设备,如打印机、键盘、鼠标等的软件。系统工具是用于管理和优化系统性能的软件,如磁盘碎片整戚御理、系统清理、系统安全等。您可以根据自己的需要安装不同的程序来完成不同的任务。
Ⅳ linux设备驱动
#include #include #include #include #include #include #include 以上这些基本上都得用到的头文件 一般锋哗编译器会报错,根据报错橘基桥信息,再添加相圆猛应的头文件即可。
Ⅵ 用易语言能否开发显卡驱动程序
易语言暂时不能薯仔 即使能也只能调用其他程序的 易语言现在对系统的操作太少,不能做显卡驱动 至少我不数族汪能 也不排除有高手的可能性 比如穗基吴涛
Ⅶ 设备驱动make没有那个文件或目录
当使用设备驱动程序的make命令时,如果提示“没有那个文件或目宏亩薯录”错误,这通常是因为某些依赖文件不存在或路径不正确导致的。
以下是可能导致该问题的一些原因和解决方法:
1. 检查Makefile文件是否存在,并确保它包含正确的路径和源代码文件名。尤其要注意路径是否正确,有时路径名称大小写不一致的情况也会导致该问题。
2. 如果Makefile文件中用到了其他源代码文件,检查这些蔽者源代码文件是否存在,并且它们的路径是否与Makefile文件中的路径一致。
3. 确认所需的开发工具耐宽已经被正确安装。例如,确保gcc、g++等编译器和make命令已经正确安装和配置。
4. 如果在执行make命令时使用了变量,例如$PATH,则确保这些变量在当前环境中设置正确。
5. 确保当前所在的目录是正确的,并且可以访问需要使用的文件和目录。
总之,出现“没有那个文件或目录”错误通常是由于某些依赖文件不存在或路径不正确造成的,需要仔细检查相关文件和路径是否正确,并进行相应调整。
Ⅷ Mac下的c++编译器有哪些
Mac下的c++编译器:
1、Xcode
Xcode运行于苹果公司的Mac操作系统下,是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X、iOS、C、C++、Objective-C和java的应用程序。
2、GCC
GCC是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)
3、Code::Blocks
Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境。 Code::Blocks是开放源码软件。Code::Blocks由纯粹的C++语言开发完成,它使用了着名的图形界面库wxWidgets(2.6.2 unicode)版。
(8)设备驱动编译器扩展阅读
Xcode特点
1、文件转移
因为 Xcode 支持 CodeWarrior 风格相关项目参考,所以可以保证把 CodeWarrior 项目文件快速方便地转移到 Xcode。
2、辅助开发
Xcode 可用来辅助开发应用程序、工具、架构、数据库、嵌入包、核心扩展和设备驱动程序。Xcode 支持开发人员使用 C、 C++、Objective C、 AppleScript 和 Java。
3、协作运行
Xcode 能够和 Mac OS X 里众多其它的工具协作,例如综合用户界面结构应用程序;编译器如 gcc、javac 和jikes;还有调试工具如 gdb。
4、自由撤销
Xcode 4 的虚拟模型和设计功能让你可以更轻松的开发和维护应用程序。只需选择应用程序中想要编写的部分,然后模型和设计系统将自动创建分类图表,不仅可以显示编码,还可以让你进行浏览。
Ⅸ 关于windows下驱动程序开发
其实在WINDOWS XP下还是可以使用VXD驱动的,只是那是微软为了向下兼容以前的操作系统而已,在NT下的驱动最好的WDM驱动。弯哗WDM是微软推出的驱动模型,支持Windows 98、Windows 2000、Windows XP等,现在学驱动编程最好是学WDM编程,因为VXD过时了,编写驱动最不可少的东西就是DDK,即誉袭驱动开发包,是微软推出的,在此基础上你可以使用VC++来提供驱动开发的集成环境,还可以使用DriverStudio来实现驱动的面向对象编程,DDK是C语言的,这几个工具的安装顺序为:庆闹兄DDK -- VC++ -- DriverStudio。
Ⅹ 驱动和编译器是否有些非常相似的地方呢用自己的话说
从哲学上说,他们都是作为接口而存在。操作系统通过驱动程序控制对应的硬件,高级程序设计语言通过编译器变成目标机器的机器语言。