函数调用

wince下USB设备驱动程序

喜欢而已 提交于 2020-03-08 07:42:10
随着USB设备的不断增加,我们这些开发人员也就多了对USB设备进行驱动程序开发的工作。但是对于很多初学者来说,存在以下三个困难: 一是对WinCE的驱动程序结构了解得太少,没办法得心应手的专注于驱动程序的开发工作; 二是对WinCE自带的USB驱动程序的例子没有弄懂,看到一大堆文件夹结构和源程序思维混乱; 三是几乎没有什么中文的参考资料,不知如何下手。 第三条是很多开发人员都遇到的,我也一样,很多朋友问我有没有什么资料,我也只能说抱歉,因为我也同样有这个问题,一切都靠自己的黑暗中摸索,因此本文不谈第三条。 第一条是可以找到资料的,如《Windows CE .NET系统分析及实验教程》,因此本文也不打算在此花费大量笔墨。 这样,本文的着重点就在第二条上面了,通过本文,我希望能让更多的朋友理解Windows CE下对USB设备的驱动模型及样例程序中的实现过程,以样例代码为基础理顺USB设备驱动程序的开发思路。同样,本文的读者对象预期是入门者和准备着手USB驱动开发的人员,驱动开发高手自然就当一笑吧。同时写本文的目的也是履行我半年前答应很多朋友的诺言,并向我的慵懒致歉。 好了,在看样例程序之前,我们还有些东西需要了解,我们就先来看下图: 在此图中,我们可以非常清晰的看到主机和物理外设之间的结构方式,在主机端,通过USBD模块和HCD模块使用默认的PIPE访问一个通用的逻辑设备

VC DLL总结

只谈情不闲聊 提交于 2020-03-08 03:42:51
一、DLL的导出方法 1、使用_declspec(dllexport) 方法 DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。 extern "C" _declspec(dllexport) int sum(int a,int b);//本文所有的例子只有一个sum即加法函数。 在制作DLL导出函数时由于C++存在函数重载,因此__declspec(dllexport) function(int,int) 在DLL会被decorate,例如被decorate成为 function_int_int,而且不同的编译器decorate的方法不同,造成了在用GetProcAddress取得function地址时的不便,使用extern "C"时,上述的decorate不会发生,因为C没有函数重载,但如此一来被extern"C"修饰的函数,就不具备重载能力,可以说extern 和 extern "C"不是一回事。 在VC++中,如果生成DLL可以不使用.def文件。只需要在VC++的函数定义前要加__declspec(dllexport)修饰就可以了。但是使用__declspec(dllexport)和使用.def文件是有区别的。如果DLL是提供给VC++用户使用的,只需要把编译DLL时产生的.lib提供给用户

从一个新手容易混淆的例子简单分析C语言中函数调用过程

怎甘沉沦 提交于 2020-03-08 03:12:34
某天,王尼玛写了段C程序: 1 #include <stdio.h> 2 3 void input() 4 { 5 int i; 6 int array[20]; 7 for(i = 0; i < 20; i++) 8 { 9 array[i] = i; 10 } 11 } 12 13 void output() 14 { 15 int i; 16 int array[20]; 17 for(i = 0; i < 20; i++) 18 { 19 printf("%d\n", array[i]); 20 } 21 } 22 23 int main() 24 { 25 input(); 26 output(); 27 while(1){} 28 return 0; 29 }   这段代码的目的很简单,在input函数中定义了array[20]并赋值,在output函数中输出,运行结果如下:   Nice Work!   But…… 在input()后来一发printf()呢????? 1 int main() 2 { 3 input(); 4 printf("any string"); 5 output(); 6 while(1){} 7 return 0; 8 }   其实,只要学过一段时间的C语言的童鞋就会发现,刚刚开始那俩函数里定义的array[20]就出问题了

为什么有函数调用栈?

跟風遠走 提交于 2020-03-08 01:59:57
为什么引入栈 完成函数调用的过程,需要有个地方存放函数调用返回后要执行的指令地址(简称返回地址) 极客时间-深入计算机组成原理 函数调用过程中,栈的使用 A1 call B A3 B1 B2 retq rip寄存器: 存放下一条要执行的指令地址 callq指令做两件事 把rip的地址A3压栈(也就是被调用函数返回后,调用者本来接下来会执行的那条指令的地址) // 本来这个指令地址都被放在rip了,正常情况就要执行了,但是被call指令弄走了. 把被调用函数的第一条指令地址放入rip,使得cpu下一个就开始执行子函数。 retq指令做1件事 把栈的A3弹出,放入rip。使得cpu加下来继续执行A函数。 深入理解计算机系统-3.7 来源: https://www.cnblogs.com/yudidi/p/12439271.html

黑幕背后的Autorelease

只愿长相守 提交于 2020-03-07 18:33:52
http://blog.sunnyxx.com/2014/10/15/behind-autorelease/ 我是前言 Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用 [obj autorelease] 来延迟内存的释放是一件简单自然的事,ARC下,我们甚至可以完全不知道Autorelease就能管理好内存。而在这背后,objc和编译器都帮我们做了哪些事呢,它们是如何协作来正确管理内存的呢?刨根问底,一起来探究下黑幕背后的Autorelease机制。 Autorelease对象什么时候释放? 这个问题拿来做面试题,问过很多人,没有几个能答对的。很多答案都是“当前作用域大括号结束时释放”,显然木有正确理解Autorelease机制。 在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的 runloop 迭代结束时释放的,而它能够释放的原因是 系统在每个runloop迭代中都加入了自动释放池Push和Pop 小实验 __weak id reference = nil;- (void)viewDidLoad { [super viewDidLoad]; NSString *str = [NSString stringWithFormat:@"sunnyxx"]; // str是一个autorelease对象

