- 博客(50)
- 资源 (6)
- 收藏
- 关注
原创 IMX6Q的DDR3初始化配置
处理器:IMX6Q5EYM10ADDDR3:NT5CB128M16BP-CG 16位1333MHz数据频率相比于Exynos4412的内存,飞思卡尔IMX6的内存比较麻烦,耗费了比较多的时间调试才稳定,当然这也是因为我无缘无故改掉了内存拓扑结构和换了内存芯片型号的原因。硬件设计参照天嵌的E9设计,设计之初没有对照飞思卡尔提供的硬件设计方案,飞思卡尔的方案里提供了TOP和在6层板上使用了
2015-04-20 16:39:32 17932 3
原创 Exynos4412 DMA驱动
尽管在内核上Linux3.0.15和Linux3.8.10在关于DMA运行机制部分没什么变化,但芯片生产商三星写出来的驱动接口却发生了比较大的变化,这样导致我在Linux3.0.15上写出来的DMA驱动,在Linux3.8.10上完全运行不了,所以下面讲一讲在Linux3.8内核中写DMA驱动的一般性步骤,这一部分在Documentation/Dmaengine.txt文件里有讲到。在Linu
2013-11-08 17:23:42 8793 1
原创 skb_buf结构分析
转载请注明出处:http://blog.csdn.net/qq405180763/article/details/8797236 实际上skb_buf结构只是一块已经申请好的套接字缓冲区的指针和属性数据的描述集合,netdev_alloc_skb函数申请到一块套接字缓冲区后,返回记录这块缓冲区信息的skb_buf结构,在各个网络层传输的只是skb_buf结构,换句话说,仅仅是
2013-04-13 17:13:45 7023
原创 AM3730 GPMC总线与FPGA通信
GPMC与FPGA通信转载请注明出处:http://blog.csdn.net/qq405180763/article/details/7616941最近这一两个月研究AM3730的GPMC与FPGA的通信,我负责的主要是涉及到GPMC这一块,由于之前就没有Linux基础,刚开始的时候进展很慢,还时不时的面临来自外界的压力,所以那会很痛苦。前一个月用来熟悉Linux和摸清一个方向,摸清GP
2012-05-30 23:12:07 21759 10
转载 浅谈电路设计中应用DDR3处理缓存问题
DDR系列SDRAM存储芯片的高速率、高集成度和低成本使其理所当然成为存储芯片中的一霸。在PC和消费电子领域自是如此,它被称为“主存”。其实,随着通信设备价格战愈演愈烈,在看起来水有点深的通信设备上,DDR系列存储芯片(当前主流是DDR3 SDRAM)也成为首选。很多网络处理芯片都需要配套的存储芯片来进行数据的缓存。比如流量管理芯片(Traffic Management)在决定允许哪个数据包通
2015-01-09 17:43:17 2393
原创 DDR布线要求及拓扑结构分析
在DDR的PCB设计中,一般需要考虑等长和拓扑结构。等长比较好处理,给出一定的等长精度通常是PCB设计师是能够完成的。但对于不同的速率的DDR,选择合适的拓扑结构非常关键,在DDR布线中经常使用的T型拓扑结构和菊花链拓扑结构,下面主要介绍这两种拓扑结构的区别和注意要点。T型拓扑结构,也称为星型拓扑结构,其结构如图一所示。星型拓扑结构每个分支的接收端负载和走线长度尽量保持一致,这就保证了每个分支
2014-12-06 18:58:49 21398 2
原创 信号的上升沿与周期(高速信号与高频信号)
在硬件设计中经常需要对频率比较高的信号进行特殊照顾,比如DDR3内存的频率经常能达到1GHz以上,PCB布线的时候通常要考虑到信号完整性的问题,做阻抗匹配和严格的拓扑结构,但实际分析信号完整性的时候,我们的研究对象是信号的上升沿时间,在数字信号中上升沿和信号频率没有必然联系,所以归根结底我们对高频信号的特殊照顾,都是从其上升沿时间的角度出发的,也就是说上升沿时间短的高速信号是我们在硬件设计中需要特
2014-11-23 21:25:48 23043
原创 C语言反转二进制数据位
用异或的方式实现对一个数据某一位反转,某一位与1异或的时候刚好发生反转,与0异或的时候不变。将某一数据的第n位反转方法:val = val ^ ( 1
2014-09-14 19:13:18 4106
原创 a++和++a左值问题
a++和++a,前缀和后缀哪一个可以作为左值,这个问题让我忙活了很久,终于有了些许突破。a++和++a在做左值的时候有不同,那么左值它首先必须是有特定地址的才能作为左值,否则赋值就没有具体对象。再看看a++和++a。a++的意思是先复制一份临时数据出来参与周边环境的运算,再自加变量a,可见a++用来参与运算的是一份复制出来的临时数据,这个数据是临时存在而没有固定地址的,不是一个真正的变量。++
2014-09-13 17:25:37 2205
转载 函数返回值传递
出自《程序员的自我修养-链接、装载与库》P299eax是函数传递返回值的一个通道。1.对于小于4个字节的数据函数将返回值存储在eax中。2.5~8个字节对象的情况调用惯例都是采用eax和edx的联合返回方式进行。3.大于8个字节的返回类型,用一下代码测试: 1 typedef struct big_thing 2 { 3 char buf[1
2014-09-13 17:02:58 1041
转载 ARM寄存器(R13/R14/R15)
一、ARM工作状态下的寄存器组织ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个位状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC(即R15)、一个状态寄存器都是可访问的。通用寄存器通用寄存器包括R0~R15,可以分为3类:(1)未分组寄存
2014-09-11 10:17:39 37962
原创 MMU(TLB)与Cache的工作方式
MMU是内存管理单元,该单元通常是属于处理器的硬件,用于从虚拟地址到物理地址的映射。在典型的二级页表内存管理的系统中,映射过程为:系统为MMU依次准备好页目录表地址,页表地质,MMU通过虚拟地址的各个段作为索引寻找到物理页面地址,与页内偏移地址一起构成最终物理地址。从上可见,从MMU映射获得最终数据,需要访问三次内存(页目录表,页表,取数据),在分页级别更高的系统中,访问一次数据要更多的内
2014-09-09 16:40:00 6713 1
原创 屏蔽内核启动打印信息
最近做的4412板子终于经过测试形成产品,在这之前需要把内核启动过程中的打印信息去掉,并且更换启动LOGO,下面讲讲自己去掉打印信息的过程。去掉打印信息方法很多,我使用一个相对比较简单的,就是将下面选项的[*]去掉Device Drivers ---> Character devices --->[* ] Support for console on virtual t
2014-09-07 11:03:21 6733
转载 二叉树基本操作的程序实现
//Bintree.h#include#includetypedef struct Binnode{//二叉树结点结构体 char data; struct Binnode *lchild; struct Binnode *rchild; };typedef Binnode *Bintree ;typedef struct stack{
2014-08-30 15:44:26 1334
转载 堆和栈的区别
此文章虽然是面向C/C++程序员写得,但是对咱们Java程序员还是很有帮助的。 堆和栈的区别 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序
2014-08-27 16:26:08 556
转载 VMware读盘失败
打开VMware出现Cannot open the disk *.vmdk or one of the snapshot disks it depends on.Reason: Failed to lock the file.错误的解决办法! 今天我公司做的虚拟化服务器出现故障意外重启了,主系统启动之后,在启动VMware虚拟机的时候出现了Cannot open the
2014-07-23 09:24:46 3260
原创 linux物理地址的静态映射
早先看linux驱动相关书籍的时候,隐约记得物理地址有动态映射和静态映射,当时写驱动都是想着自己动手写,所以一上手看着动态映射好用,就在自己的驱动上使用动态映射,将寄存器地址映射到内存上,即调用ioremap函数。在单线作战的时候ioremap确实好用,不需要改动内核的其他部分,直接将自己想用的物理地址映射到内存再操作。但很多时候当我们的设备需要在全局范围内被使用的时候,ioremap就会比较尴尬
2014-07-09 16:40:44 2105
转载 MMU分析
一、MMU是什么? MMU,英文名称为Memory Manage Unit, 中文可以为“内存管理单元”,或者“存储器管理单元”。MMU是硬件设备,它与virtual memory是紧密联系在一起的。 看一下s3c2410 datasheet Appendix 1中关于ARM920T的介绍(因为s3c2410采用的是ARM920T的处理器)。对ARM
2014-06-18 10:03:52 1026
转载 linux内存管理--linux内核高端内存
Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。段页式机制如下图。 Linux内核地址空间划分通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。
2014-06-17 11:22:10 887
转载 CPU的哈佛结构和冯诺依曼结构
在现实世界中很少有非常纯粹的概念,特别是在实际的应用里。教科书里的大多是理想化的模型,便于掌握某个概念的重点和本质,但实际中很难达到这种理想化的状态。哈佛结构和冯诺依曼结构主要区别在是否区分指令与数据。在教科书里这是两种截然不同的做法。实际上在内存里,指令和数据是在一起的。而在CPU内的缓存中,还是会区分指令缓存和数据缓存,最终执行的时候,指令和数据是从两个不同的地方出来的。你可以
2014-06-17 10:02:19 7295
原创 TOP CPU占用率原理及与实时线程的冲突
linux下通过top或vmstat查看系统CPU占用率,在大多数情况下测得的CPU占用率是准确的,但在时间精度较高的实时linux系统中,top测量的CPU占用率可能会不准确,下面结合top原理和实时linux实例分析在实时系统中top的使用情况。统计CPU占用率的时候,大致统计以下几个时间:用户时间(User time) 用户时间(User time) 用户时间
2014-06-13 17:14:57 5271 2
转载 深入浅出进程与线程的基本概念
深入浅出进程与线程的基本概念进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握.最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定工厂的电力有限,一次只能供给一个车间使用.也
2014-04-23 11:05:28 1059 1
转载 Linux启动参数及实现 __setup与early_param
#define __setup_param(str, unique_id, fn, early) / static char __setup_str_##unique_id[] __initdata = str; / static struct obs_kernel_param __setup_##unique_id / __
2014-04-18 17:06:21 992
原创 linux优先级浅析
最近在优化RTlinux的实时APP,在各种资料之间查找关于linux优先级的相关资料,终于对linux进程优先级有一些了解。首先在linux中优先级级别只有0-139这140个级别,这是固定的,数字越小优先级别越高,所以优先级为0的进程具有最高优先级。linux进程分为实时进程和非实时进程,这140个优先级中,linux把0-99分配给实时进程,100-139分配给非实时的普通进程,所以实时
2014-04-17 17:34:37 4354
转载 pthread_barrier_init,pthread_barrier_wait简介
pthread_barrier 系列函数在中定义,用于多线程的同步,它包含三个函数: --pthread_barrier_init() --pthread_barrier_wait() --pthread_barrier_destroy()那么pthread_barrier_*是用来做什么的?这三个函数又怎么配合使用呢?
2014-04-17 11:07:23 20159 3
原创 C语言-关键字static
static静态变量类型static定义静态变量类型,首先要区分静态变量和静态存储方式,static定义的静态变量一定使用静态存储方式,但使用静态存储方式的不一定是静态变量。例如外部全局变量使用静态存储方式但不是静态变量,用关键字static修饰的变量才是静态变量。静态局部变量函数内定义的static变量成为静态局部变量,静态局部变量具有以下特点:1、静态局部变量在函数内定义,它的
2014-03-28 11:48:09 1115
原创 4412 uboot启动过程分析之一
.globl _start_start: b reset //uboot启动从_start开始,跳转到reset ldr pc, _undefined_instruction //初始化中断向量表 ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr
2014-03-25 11:34:42 8834 2
原创 Linux中EtherCAT主站执行过程
在上层申请主站,完成各种主从站的配置项之后,通过ecrt_master_activate函数调用激活整个EtherCAT总线,ecrt_master_activate函数最主要的工作还是完成状态机的启动。ecrt_master_activate通过kthread_run创建和运行一个内核进程,该内核进程一直在后台运行下面这个进程函数,这就是ecrt_master_activate完成的主要工作
2013-11-23 17:24:25 7190
原创 关于container_of和list_for_each_entry 及其相关函数的分析
Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,读Linux代码的
2013-11-22 11:36:03 13160 3
转载 从PC总线到ARM内部总线
总线的演变 首先应该讲讲总线的演变历史,这方面《PC架构系列:CPU/RAM/IO总线的发展历史!》 这篇文章写得很好!感谢文章的作者! 以下内容大量来自这篇文章,可以说是这篇文章的缩减转载。公共总线 早期PC中,CPU/RAM/IO都是挂在一条总线上,所有的部件都必须在同步的模式下工作。这样就带来一个"互锁" (locked to each other )效应:所有设备都
2013-11-07 14:32:38 1354
转载 逻辑运算的结果与逻辑运算中判断变量是否为真的区别
C语言编译系统在表示 逻辑运算 的 结果 时, 以数值 1 表示 “真” , 以数值 0 表示 “假”。但在 判断 一个量是否为“真”时,以 0 代表 “假”,以非0代表“真”。例程:#include void Print(int value){ if(value) { printf(" %d is true !!!\n",v
2013-11-01 16:22:48 2754
转载 N沟道增强型MOS管双向低频开关电路
【电路】 MOS-N 场效应管 双向电平转换电路 -- 适用于低频信号电平转换的简单应用(原文件名:MOS-N 场效应管 双向电平转换电路.jpg) 如上图所示,是 MOS-N 场效应管 双向电平转换电路。双向传输原理: 为了方便讲述,定义 3.3V 为 A 端,5.0V 为 B 端。 A端输出低电平时(0V) ,MOS管导通,B端输出是低电平(0V) A端输出
2013-09-05 15:12:47 13831 1
转载 arm汇编语言调用C函数
于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回,关于ATPCS的详细内容可以查看ADS1.2 Online Books ——Developer Guide的2.1节。这篇文档要讲的是汇编代码中对C函数调用时如
2013-08-30 10:28:13 4030 2
转载 LVDS液晶屏和TTL液晶屏的区别
TTL信号是TFT-LCD能识别的标准信号,就算是以后用到的LVDS TMDS 都是在它的基础上编码得来的。TTL信号线一共有22根(最少的,没有算地和电源的)分另为R G B 三基色信号,两个HS VS 行场同步信号,一个数据使能信号DE 一个时钟信号CLK,其中R G G三基色中的每一基色又根据屏的位数不同,而有不同的数据线数(6位,和8位之分)6位屏和8位屏三基色分别有R0--R5(R7)
2013-08-28 09:22:09 4490
原创 LAN9221网卡驱动之三 接收/发送完成中断
网卡中断主要是在接收新数据和数据发送完成时被调用,提醒网络驱动设备接收新数据和唤醒发送队列。static irqreturn_t smsc911x_irqhandler(int irq, void *dev_id){ struct net_device *dev = dev_id; struct smsc911x_data *pdata = netdev_priv(dev);
2013-04-19 17:02:53 1865 2
原创 LAN9221网卡驱动之二 NAPI接收
转载请注明出处:http://blog.csdn.net/qq405180763/article/details/8800391LAN9221采用NAPI方式读取网卡缓存内数据。当接主机收大量网络数据时,网卡中断触发驱动程序接收数据,驱动程序被触发后调用轮询函数,在轮询函数里接收固定个数据包后,固定个数据为budget,一般是轮询注册函数netif_napi_add的第三个参数weight,如
2013-04-14 17:56:18 2126
原创 LAN9221网卡驱动分析之一 发送数据
转载请注明出处:http://blog.csdn.net/qq405180763/article/details/8794887在LAN9221网卡驱动中,以字对齐往网卡缓存发数据,所以发送数据之前要考虑字对齐,并将发送字的次数计算出来。当网卡中TX_FIFO空间余量小于1600个字节时,通知上层停止发送队列,余量大于3200的时候网卡触发中断继续发送数据。static int sms
2013-04-14 15:14:35 3412
原创 linux网卡驱动dm9000_poll_work函数分析
static voiddm9000_poll_work(struct work_struct *w){struct delayed_work *dw = container_of(w, struct delayed_work, work);//获得结构体struct delayed_work,详见注释一
2013-04-06 15:57:11 3248
带12864显示语音提示的电子琴程序
2010-05-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人