- 博客(57)
- 收藏
- 关注
转载 内核 线程和进程的区别
前言:从内核的角度来说,它并没有线程这个概念。Linux把所有线程都当做进程来实现。内核并没有准备特别的调度算法或者定义特别的数据结构来表示线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一属于自己的task_struct,所以在内核中,它看起来就像是一个普通的进程(只是该进程和其他一些进程共享某些资源,如地址空间)一.内核线程1.内核经常需要在后台
2013-05-14 15:38:12
713
转载 频繁分配释放内存导致的性能问题的分析 --(附)malloc分配原理浅析 mmap关注焦点 如何优化分配内存
现象1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。 初步分析majflt代表major fault,中文名叫大错误,min
2013-05-09 09:25:21
1586
原创 函数说明
/*********************************************************************************/ *函数名称: SendRtuCmdToModBus() *功能介绍:发送ModBus RTU 指令到 Modbus Slave,加上CRC16校验码; *输入
2013-04-07 11:32:19
782
转载 Mathematica入门教程
Mathematica的基本语法特征 如果你是第一次使用Mathematica,那么以下几点请你一定牢牢记住:Mathematica中大写小写是有区别的,如Name、name、NAME等是不同的变量名或函数名。系统所提供的功能大部分以系统函数的形式给出,内部函数一般写全称,而且一定是以大写英文字母开头,如Sin[x],Conjugate[z]等。乘法即可以用*,又可以用空格表示,
2013-01-07 16:42:50
14655
转载 ioremap/remap_page_range
ioremap/remap_page_range作者:辛勤耕耘 来源:博客园 发布时间:2010-06-03 22:47 阅读:1244 次 原文链接 [收藏] [经典]Linux内核中ioremap映射的透彻理解// 300) { text = text + "\r\n\n本文来自CSDN博客,转载请标明出处:" + location.href; clipb
2012-08-03 10:53:05
945
转载 LCD和LCD控制器
一、LCD显示器1、LCD简介 LCD(Liquid Crystal Display),即液晶显示器,是一种采用液晶控制透光度技术来实现色彩的显示器,TFT(Thin FilmTransistor,薄膜晶体管)是目前最为主流的液晶显示类型; 2、LCD的接口 CPU或显卡发出的图像数据是TTL信号(0—5V,0—3.3V,0—2.5V,或0—1.8V)
2012-07-27 10:20:24
774
转载 浅谈I2C常见的问题
a.完全不能进行读写:(1) 通信协议不正确:有很多的I2C设备,并不支持所有的I2C协议,同时也不是一个比较标准的I2C设备;软件的通信时序不正确。(2)I2C设备地址不正确:有很多的I2C设备的地址是可以通过硬件设定的;也有器件资料提供的数据是错误的。(3)I2C通信线上没有加上拉电阻:由于I2C的从设备的SDA,SCL的PIN是输出开漏的,所以必须加上拉电阻,同时根据I2C设备的
2012-07-19 09:45:20
3165
转载 Mni2440 linux PWM 驱动代码修改支持 频率,占空比修改--XiaoLin.Peng
linux2.6.32.2下PWM驱动实例,友善之臂提供:// /linux2.6.32.2/drivers/char/mini2440_pwm.c#include #include #include #include #include #include #include #include #include #include #include #
2012-07-16 08:53:30
1960
转载 辞旧迎新重磅出击,教程之ucgui_向按钮发送一个按键消息的程序追踪
原发于www.ucgui.com @2007-7-4转帖请注明出处【献给初学者,若您是高手请不吝赐教,甚为感激!】把Msg的结构体写在最前面:typedef struct { int MsgId; /* type of message */ WM_HWIN hWin; /* Destination window */
2012-07-02 11:31:16
3352
原创 BUG: scheduling while atomic: swapper/0/0x00000100
BUG: scheduling while atomic: swapper/0/0x00000100 Modules linked in: iqs316
2012-07-02 11:17:45
6568
1
原创 异步通知程序编写方法
一、 初始化应用程序: signal(SIGIO, &input_handler); fcntl(fd, F_SETOWN, getpid()); oflags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, oflags | FASYNC)
2012-06-12 10:21:44
508
转载 POLL, SELECT & EPOLL 原理比较分析
因为需要了解底层设备访问的原理,所以惯用高层应用语言的我,需要了解一下Linux的设备访问机制,尤其是处理一组非阻塞IO的原理方法,标准的术语好像是叫多路复用。以下文章部分句子有引用之处,恕没有一一指出出处。 对于接触过Linux内核或设备驱动开发的读者,一定清楚poll和select系统调用,以及从2.5版本引入的epoll机制(epoll机制包含三个系统调用)。网上关于它们的文章,有说
2012-06-07 16:12:15
351
转载 free_irq调试一则
static int __init pinpad_init(void) { /* Eventually set up IT */ request_irq(KEYBOARD_IRQ, pinpad_interrupt, SA_INTERRUPT, pinpad_name, NULL); } static void __exit pin
2012-06-05 15:00:04
1106
转载 linux2.6.37 内核定时器使用--定时执行某函数
#include #include #include #include //jiffies在此头文件中定义 #include #include struct timer_list mytimer;//定义一个定时器void mytimer_ok(unsigned long arg){ printk("Mytimer is ok\n");
2012-06-04 11:03:57
1051
转载 内核延时函数和定时器
一内核延时函数: 1.短延时: void ndelay(unsignedlong nsecs);Void udelay(unsigned long usecs);Void mdelay(unsigned long msecs); 前面三个函数都属于忙等延时,对于毫秒级以上的延时,内核提供了下面三个函数(可睡眠):
2012-06-02 11:26:35
580
转载 source insight 快捷键
Ctrl+K 复制一行 Ctrl+Shift+K 恰好复制该位置右边的该行的字符 Ctrl+U 剪切一行 Ctrl + ; 剪切该位置右边的该行的字符Shift+F8 高亮显示指定标识,快速浏览标识的使用情况。Ctrl+F
2012-05-25 09:42:06
480
原创 linux2.6.32中断处理流程
1、当发生中断时,PC指针通过异常向量表跳转到中断入口函数asm_do_IRQasm_do_IRQ是中断的C语言总入口函数,它在/arch/arm/kernel/irq.c中定义,声明如下:asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)此函数中调用了generic_handle
2012-05-24 11:35:35
737
原创 Linux2.6.32.2 中断注册与注销处理函数流程
一、注册中断处理函数使用request_threaded_irq( )函数来处理,函数声明如下:int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, vo
2012-05-24 10:49:31
1434
原创 Linux2.6.37内核异常跳转流程
1、 trap_init函数(在arch/arm/kernel/traps.c中)将异常向量表复制到0xffff0000处。ARM架构的CPU异常向量基地址可以是0x00000000,也可以是0xffff0000,Linux内核使用后者。所以需要将异常向量表拷贝至0xffff0000处。void __init trap_init(void){unsigned long ve
2012-05-12 11:44:23
682
转载 自动创建设备结点
在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_cre
2012-05-04 11:42:57
589
转载 S3C2440 SDRAM内存驱动
++++++++++++++++++++++++++++++++++++++++++本文系本站原创,欢迎转载! 转载请注明出处:http://blog.csdn.net/mr_raptor/article/details/6555786++++++++++++++++++++++++++++++++++++++++++ SDRAM(Synchronous Dynamic R
2012-05-03 09:30:01
561
转载 ARM架构下LDR、STR、MOV和伪指令LDR指令理解
ARM是RISC结构,数据从RAM到CPU寄存器之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从RAM中某处读取到CPU寄存器中,只能使用ldr比如:ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在CPU寄存器之间移动数据,或者把立即数移动到CPU寄存器中,这个和x86这种C
2012-05-02 11:33:55
3240
转载 LDR、STR、MOV和伪指令LDR指令理解
ARM是RISC结构,数据从RAM到CPU寄存器之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 比如想把数据从RAM中某处读取到CPU寄存器中,只能使用ldr比如:ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在CPU寄存器之间移动数据,或者把立即数移动到CPU寄存器中,这个和x86
2012-05-02 11:20:01
485
转载 并行与并发理解
“并行”是指无论从微观还是宏观,二者都是一起执行的。就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。从宏观外来看,好像是这些进程都在执行。这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。从以上本质不难看出,“并发”执行,在多个进程
2012-04-19 10:59:24
685
转载 安装交叉调试器gdb,编译出错cc1: warnings being treated as errors
安装交叉调试器ARM-GDB(解决cc1: warnings being treated as errors)1,下载GDB源码包并解压;2,./configure --target=arm-linux --prefix=/opt/arm-gdb配置--target和--prefix,指定目标板体系结构和安装路径;3,make我使用的GCC版本是4.3.3,在编译过程中报错:
2012-04-16 15:33:29
8738
转载 搭建交叉调试环境arm-linux-gdb与gdbserver
操作系统:Ubuntu9.04开发板:博创2410s交叉编译工具:arm-linux-gcc-4.1.1gdb+gdbserver 是调试目标板的常用方法.网络环境如下:HOST 192.168.1.123 Target: 192.168.1.21NFS共享目录: mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.16
2012-04-16 15:28:26
603
转载 #error预处理
编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。下面举个例子:程序中往往有很多的预处理指令#ifdef XXX...#else...#endif 当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时
2012-04-13 17:21:33
329
原创 应用程序调用驱动中的write方法失败
今天在改驱动时,遇到个问题:应用程序中使用系统调用函数write,调用驱动中的write方法,返回值一直是 -1 ,驱动中的方法也未被调用。最终发现问题根源:应用程序中 fd = open("/dev/***", 0);其中的文件打开方式为0, 表示是O_RDONLY方式,此时无法进行write操作。
2012-04-10 16:17:53
766
转载 内核里面writel是如何实现的
在邮件列表里讨论了一下writel是如何实现的,这个函数实现在操作系统层,有内存保护的情况下,往一个寄存器或者内存地址写一个数据。 在arch/alpha/kernel/io.c中有188 void writel(u32 b, volatile void __iomem *addr)189 {190 __raw_writel(b, addr);191 m
2012-04-06 10:59:28
597
转载 系统初始化函数集(subsys_initcall)和初始化段应用
前言:前段时间做一个项目需要设计一个动态库,并希望在加载库的同时自动执行一些初始化动作,于是联想到了linux内核众子系统的初始化,于是研究之,并在过这程中发现了初始化段的存在,利用初始化段实现了该功能。工作一年,笔记积累多了,慢慢变得杂乱无章,于是开博,一方面整理笔记,梳理知识,另一方面和大家交流,共同进步。keyword:subsys_initcall, init, init_call
2012-04-06 10:36:25
317
转载 驱动案例三:platform按键驱动(三、应用程序)
app-button.c#include #include #include #include #include #include #include #include #include #include int main(void){ int buttons_fd; int key_value; buttons_fd = open("/d
2012-04-01 17:21:31
327
原创 驱动案例三:platform按键驱动(二、驱动)
plat_buttondriver.c#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
2012-04-01 17:19:27
479
原创 驱动案例三:platform按键驱动(一、设备)
plat_device.c#include #include #include #include #include #include #include #include #include static struct resource s3c_buttons_resource[] = { [0]={ .start = S3C24XX_PA_GP
2012-04-01 17:09:36
396
转载 s3c2410_gpio_cfgpin函数解析
函数原型:s3c2410_gpio_cfgpin(unsigned int pin,unsigned int function)位置:/linux-2.6.32.2/arch/arm/plat-s3c24xx/gpio.c函数内容:void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
2012-04-01 16:56:36
422
转载 驱动案例二:mini2440 LED驱动 (用封装函数 s3c2410_gpio_*** 访问CPU寄存器;混杂设备驱动)
memdev.h#ifndef _MEMDEV_H_#define _MEMDEV_H_#include #define MEMDEV_IOC_MAGIC 'k'#define MEMDEV_IOCON _IO(MEMDEV_IOC_MAGIC, 1)#define MEMDEV_IOCOFF _IO(MEMDEV_IOC_MAGIC, 2)#define MEM
2012-04-01 16:36:30
424
转载 IO端口和IO内存
在驱动程序编写过程中,很少会注意到IO Port和IO Mem的区别。虽然使用一些不符合规范的代码可以达到最终目的,这是极其不推荐使用的。结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。1. CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编
2012-03-31 15:14:06
302
转载 驱动案例一:mini2440 LED驱动 (用ioremap实现访问CPU寄存器)
I/O 内存访问流程:1. request_mem_region() 申请IO内存2.ioremap() 将物理地址映射到虚拟地址3.ioread8() 、ioread16()、ioread32()、iowrite8()、iowrite16()、iowrite32() 读写4.iounmap() 释放虚拟内存5.release_mem_region() 释放IO内存注意:
2012-03-31 11:13:18
646
转载 *restrict 功能
restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样
2012-03-29 08:38:20
608
原创 sysfs: cannot create duplicate filename '/devices/virtual/misc/leds'问题处理
在mini2440平台下加载LED驱动模块出现以下错误:[root@FriendlyARM 5-3-2]# insmod mini2440_leds_misc.ko WARNING: at fs/sysfs/dir.c:491 sysfs_add_one+0x88/0xb0()sysfs: cannot create duplicate filename '/devices/virt
2012-03-28 11:17:22
7772
3
转载 建立内核模块编译环境
驱动开发使用的是mini2440的开发板,linux内核版本为linux-2.6.32.2首先解压linux源码,拷贝配置文件cp -f config_mini2440_w35 .config (否则会出现version magic '2.6.30.4 mod_unload modversions ARMv5 ' should be '2.6.30'的版本错误)Make cle
2012-03-27 17:39:14
805
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人