- 博客(482)
- 资源 (12)
- 收藏
- 关注
原创 不可重入函数总结
1.malloc,free, printf均是不可重入函数(意味不能在中断函数或信号处理函数同时调用),但是线程安全函数(意味它可以被多个线程调用)2.函数有static变量,则该函数是不可重入函数满足下面条件之一的多数是不可重入函数:(1)使用了静态数据结构;(2)调用了malloc或free;(3)调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全
2016-04-11 12:59:55 5886
转载 Linux平台Cpu使用率的计算
proc文件系统/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。/proc目录中有一些以数字
2016-04-07 13:34:44 6186
转载 linux C内存泄露检测实现及内存泄露检测的一般方法
学习,以后对vxworks和linux搞一套通用的,这样同事就方便了!linux中,由于使用malloc或alloc而没有free掉申请的内存,就会造成内存的泄露。通常,来讲为了避免内存泄露的情况出现,一般要求,我们尽量的malloc之后,调用free。但是总会有忘记free的时候啊。一般可以有如下几种方式来避免内存泄露:1) 使用智能指针,这个在C++中较为常见;
2016-03-26 14:46:22 4256
转载 inet_ntoa函数陷阱
今天编程时遇到一个很诡异的问题,是关于inet_ntoa函数的。先看一个测试程序#include stdio.h>#include sys/socket.h>#include netinet/in.h>#include arpa/inet.h>#include string.h>int main(int argc, char* argv[])
2016-03-24 18:17:31 4212
转载 S3C2440开发板LED驱动——ioremap 映射
刚开始学字符设备驱动,感觉最难的是驱动和底层硬件的连接。linux上的驱动程序,是基于操作系统之上的,他并不直接和底层的硬件打交道,但是我们写的驱动必须能使硬件“跑”起来,即与硬件紧密相连。就拿最简单的LED驱动来说,我们的驱动程序是在虚拟的内存上面跑的,但是最终,LED的点亮还是必须靠GPIO管脚的高低电平来控制。那么,我们的虚拟的内存怎么才能和实际的硬件上面的寄存器对应起来呢?
2016-03-23 22:00:36 1732
转载 Linux设备驱动之Ioctl控制
大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力。 一、在用户空间,使用ioctl系统调用来控制设备,原型如下:int ioctl(int fd,unsigned long cmd,...);/*fd:文件描述符cmd:控制命令...:可选参数:插入*argp,具体内容依赖于cmd*/ 用户程序所作的只是通过命令码告诉驱动程序它想做什么,
2016-03-23 21:55:18 1132
转载 /dev/mtd和/dev/mtdblock的区别
这里对于mtd和mtdblock设备的使用场景进行简单总结:mtd-utils工具只能应用与/dev/mtdN的MTD字符设备mount、umount命令只对/dev/mtdblockN的MTD块设备有效/dev/mtdN和/dev/mtdblockN是同一个MTD设备的同一个分区(N一样)一个MTD原始设备可以通过mtd_part分割成数个MTD原始设备注册进 mtd_t
2016-03-11 12:52:43 3875
转载 mdev的使用方法和原理以及实现U盘或SD卡的自动挂载
udev实现U盘或SD卡的自动挂载,在这里我们再说一下怎样用mdev实现这个功能。mdev的使用在busybox中的mdev.txt文档已经将得很详细了。 mdev是busybox中的一个udev管理程序的一个精简版,他也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异,在发生热插拔时间的时候,mdev是被hotplug直接调用,这时mdev通过环境变量中的
2016-03-10 09:29:00 2749
转载 Linux设备驱动之mmap设备操作
1.mmap系统调用void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);功能:负责把文件内容映射到进程的虚拟地址空间,通过对这段内存的读取和修改来实现对文件的读取和修改,而不需要再调用read和write;参数:addr:映射的起始地址,设为NULL由系统指定;len
2016-03-09 09:21:39 1020
转载 Linux内核驱动自动创建设备节点文件
Linux下生成驱动设备节点文件的方法有3个:1、手动mknod;2、利用devfs;3、利用udev在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点。在2.6.17以前,在/dev目录下生成设备文件很容易,
2016-03-06 08:28:51 5676
转载 Linux系统对IO内存和IO端口的管理
CPU地址空间(一)地址的概念1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 (如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。 物理地址空间,一部分给物理RAM(内存)用,一部分给总线用,这是由硬件设计来
2016-03-04 08:43:32 1437 1
转载 Linux下/dev/mem和/dev/kmem及操作gpio实例
目前我所知道的在linux下操作GPIO有两种方法: 1. 编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据ioctl命令进行GPIO寄存器的读写,并把结果回送到应用层。这里提供一点程序片断供大家参考:[cpp] view plain copy
2016-03-04 08:36:27 1896
转载 Device Tree常用方法解析
Device Tree常用方法解析Device Tree在Linux内核驱动中的使用源于2011年3月17日Linus Torvalds在ARM Linux邮件列表中的一封邮件,他宣称“this whole ARM thing is a f*cking pain in the ass”,并提倡学习PowerPC等其他架构已经成熟使用的Device Tree技术。自此,Device Tree
2016-03-04 08:34:21 926
转载 双网卡在同一网段的解决办法
1.动态路由/静态路由动态路由路由选择器自动共享路由信息自动构造路由表,需要一个路由协议,如RIP或OSPF静态路由路由选择器不共享路由信息(单方向路由)手工构造路由表2.直连路由/网关路由(间接路由)其区别在于,发往直连路由的设备中不但具有指明目的端的I P地址,还具有其mac地址。当报文被发往一个间接路由时,I P地址指明
2016-01-19 15:21:09 29407 3
转载 路由表详解
路由表。 使用ipconfig /all命令查看路由表信息,如下图:3. :活动的路由Network destination :网关,又称下一跳路由器。在发送IP:跳数,跳数用于指出路由的成本,通常情况下代表到达目标地址所需要经过的跳跃数量,一个跳数代表经过一个路由器。跳数越低,代表路由成本越低,优先级越高。Persistent Routes当系统接收到一个目的地址不在路由
2016-01-16 15:08:13 61813
转载 跨网段的ping过程
引用﹏、止 的 跨网段ping的过程192.168.1.1跨网段ping 192.168.2.1拓扑如下:过程:1.首先PC1观察目的IP:192.168.2.1与本机IP:192.168.1.1是否在同一个网段2.发现不在,因此看本机是否设置了网关,如果没有设置网关,目的不可达;发现设置了网关:192.168.1.254,于是执
2016-01-16 13:58:58 15329
转载 交换机上的三种端口模式
补充知识PVID和VID区别PVID英文解释为Port-base VLAN ID,是基于端口的VLAN ID,一个端口可以属于多个vlan,但是只能有一个PVID,收到一个不带tag头的数据包时,会打上PVID所表示的vlan号。VID(VLAN ID)是VLAN的标识,定义其中的端口可以接收发自这个VLAN的包,一个端口可以接收多个不同VID的包,即属于多个VL...
2016-01-10 22:27:27 19756
转载 /proc/pid/stat字段说明
可以通过查看/usr/src/linux/Documentation/filesystems/proc.txt文件来获得更多的信息[root@localhost ~]# cat /proc/6873/stat6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654
2016-01-04 16:25:43 19945
转载 Linux下进程信息的深入分析
这里我们主要介绍进程的状态,进程的状态可以通过/proc/PID/status来查看,也可以通过/proc/PID/stat来查看.如果说到工具大家用的最多的ps也可以看到进程的信息.这里我们通过/proc/PID/status来分析进程的信息.在2.6.18之后的内核,多了capibilty/cpusets等信息.查看进程状态信息如下:more sta
2015-12-29 12:23:29 8708
转载 virtualbox三种网络连接方式
virtualbox 三种网络连接方式的学习2010-05-15 11:23三种网络连接方式 Host-only: ----可以用wireshark抓虚拟机和主机之间的网络包三种网络方式 BRIDGED: bridge就是“桥”的意思,说起桥接,就不能不说局域网。比如我们有两个局域网络,他们的ip段都处于192.168.0.*,同时,我们希望把这两个网络链接起来,这中
2015-12-01 20:13:34 2396
原创 linux小知识
1.linux 包含 # include ------ vxworks #include 2.linux 保护 include ------vxworks没有 struct timeval{time_t tv_sec; /* Seconds. */time_t tv_usec; /* Microseconds. */};gettimeofday
2015-12-01 20:07:33 901
转载 vxworks下辅助时钟aux clk的使用示例
vxworks下aux clock的使用示例:利用辅助时钟进行对某些函数运行时间进行精确计时。1. vxworks映像中包含辅助时钟,包含组件hardware->peripherals->clocks->AUX clock,并将参数 AUX_CLK_RATE_MAX改大点,默认只有5000的。2. 程序中使用,比如要记录某个函数的执行时间,函数假设为为test(),示例:int g
2015-11-07 11:33:13 3293
转载 VxWorks下使用双向链表lstLib的小例子
#include #include #include typedef struct _Queue{ NODE * next; NODE * prev; int age; char name[255];} QUEUE;LIST list;void TestList(){ QUEUE *p; int i
2015-09-24 15:49:35 2095
转载 变参宏
宏中"#"和"##"的用法#的功能是将其后面的宏参数进行字符串化操作(Stringfication)。##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。#define debug(arg…) printf(arg)但是,如果变参的个数为0, compiler will co
2015-09-10 16:14:35 1076
原创 运放在开关电源的补偿电路--自控原理要熟悉!!!
求运放的传递函数时它的参考电压要忽略,假设为0。因为传递函数是小信号的交流量来说的,参考是直流量。因此传递函数G (s) =-Z1/Z2 Z1=(1/SC3)//(1/SC1+R2); Z2=R1//(1/SC2+R3)
2015-01-15 11:24:50 6424
转载 什么是准双向口,双向口?
C51的说明书上说:”Because Ports 1, 2, and 3 have fixed internal pullups, they are sometimes called quasi-bidirectionalports. When configured as inputs, they pull high and source current (IIL) when external
2014-10-29 11:16:08 41523 4
原创 linux 循环双链表(list.h)
最近看linux 链表,网上很多代码的讲解,总有点知其然不知其所以然的感觉,我看了下有点自己想法,特记录如下:我们之前学习双链表结构体一般如下typedef struct __Node{ int data; 数据 struct __Node *pre; 指向前一个结点指针 struct __Node *next; 指向下一个结点指针
2014-07-01 15:47:22 1496
原创 环形队列串口(收)应用
void CommISR(void) interrupt 4{ if (RI0) { RI0=0; CommRecBuffer[CommRecBufferTail]=SBUF0; //receive data CommRecBufferTail++; if (CommRecBufferTail==DB_RE
2014-04-04 12:00:57 6521
转载 电荷泵(charge pump)原理
电荷泵的基本原理电荷泵的基本原理是给电容充电,把电容从充电电路取下以隔离充进的电荷,然后连接到另一个电路上,传递刚才隔离的电荷。我们形象地把这个传递电荷的电容看成是“装了电子的水桶”。从一个大水箱把这个桶接满,关闭龙头,然后把桶里的水倒进一个大水箱[8]。电荷泵也称为开关电容式电压变换器,是一种利用所谓的“快速”或“泵送”电容,而非电感或变压器来储能的DC-DC变换器(直流变换器)。它们能使输
2014-03-26 10:46:34 78045 2
原创 环形队列串口(发)应用
环形缓冲区的实现原理:环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读用户仅仅会影响读指针,而写用户仅仅会影响写指针。如果仅仅有一个读用户和一个写用户,那么不需要添加互斥保护机制就可以保证数据的正确性在设计串口驱动的过程中,要遵循
2014-03-20 14:38:07 9157 1
原创 vxworks的堆和栈
vxworks的堆和栈区别系统内存池系统内存池用于动态内存的分配(如malloc())、任务的堆栈和控制块及VxWorks运行时需要的内存。这部分内存有VxWorks管理,开销位于目标板上。系统内存池在系统启动时初始化,它的大小是整个内存减去其他区的大小。在启动后可以通过函数memAddToPool()向系统内存池中增加内存。SysMemTop()返回系统内存池(System
2013-12-29 16:38:51 8046
原创 NOR NAND FLASH编程
NandFlash的数据是以bit 的方式保存在memory cell里的,一般来说,一个cell 中只能存储一个bit,这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line
2013-12-20 10:08:51 1821 1
转载 Vxworks下flash驱动编写流程 .
作为BSP开发人员,我们要实现的是MTD和socket两块,其它的是由文件系统自己守成的。 MTD层 该层提供Flash 设备识别,读写,擦除,地址映射函数的具体实现。该层实现由 Flash 驱动开发人员完成。该层将实现在BSP 下tffsConfig.c 以及 tffsXXX.c 文件中。其中tffsConfig.c定义有MTD 层一个重要的数组mtdTable,该数组中保存了
2013-11-30 23:27:56 3807
原创 运放二阶滤波电路
二阶滤波电路有两种结构: Sallen-key和多路反馈(KFB)MFB型滤波器的基本电路如下图所示。该电路有两条负反馈支路,并且运算放大器是作为一个无限增益器件来反馈支路,并且运算放大器是作为一个无限增益器来使用的,所以称为无限增益多端反馈电路高通滤波: 把低通滤波的电阻用电容代替,再把滤波器的电容用电阻代替,就可以产生高通滤波基本
2013-11-25 11:43:10 31120
转载 过采样技术原理介绍
过采样技术原理介绍假定环境条件: 10位ADC最小分辨电压1LSB 为 1mv 假定没有噪声引入的时候, ADC采样上的电压真实反映输入的电压, 那么小于1mv的话,如ADC在0.5mv是数据输出为0 我们现在用4倍过采样来, 提高1位的分辨率, 当我们引入较大幅值的白噪声: 1.2mv振幅(大于1LSB), 并在白噪声的不断变化的情况下, 多次采样, 那么我们得到的结果有
2013-11-23 21:57:27 12698 3
转载 全差分运放
全差分运放:有两个输出(差分)的运放叫全差分运放。电路的两个输出电压是幅度相等而级性相反的(以电路的共模参考点为参考)差分信号比单端信号拥有更强的抗噪声能力,所以在高速数字电路和高精度ADC应用中均是采用了差分信号。与普通运放不同的是它多了一个OCM pin,即output common mode voltage pin,用于设置输出共模电压的电平。全差分放大器使用时还
2013-11-14 14:34:40 10771
转载 CRC校验原理
模2除法:与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。 1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1
2013-11-04 13:45:22 1713
转载 1-wire协议
作为一种单主机多从机的总线系统,在一条1-Wire总线上可挂接的从器件数量几乎不受限制。为了不逻辑上的冲突,所有从器件的1-Wire总线接口都是漏极开路的,因此在使用时必须对总线外加上拉电阻(一般取5kΩ 左右)。主机对1-Wire总线的基本操作分为复位、读和写三种,其中所有的读写操作均为低位在前高位在后。复位、读和写是1-Wire总线通信的基础,下面通过具体程序详细介绍这3种操作的时序要求。(程
2013-11-04 13:27:33 5825
TCP-IP详解卷2(17-23)
2009-05-10
TCP-IP详解卷2(1-16)
2009-05-10
TCP-IP详解卷3
2009-05-10
TCP-IP详解卷1
2009-05-10
非常完善TCPIP协议栈源码,写的不错!包括一个ARM上的移植
2009-05-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人