摘要: 定义有三种method,stm32f4采用的是第三种:将当前中断的状态标志保存在一个局部变量cpu_sr中,然后再关闭中断。cpu_sr是一个局部变量,存在于所有需要关中断的函数中。注意到,在使用了该宏的所有函数中都定义了cpu_sr,也就是说在用户自己定义的应用程序中需要是用该宏时也有必要定义这样一个局部边变量。OS_CPU_SR_Save MRS R0,PRIMASK;读取PRIMASK到R0 CPSID I ;PRIMASK=1,关中断 ... 阅读全文
posted @ 2013-10-31 20:25 ideawu 阅读(886) 评论(0) 推荐(0) 编辑
摘要: 从文件角度来看core_cm4.h和stm32f4xx.h分别从内核寄存器和外设寄存器来定义其地址和结构体,是用c语言访问硬件必须的文件,所以这两个文件不论是否带操作系统,都是必须包含进工程的。reset_handler这个中断处理函数首先会设置一下FPU,然后跳转到systeminit进行初始化,然后跳转至main函数。main函数在自己定义的main.c当中,完成BSP初始化,操作系统初始化,创建任务以及开始运行操作系统。BSP初始化中包含的有systeminit,systick_init,GPIO配置,systick_init启动心跳时钟。进入操作系统初始化后,就基本跟硬件操作无关了,基 阅读全文
posted @ 2013-10-31 16:29 ideawu 阅读(5858) 评论(0) 推荐(0) 编辑
摘要: 虚拟内存,就是用磁盘作为介质,暂时性存储数据,和主存进行换入换出,使程序能够使用更多的内存。虚拟内存是单位是页,固定大小的数据方便数据的交换。如果一个应用程序要访问某段内存,通过MMU得到相应的页号,然后就去主存中去寻找相应的页,如果该页被换到了磁盘上,就会发生一个缺页,然后内核就会从磁盘上将需要的页换入主存,然后进行访问。还有一个问题就是内核空间和用户空间的数据交换,由于用户空间的数据是可以换入到磁盘上的,而内核数据永远是放在主存上的,所以如果内核访问用户数据时可能该地址的数据并不在主存中,所以要使用copytousr和copyfromusr这种机制来完成处理。虚拟地址空间,空间个人理解就是 阅读全文
posted @ 2013-07-22 10:26 ideawu 阅读(2199) 评论(0) 推荐(1) 编辑
摘要: 学*了将*半个月的设备驱动程序的编写,也有一些体会,这里写下来也给学*做一个总结,为后面的学*做更好的准备。首先,个人感觉驱动程序的设计是很有套路的,最基本的要求就是要掌握这些套路。所谓的套路就是一个比较标准的流程,更具体一点就是某个函数是什么时候调用,函数的作用等。这些函数都是内核提供好了的。还有一点要注意,就是写驱动程序虽说是内核编程,但是不应该过分去了解内核的相关知识,否则目标就会转移,而不是停留在我们最根本的驱动程序的学*上了。其次,就是对驱动类型的一些看法,由于块设备和套节字还没有学*到,所以认识还不够全面。到现在为止,我看到过的套路有四个,字符设备,混杂设备,总线设备驱动,plat 阅读全文
posted @ 2013-07-15 10:05 ideawu 阅读(336) 评论(0) 推荐(0) 编辑
摘要: 首先,个人感觉设备驱动程序与应用程序中的文件操作隔得有点远,用户空间不论是直接使用系统调用还是库函数都是通过系统调用的接口进入内核空间代码的。但是看过一个博客的分析整个过程,感觉中间层太过麻烦,必须经过虚拟文件系统才能真正到达驱动部分,对与我这个新手来说确实读不了整个过程的代码,没办法真正理解真个过程的明细。所以就从表面上看看系统调用跟驱动程序是怎样连接起来的。就拿LDD3上面用内存模拟字符设备的例子来理解。首先我们要动态分配一个可用的设备号,这个设备号包括主设备和从设备号。(假定是250.0,250是主,0是从,运气不好总是分到250凸-。-凸)设备号是绑定很多东西的纽带。在得到设备号之后, 阅读全文
posted @ 2013-07-04 00:02 ideawu 阅读(363) 评论(0) 推荐(0) 编辑
摘要: 在进行阶乘计算中,如果计算结果过大,结果就会超出系统定义的整型的范围,为了能够表示这样数值过于大的数,我们采用数组进行表示,数组中的每一个元素用来表示数字中的每一个位,进行阶乘计算时,我们将每一位乘以当前要计算的n!中的n,由低到高位像乘法计算一样进行进位。最终得出结果。具体代码贴出如下:#include<stdio.h>int main(){ int DATA[40];//we use 40 digits to express our number int m; for(m=1;m<40;m++) DATA[m]=0; DATA[0]=1; DATA[1]=1; int d 阅读全文
posted @ 2013-03-14 21:19 ideawu 阅读(272) 评论(0) 推荐(0) 编辑
摘要: const int max =100;int Array[max];这段语句在c编译器下会报错,原因就是max仍然是变量,而在c++编译器下不会报错。const在修饰指针变量时,会造成const是修饰指针还是修饰指针指向的对象这个混淆,按照c语言深度解剖中的说法,就是忽略类型名,观察const后面是指针还是变量。从而确定哪个是只读变量。 阅读全文
posted @ 2013-03-06 11:22 ideawu 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 注意#define PCHAR char*PCHAR p3,p4;仅仅做一个替换p4不是指针而是一个字符typedef char* pchar;pchar p1,p2;p1,p2都是指针 阅读全文
posted @ 2013-03-05 21:33 ideawu 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 由于子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 那么会不会因为父进程太忙来不及wait子进程,或者说不知道 子进程什么时候结束,而丢失子进程结束时的状态信息呢? 不会。因为UNⅨ提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time 阅读全文
posted @ 2013-03-04 22:45 ideawu 阅读(196) 评论(0) 推荐(0) 编辑
摘要: c/c++中main函数的输入参数有int argc和char* argv,这两个参数的用法在命令行启动程序时才能体现价值。比如ls -l这条语句,“ls”和“-l”都是这个main函数的输入,我们可以根据main函数的输入参数检测一些程序的配置等功能。对于配置选项按照标准是以‘-’开头后面紧接单个字母作为选项的字符串。 阅读全文
posted @ 2013-03-03 10:15 ideawu 阅读(199) 评论(0) 推荐(0) 编辑