
嵌入式编程
文章平均质量分 77
jw212
这个作者很懒,什么都没留下…
展开
-
linux 实现简单定时器的功能
对于程序中需要定时去check某些变量或者function返回结果的功能,最早就是用最简单的sleep()的一行语句,虽然可以实现,但是需要主程序一直等待一段时间,无论是否提前有返回值。后面就想到可以用time()来实现相同的功能,和sleep不同的地方就是,如果check到原创 2011-08-19 18:08:42 · 1137 阅读 · 1 评论 -
WinCE 5.0 WIFI 无线网卡的配置和建立连接
<br />在 Windows CE 下自带有无线网卡的配置和连接程序,可是我的系统剪裁掉了资源管理器和任务栏,导致自带的无线网卡配置程序不能再使用了,只好自力更生。<br /> 我的环境是 S3C2440 + WinCE 5.0 + VNUWCL5(威盛无线网卡)及驱动程序。使用 Automatic Configuration Functions API<br /> 一、枚举系统中可用的无线网络设备<br /> 下面的函数可以枚举出系统中所有可用的无线网卡设备的GU转载 2010-09-25 12:47:00 · 1353 阅读 · 0 评论 -
驱动程序访问用户模式数据缓冲区的三种方式
<br />当应用程序发起一个读或写操作时,通过给出一个用户模式虚拟地址和长度,应用程序向I/O管理器提供了一个数据缓冲区。正如我在第三章中提到的,内核模式驱动程序几乎从不使用用户模式虚拟地址访问内存,因为你不能把线程上下文确定下来。Windows 2000为驱动程序访问用户模式数据缓冲区提供了三种方法:在buffered方式中,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。而你的驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。 在direct方转载 2010-09-17 14:34:00 · 3850 阅读 · 0 评论 -
IRP处理模型
IRP处理的“标准模型”<br /> <br /><br />图5-5.IRP处理的“标准模型”创建IRP<br />IRP开始于某个实体调用I/O管理器函数创建它。在上图中,我使用术语“I/O管理器”来描述这个实体,尽管系统中确实有一个单独的系统部件用于创建IRP。事实上,更精确地说,应该是某个实体创建了IRP,并不是操作系统的某个例程创建了IRP。例如,你的驱动程序有时会创建IRP,而此时出现在图中第一个方框中的实体就应该是你的驱动程序。<br />可以使用下面任何一种函数创建IRP: IoBuildA转载 2010-09-17 16:46:00 · 1283 阅读 · 0 评论 -
strcpy()、memcpy()、memmove()、memset()的实现
<br />一直想知道内部实现, 现在想看了, 就找了一下. http://www.cnitblog.com/guopingleee/archive/2009/02/15/54581.html 不错.<br />strcpy(), 字符串拷贝.<br />char *strcpy(char *strDest, const char *strSrc)<br />{<br /> assert((strDest!=NULL) && (strSrc !=NULL));<br /> char *addre转载 2010-09-07 16:55:00 · 806 阅读 · 0 评论 -
驱动编程中的同步处理
<br />作为驱动程序开发者我们需要了解的是:执行在某线程上下文中的代码在任何时刻都可能被系统夺去控制权。另外,只有在多处理器的计算机上才能真正实现多线程的并发执行。一般,我们需要做两个最差的假定: 操作系统可以在任何时间抢先任何例程并停留任何长的时间,所以我们不能保证自己的任务不被干扰或延迟。 即使我们能防止被抢先,但其它CPU上执行的代码也会干扰我们代码的执行,甚至一个程序的代码可以在两个不同线程的上下文中并发执行。 <br />Windows NT为解决一般的同步问题提供了两种方法,一个是中断请求优翻译 2010-09-07 17:37:00 · 1012 阅读 · 0 评论 -
指针与const限定符
<br />指针与const限定符 <br />const限定符和指针结合起来常见的情况有以下几种。const int *a;int const *a;<br />这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。int * const a;<br />a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。int const * const a;<br />a是一个指向const int转载 2010-09-07 16:24:00 · 501 阅读 · 0 评论 -
char与unsigned char的综合比较及实例
<br />字符类型有char与unsigned char两种,它们之间有何区别呢?为何对字符也要分个有符号与无符号呢?下面是个人的见解。<br />char 是有符号的 ,unsigned char 是无符号的。<br />char 整数范围为-128到127( 0x80__0x7F), 而unsigned char 整数范围为0到255( 0__0xFF )。<br />其实分出个正负是由于char类型在内存中的存储形式与int类型相同(或说相似),也正是由于此点char类型的值可以与int类型(包括u转载 2010-09-07 16:23:00 · 2081 阅读 · 0 评论 -
char *p="abc" 与 char p[]="abc" 的区别
<br />1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc/0" <br /><br />2."abc"是常量吗? <br />答案:有时是,有时不是 <br /><br />不是常量的情况: <br />"abc"作为字符数组初始值的时候就不是,如 <br /> char str[] = "abc"; <br />因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为字符数组就是把字符一个一个转载 2010-09-07 16:23:00 · 1201 阅读 · 0 评论 -
多进程和多线程
什么是多线程: <br /><br />多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。 <br /><br />使用线程的好处有以下几点: <br /><br />·使用线程可以把占据长时间的程序中的任务放到后台去处理 <br /><br />·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 <br /><br />·程序的运行速度可能加快 <br /><br />·在一些等待的转载 2010-10-09 10:39:00 · 1687 阅读 · 1 评论 -
进程和线程
<br /><br />线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:<br /> 1.线程ID<br /> 每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标 识线程。 2.寄存器组的值<br /> 由于线程间是并发运行的,转载 2010-10-09 10:32:00 · 571 阅读 · 0 评论 -
字符串常见算法之一:查找一个短串在一个长串中位置
字符串常见算法之一:查找一个短串在一个长串中位置 http://www.cppblog.com/humanchao/archive/2009/11/25/101918.aspx介绍的一些字符串处理的问题在日常编程中比较常见,但是在大学读书的时候几乎一个都没有涉及,最近学习了一下在这里介绍给大家,仅供参考。这些算法与内容包括:1、 查找一个短串在一个长串中位置;2、 查找一个字符串中最长的重复子串;3、 查找一个字符串中重复最多的子串;4、 两个字符转载 2010-10-09 14:00:00 · 2141 阅读 · 0 评论 -
Wince6.0 中断的产生及响应
<br />摘抄自- 程序设计实战一书<br /> <br />各种外设时通过中断和wince核心进行通信的。过程是:<br />1)硬件设备产生硬件中断<br />2)OAL完成硬件中断到逻辑中断(SYSINTR)的转换(OEMinit函数实现)<br />3)系统识别逻辑中断,同时进行处理。<br />分两步:中断服务例程(ISR)和中断服务线程(IST)。<br />ISR主要负责中断响应,一般要求短小精干,对执行效率有很高的要求,只负责最简单的工程,即响应设备并返回一个中断标示给核心。而对中断的实际原创 2011-03-17 12:06:00 · 1904 阅读 · 0 评论 -
进程内存分布
<br /> <br />进程中包含5个段,其中有:代码段,数据段,BSS段,堆,栈。<br />数据段: 存放进程中已初始化的全局数据。<br />BSS段: 存放进程中未初始化的全局数据。(Block Started by Symbol)<br />数据段+BSS段统称静态存储区。<br />栈是由硬件实现的,CPU有特定的进栈和出栈指令。<br />堆是由函数库(c/c++)提供,一次堆内存的分配会涉及内核态和用户态的切换。<br />堆和栈统称动态存储区,由于实现级别的不同,使得栈比堆更快。<br转载 2011-01-28 11:26:00 · 638 阅读 · 0 评论 -
堆和栈的区别
<br />堆和栈的区别 [摘录] 首先,我们举一个例子:<br />void f() { int* p=new int[5]; } <br /> 这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:<br /><br /转载 2011-01-28 11:23:00 · 505 阅读 · 0 评论 -
PCI设备读取配置空间
<br />一个较为典型的PCI总线体系结构图。<br /><br /> <br />我们来看看PCI设备是如何被识别和工作的。<br />首先,如何读取配置空间<br />PCI设备的配置信息包含了关于这个设备的基本情况的介绍,包括设备的名称,功能,使用方式等,因此首先必需要读取PCI设备的配置空间,才能够再讨论PCI设备的识别以及操作了。<br />PCI 规范系列文档总共定义了三种方法让CPU 通过Host/PCI 桥在PCI 总线上启动配置空间访问事务,这三种方法是:(1)配置机制#1,即Host转载 2010-12-29 15:56:00 · 6712 阅读 · 0 评论 -
Windows CE中的进程和线程
<br /> <br />一、进程<br />进程是一个具有一定独立功能的程序在一个数据集合上一次动态执行的过程。<br />进程是一个正在运行的应用程序的实例,它由两部分组成:<br />(1)管理这个进程的操作系统的内核对象;(2)该进程拥有的地址空间。<br />每一个进程都有独占的、受到保护的32MB的地址空间。Windows CE系统最大允许32个独立的进程同时进行。<br />进程是应用程序的一个实例,其运行的目标就是执行它所对应的应用程序;进程是动态的,而程序是静态的。<br />同windo转载 2010-12-15 18:09:00 · 1263 阅读 · 0 评论 -
高低位交换
<br />要求:<br />写一个函数,参数为一个无符号整数,返回值为该数高低位互换后的数。比如,带入1,返回0x80000000,带入2返回0x40000000,带入3则返回0xC0000000。要求算法要高效<br />算法:<br />依次取出最高位放入目标变量最高位(没放一次,目标变量则向右移一位)<br /> #include <stdio.h><br />#define BIT_LENGTH 32<br /><br />unsigned int ReverseData(unsigned int转载 2010-12-15 14:28:00 · 2874 阅读 · 0 评论 -
evc vc字符串转换处理一:(绝对精华,收集所有的例子)
原文:http://blog.youkuaiyun.com/hnhyhongmingjiang/archive/2008/03/06/2154009.aspx1.头文件中要定义宏; #define UNICODE #define _UNICODE ////////////////////char buf[128]; memset(buf,0,128); strcpy(buf,"你好"); WCHA转载 2010-10-18 10:12:00 · 703 阅读 · 0 评论 -
近期关于“WINCE驱动开发之DMA的使用”讨论
<br />以下是MSDN中的说法:<br />The Windows CE NDIS implementation does not support direct memory access (DMA). Do not use the NdisSetupDmaTransfer, NdisCompleteDmaTransfer, NdisMRegisterDmaChannel, NdisMDeregisterDmaChannel, NdisMAllocateMapRegisters, NdisMFreeMa原创 2010-10-18 14:47:00 · 1315 阅读 · 1 评论 -
WINCE下telnet,FTP及网络共享的使用方法
<br />WinCE为我们提供了强大的网络功能,只要在编译WinCE的时候,选择适当的组件,我们就可以在WinCE运行以后通过telnet或者FTP访问WinCE的文件系统,而且还可以相互共享文件夹,现在进入主题: <br /><br />1. 在WinCE6.0中,打开“Catalog Items View”,然后依次选择“Core OS”->"CEBASE"->"Communication Services and Networking"->"Servers",然后我们会看到“FTP Server”和转载 2010-09-17 14:46:00 · 960 阅读 · 0 评论 -
WinCE BSP中的Dirs文件和Sources文件
<br />1. Dirs文件<br /> 关于Dirs文件,就是指定要编译的路径,这个地球人都知道。还是简单介绍一下。按照文档上面介绍有三种定义:DIRS,DIRS_CE和OPTIONAL_DIRS。<br /> DIRS:就是指定要编译的目录。<br /> DIRS_CE:只有目录下的源代码用于WinCE的映像文件时,才编译该目录。<br /> OPTIONAL_DIRS:指定可以选择编译的目录。比如:OPTIONAL_DIRS=proj1,如果想编译proj1目录,可以设置BUILD_OPTI转载 2010-09-15 15:04:00 · 494 阅读 · 0 评论 -
WLAN Scan with NDIS Miniport and Much More - CodeProject
WLAN Scan with NDIS Miniport and Much MoreBy sirb | 29 Oct 2007 An article about using NDIS Miniport from userspace to access several functions of the WLANcard Download source - 45.5 KBDownload demo project - 19.8 KBIntroductionI spent some time with WLAN,转载 2010-08-05 11:54:00 · 2678 阅读 · 0 评论 -
Ping-Microsoft Windows CE 3.0
The ping command sends an ICMP echo request to a target name or IP address, helping you to verify IP-level connectivity.ping [-?] [-f] [-l size] [-n count] [-i TTL] [-v TOS] [-w timeout] address-?Prints a list of the available command-line options. -fS原创 2010-08-05 11:17:00 · 804 阅读 · 0 评论 -
C优先级顺口溜
<br /><br />大家肯定对记运算符的优先级比较苦恼,总是记了忘,忘了又记,太闹心了,我也是啊,崩溃!<br />今天在无意中google出了一个关于优先级的顺口溜,真好!<br /> 醋坛酸味灌<br /> 味落跳福豆<br /><br />共44个运算符<br /><br />醋-初等,4个: ( ) [ ] -> 指向结构体成员 . 结构体成员<br />坛-单目,9个: ! ~ ++ -- -负号 (类型) *指针 &取地址 sizeof长度<br />酸-算术,5个: *转载 2010-07-27 16:20:00 · 644 阅读 · 0 评论 -
inline define区别
<br />介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的<br />功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如<br />#define TABLE_COMP(x) ((x)>0?(x):0) <br />就定义了一个宏。<br /><br /> 为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数<br />所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行<br />该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的转载 2010-07-28 17:06:00 · 1202 阅读 · 0 评论 -
成为嵌入式程序员需要知道的0x10个问题
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1) #define 语法的基本知识(例如:不能以分号结束,括号翻译 2010-07-23 15:18:00 · 795 阅读 · 0 评论 -
如何定位WinCE产生Data Abort错误的位置
如何定位WinCE产生Data Abort错误的位置在调试WinCE程序的时候,有时候会碰到Data Abort的异常,系统会在调试控制台输出如下类似信息:Exception 'Data Abort' (4): Thread-Id=03d3000e(pth=83a9e024), Proc-Id=00400002(pprc=81d48308) 'NK.EXE', VM-active=00fa000a(pprc=83a20ecc) 'explorer.exe'PC=c0883660(s3c2440disp.dl转载 2010-07-19 15:00:00 · 834 阅读 · 0 评论 -
VS 2005使用map文件查找程序崩溃原因
一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一个比较好的方法来找原因,通过生成map文件,由于2005取消map文件生成行号信息(vc6.0下是可以生成行号信息的,不知道microsoft怎么想的,在2005上取消了),只能定位在那个函数发生崩溃。这里可以通过生成cod文件,即机器码这一文件,具体定位在那一行崩溃。 首先配置vc2005生成map文件和cod文件:(1).map文件:property->转载 2010-07-19 15:05:00 · 612 阅读 · 0 评论 -
解析Winpcap截获的数据包
解析Winpcap截获的数据包2009-04-28 16:38现在Winpcap库已经被广泛应用于网络程序,特别是用于网络分析,而多数初学者对于如何分析所截获的数据包还不太清楚。现在就以我的经验来介绍一下,希望能对大家有所帮助。首先要清楚的是,Winpcap截获的数据包与Windows Raw socket截获的数据包不同的是,raw socket截获的数据包只局限于传输层(请参考有关OSI模型知识),也就是所只能够截获tcp,udp,icmp等高层协议,而Winpcap截获的数据包是从数据链路层开始的,它转载 2010-07-01 12:09:00 · 5103 阅读 · 0 评论 -
Sizeof与Strlen的区别与联系(转)
Sizeof与Strlen的区别与联系(转)1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''/0''结尾的。sizeof还可以用函数做参数,比如: short f();printf("%d/n", sizeof(f()));输出的转载 2010-08-05 14:35:00 · 476 阅读 · 0 评论 -
大小端、网络字节序问题
总结:1、80X86使用小端法,网络字节序使用大端法。 2、二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int 来处理, unsigned short ,unsigned short 以网络字节序处理后再拷贝到发送的buffer里 3、结构体前要指定 #pragma pack(1) 结构体后#pragma pack() 对于字节序(大端法、小端法)的定义《UNX转载 2010-06-13 10:16:00 · 1056 阅读 · 3 评论 -
单机搭建WinCE开发环境 -如何在CE6.0 image中加入MFC的支持, 及如何导出相关的SDK
单机搭建WinCE开发环境<br /> 这两天在调试RMC程序,这是一个WinCE下的“远程桌面”程序。由于在单位没有时间调,所以只能回家做,可家里又没实验板。好在Windows CE是有模拟器的,可以用模拟器代替实验板进行程序的调试。即便如此,还是碰到了一些问题,不过都一一解决了,写出来跟大家分享一下。<br /> 最早主机上已经安装了EVC4+SP4,VS2005+SP1+Platform Builder6.0+R2等 Windows CE的主要开发工具。既然没有实验板,那就定制转载 2010-08-16 17:46:00 · 1247 阅读 · 0 评论 -
驱动程序与应用程序之间的通信
<br />驱动程序必须与应用程序进行通信,才能最终达到应用程序控制设备的目的,不然驱动有QIU用。<br />要通信就涉及到3个方面: <br />1.应用程序与驱动程序通信<br />2.驱动程序与应用程序通信<br />3.数据传输<br />下面分别讨论<br />1。应用程序与驱动程序通信<br />1-1 应用程序实现与驱动通信的过程: <br />---用CreateFile打开设备,然后用DeviceIoControl和驱动通信,包括从驱动读数据和写数据2种情况<br />也可以使用Read转载 2010-09-06 17:40:00 · 618 阅读 · 0 评论 -
IRP 完成例程
<br /><br /><br />当IRP从驱动A传到底层驱动E后,在E里完成IRP[IoCompleteRequest]后,IRP会从底层E向A返回,然后再回到应用程序。<br />若是在一个IO堆栈中设置了完成例程[调用IoCallDriver之前设置],那么当IRP完成之后会一层一层向上返回,每到一层会检查到IOSTACKLOCATION里的CompletionRoutine这个子域,若是非空说明设置完成例程,那么IRP在这层时会调用这个函数。传进这个完成例程的子域是Context。<br />当设转载 2010-09-03 12:16:00 · 2390 阅读 · 1 评论 -
WinCE中的Debug Zone调试
<br />在WinCE的开发环境中支持Debug Zones功能,通常也被称为调试域,通过它可以控制打印信息。当某个调试域被打开以后,在这个域中的打印信息就会被打印出来,如果某个调试域被关闭了,那么这个域中的打印信息就会被关闭。调试域是基于模块的,也就是说一个模块,可能是在一个驱动或者一个应用中都可以定义一个调试域,用来调试该模块。一个调试域最多可以包括16个域,一般在每一个模块中都会有一个全局变量dpCurSettings,该变量用于描述调试域的相关信息,它由一个模块名字,16个域的名字和一个掩码组成。转载 2010-08-30 16:20:00 · 449 阅读 · 0 评论 -
ATA标准规范文件说明及下载
ATA-5标准规范文档(下文简称ATA-5文档)是我工作以后用到的第一份比较全面而复杂的标准文档。这份文档,在我第一份工作近三年的时间内被我反复的阅读和使用。在它的指导下,我完成了一款ATA设备端产品的维护、升级和另一款新产品的开发。正如对自己的第一份工作怀有深厚的感情一样,对 ATA协议,我也一直在关注着它的发展变化。riple 最近看到有网友说看了ATA标准规范文档后不知道从何入手,这一困惑我也曾经有过。在这篇文章里,我就尝试着把ATA-5文档的大致结构捋一下,把文档中我熟悉的重点和难点部分标示出转载 2010-08-26 15:10:00 · 8548 阅读 · 2 评论 -
ATA和ATAPI类型硬盘区别方法
ATA和ATAPI类型硬盘区别方法2010-05-21 17:48<br />目前,计算机主板IDE控制器连接的硬盘有ATA(AT Attachment)类型和ATAPI(AT Attachment Packet Interface)类型。那么,软件程序BIOS或者Linux内核是如何才能识别出硬盘是那种类型的呢?<br />在参考文档[1]中,定义了识别硬盘类型的方法,如下所示:<br />A device not implementing the PACKET command feature set s转载 2010-08-26 17:37:00 · 5529 阅读 · 3 评论 -
逆序单链表的高效算法
链表反转是很多笔试面试常考之题,既然这么常见那就好好研究下。其实链表反转方法很多,主要有一下几种办法:1、重建新链表,使用头插法将原链表元素放入,时空复杂度较大,同时如果加入“就地逆序不新建”等限制条件,该算法便不可用;2、堆栈法:将原链表元素依序push如堆栈中,然后再pop入新链表中,时空复杂度依然过大,但是思路不错;3、修正的头插法: 对方法1的头插法进行改进,不插入新建列表中,而是插入已置空的当然链表中,只修改各节点的next指向,时间复杂度只有O(n)。是较为完美的解决方案。总结:转载 2010-08-19 15:40:00 · 666 阅读 · 0 评论 -
有关EVC SP4,VS2005 两种建立MFC程序的随笔
<br />首先EVC是一个很好的工具,自带x86的模拟器,动手写基于MFC的程序很方便,不知道是在哪里看到资料,好像给我的感觉就是EVC就是针对CE5.0的,而对于CE6.0来说,最好用VS2005来进行,但是MS在VS2005中CE6已经去掉了对MFC类库的支援。<br /> <br />因为要做一个在CE5.0和CE6.0都可以正常RUN的程序。首先拿VS2005做个试验,通过自己的定义os生成对应的SDK,并且需要在创建SDK时加入mfc相关的文件(见上篇博文),安装之后创建VS2005的smart原创 2010-08-17 17:37:00 · 1280 阅读 · 0 评论