黑幕背后的Autorelease

☆樱花仙子☆ 提交于 2020-03-07 18:33:17
原创文章,原地址: blog.sunnyxx.com 我是前言 Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用 [obj autorelease] 来延迟内存的释放是一件简单自然的事,ARC下,我们甚至可以完全不知道Autorelease就能管理好内存。而在这背后,objc和编译器都帮我们做了哪些事呢,它们是如何协作来正确管理内存的呢?刨根问底,一起来探究下黑幕背后的Autorelease机制。 Autorelease对象什么时候释放? 这个问题拿来做面试题,问过很多人,没有几个能答对的。很多答案都是“当前作用域大括号结束时释放”,显然木有正确理解Autorelease机制。 在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的 runloop 迭代结束时释放的,而它能够释放的原因是 系统在每个runloop迭代中都加入了自动释放池Push和Pop 小实验 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 __weak id reference = nil; - (void)viewDidLoad { [super viewDidLoad]; NSString *str = [NSString stringWithFormat:@"sunnyxx"]; //

Autorelease对象什么时候释放?

故事扮演 提交于 2020-03-07 18:32:25
Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用 [obj autorelease] 来延迟内存的释放是一件简单自然的事,ARC下,我们甚至可以完全不知道Autorelease就能管理好内存。而在这背后,objc和编译器都帮我们做了哪些事呢,它们是如何协作来正确管理内存的呢?刨根问底,一起来探究下黑幕背后的Autorelease机制。 原文链接 Autorelease对象什么时候释放? 这个问题拿来做面试题,问过很多人,没有几个能答对的。很多答案都是“当前作用域大括号结束时释放”,显然木有正确理解Autorelease机制。 在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的 runloop 迭代结束时释放的,而它能够释放的原因是 系统在每个runloop迭代中都加入了自动释放池Push和Pop 小实验 __weak id reference = nil; - (void)viewDidLoad { [super viewDidLoad]; NSString *str = [NSString stringWithFormat:@"sunnyxx"]; // str是一个autorelease对象,设置一个weak的引用来观察它 reference = str; } - (void)viewWillAppear:

10分钟学会Python函数基础知识

£可爱£侵袭症+ 提交于 2020-03-07 18:29:40
看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了。最好还是把代码敲一下。 PS特别注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮答疑容易放弃。为此小编建了个Python全栈免费答疑.裙 :七衣衣九起起巴而五(数字的谐音)转换下可以找到了,不懂的问题有老司机解决里面还有最新Python教程项目可拿,,一起相互监督共同进步! 一、函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用。 有了函数,我们可以在很大程度上减少复制及粘贴代码的次数了(相信很多人在刚开始时都有这样的体验)。我们可以把相同的代码可以提炼出来做成一个函数,在需要的地方只需要调用即可。那么,这样就提高了代码的复用率了,整体代码看起来比较简练,没有那么臃肿了。 函数在Python中是最基本的程序结构,用来最大化地让我们的代码进行复用;与此同时,函数可以把一个错综复杂的系统分割为可管理的多个部分,简化编程、代码复用。 接下来我们看看什么是函数,及函数该如何定义。有两种方式可以进行函数的定义,分别是 def 及 lambda 关键字。 1. 函数定义 先总结一下为什么要使用函数? 代码复用最大化及最小化冗余代码; 过程分解(拆解)

Linux内存点滴 用户进程内存空间

做~自己de王妃 提交于 2020-03-07 14:14:12
http://www.perfgeeks.com/?p=723 http://www.perfgeeks.com/?p=770 经常使用 top 命令了解进程信息,其中包括内存方面的信息。命令 top 帮助文档是这么解释各个字段的。 VIRT , Virtual Image (kb) RES, Resident size (kb) SHR, Shared Mem size (kb) %MEM, Memory usage(kb) SWAP, Swapped size (kb) CODE, Code size (kb) DATA, Data+Stack size (kb) nFLT, Page Fault count nDRT, Dirty Pages count 尽管有注释,但依然感觉有些晦涩,不知所指何意? 进程内存空间 正在运行的程序,叫进程。每个进程都有完全属于自己的,独立的,不被干扰的内存空间。此空间,被分成几个段 (Segment), 分别是 Text, Data, BSS, Heap, Stack 。用户进程内存空间,也是系统内核分配给该进程的 VM( 虚拟内存 ) ,但并不表示这个进程占用了这么多的 RAM( 物理内存 ) 。这个空间有多大?命令 top 输出的 VIRT 值告诉了我们各个进程内存空间的大小(进程内存空间随着程序的执行会增大或者缩小)。你还可以通过

Linux内存分配机制

不羁岁月 提交于 2020-03-07 14:07:34
原文:https://blog.csdn.net/gfgdsg/article/details/42709943 Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,进行了如下分析: 一、Linux 虚拟地址空间如何分布? Linux 使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为: 1、只读段:该部分空间只能读,不可写;(包括:代码段、rodata 段(C常量字符串和#define定义的常量) ) 2、数据段:保存全局变量、静态变量的空间; 3、堆 :就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 4、文件映射区域 :如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。 5、栈:用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。 6、内核虚拟空间