嵌入式学习笔记
绿叶清风
这个作者很懒,什么都没留下…
展开
-
学前班-怎么看原理图之GPIO与门电路
对硬件电路图分为三类:1,GPIO与门电路(管脚类与门电路类)1.1 输入、输出引脚、上拉电阻、三极管输出引脚示例图:1.2 与门、或门、非门2,协议类2.1 URAT2.2 I2C2.3 SPI 2.4 NAND2.5 LCD3,类似内存的接口3.1 NOR ,SDARM,网卡3.2 不同位宽外的设的接线、访问过程原创 2016-11-18 09:24:58 · 4963 阅读 · 0 评论 -
u-boot源码分析
在分析u-boot源码之前,先回忆 一下以前的实验: 1,首先初始化; 2,如果我们的程序很多,需要把程序从Nand拷贝到SDRAM中去。 3,设置栈(sp);所谓设置栈,就是让SP指向某块内存,设置完之后就可以调用C函数;u-bootb也是一个单片机程序,同样也需要做上面的工作;先分析一下 cpu/arm920/start.S文件,从它入手来分析:原创 2016-11-21 16:22:33 · 621 阅读 · 0 评论 -
u-boot分析之u-boot命令实现
当我们在串口的控制台上输入一个命令,要么提示不能识别的命令,要么就会打印某些东西(执行)。这些命令是怎么实现的?使用命令的步骤: 1,输入字符串,对应某些命令名。 2,执行。显然,在程序里面是根据这些命令,找到对应的函数,然后执行相应的函数;在在u-boot不会只有一个结构体,这些命令肯定会有一个结构体,结构体中包括:名字、函数;根据输入的命令到这个结构体链中一一比较,然后执行;先看一下run_原创 2016-11-21 17:48:41 · 713 阅读 · 0 评论 -
u-boot分析_uboot启动内核
u-boot 内核启动的时候依赖于以下这两行代码:s = getenv("bootcmd");...run_command(s,0);第一条命令是从nand把内核把读到到一个地址上去;第二条命令是从内核里面启动内核;从哪里读?从kernel分区读; 读到哪里去?放到指定地址(0x30007fc0)去;在PC机上,每一个硬盘前面都有一个分区表。对于嵌入式Linux来说,flash上面没有分区表,原创 2016-11-21 18:38:04 · 1140 阅读 · 0 评论 -
Linux内核启动流程分析之编译体验
Linux源码编译过程: 1,解压 2,打补丁; 方法 : patch -p 补丁文件名 3,配置,配置有三种方法: 一、直接使用make menuconfig,从头到尾每一项都去配置。(繁琐) 二、使用默认配置,在默认的配置上面修改 三,使用厂家提供的配置文件;使用默认配置的方法: cd 到 arch/arm/configs目录下面,找出一个与自己单板原创 2016-11-22 11:33:07 · 691 阅读 · 0 评论 -
嵌入式学习资源汇总及面试题
学习嵌入式常用的资料(代码)[嵌入式 Linux 知识库 (eLinux.org)]这里写链接内容知乎: 如何学习嵌入式?这里写链接内容嵌入式面试题1嵌入式面试题2嵌入式面试题3原创 2017-01-12 22:06:30 · 4881 阅读 · 3 评论 -
linux驱动调试之段错误分析-根据栈信息分析函数调用过程
一. 根据栈信息分析函数调用过程(如果没有回溯信息)在函数调用中,一方面要执行,一方面要跳到返回地址(需要保存返回地址lr(在栈里面保存))# ./firstdrvtest onUnable to handle kernel paging request at virtual address 56000050pgd = c3e78000[56000050] *pgd=0原创 2017-06-10 22:23:06 · 846 阅读 · 0 评论 -
linux应用调试之使用strace命令跟踪系统调用
starce打补丁starce命令及用法使用strace命令来追踪系统调用原创 2017-06-10 22:35:41 · 498 阅读 · 0 评论 -
linux驱动调试之修改系统时钟中断定位系统僵死问题
在first_drv.c中故意引入错误,在点灯时引入死循环,当应用程序调用write函数就会在while里面卡住。重新编译驱动,并拷贝到网络文件系统中,装载驱动并把灯点亮,但是系统卡死了。可以看测试程序的源代码,看涉及什么系统调用,找到对应的驱动程序并进行分析。在系统空间可能会发生这样一种情况:系统僵死!此时系统处于僵死状原创 2017-06-10 22:37:58 · 851 阅读 · 1 评论 -
linux驱动调试之自制工具—寄存器编辑器
转自http://liu1227787871.blog.163.com/blog/static/2053631972012610101614610/当我们调试驱动程序的时候,可能要调整寄存器的设置。按照我们之前的作法就是直接在程序里面修改,然后重新编译程序。但是这种方法比较麻烦,我们可以编写一个工具,可以直接对寄存器进行修改,这就是我们说的寄存器编辑器。其具体程序如下:这个转载 2017-06-10 22:39:34 · 873 阅读 · 0 评论 -
linux驱动调试之段错误分析_根据pc值确定出错的代码位置
我们知道在内核里面不能够处理指向0地址的指针,我们故意引入这样一个指针,并根据打印的出错信息来进行分析,下面是我们的程序:#include #include #include #include #include #include #include #include #include #include int *i;static i转载 2017-06-10 22:42:36 · 3642 阅读 · 0 评论 -
linux应用调试技术之GDB和GDBServer
出自1、调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer。在应用程序调试的时候,pc机上的gdb向开发板上的GDBServer发出命令,而开发板上的gdbserver就会向应用程序发出信号,使应用程序停下来或者完成其他一些工作。 2、安装GDB和GDBServer(gdb转载 2017-06-10 22:44:42 · 608 阅读 · 0 评论 -
应用调试之配置修改内核打印用户态段错误信
出自http://liu1227787871.blog.163.com/blog/static/2053631972012613102341318/根据之前的调试我们知道,当应用程序出错的时候,会打印一些信息。但是有时候这些信息时不够的,那么我们能否配置内核使其输出更多的信息呢?答案是肯定的,本节我们就来详细讲一下:应用程序进入内核态调用驱动程序后,在驱动程序里面(内核态里转载 2017-06-10 22:55:01 · 1035 阅读 · 0 评论 -
linux应用调试之自制系统调用、编写进程查看器(一)
转自http://liu1227787871.blog.163.com/blog/static/20536319720126135157567/一、原理要想自制系统调用,当然首相要做的就是明白系统调用的过程:我们拿open函数来举个例子:当用户空间执行open函数时,会通过glibc函数库的作用最终去调用sys_open函数,sys_open函数最终又会调用我们具体转载 2017-06-11 08:20:58 · 678 阅读 · 0 评论 -
u-boot分析之Makefile结构分析
我们分析一个文件的时候,想知道它是什么结构?是怎么链接的,最好的方法就是分析它的makefile文件。之前说过u-boot配置、编译;为什么知道先配置后编译?源码中有个readme文件;先从makefile文件中分析一下配置过程; 执行make的时候,就相当执行这条命令: 我们先在Makefile文件中搜索一下 MKCONFIG看一下是什么东西? 从上可以看出,在源文件的目录下面有一个mkco原创 2016-11-20 23:58:13 · 883 阅读 · 0 评论 -
uboot编译之体验
在说uboot之前,先看一下PC机是怎么启动的? pc上电、bios、引导操作系统、识别C盘、运行应用程序。同样的在嵌入系统里面,启动过程:一上电的时候,bootlolder(引导linux内核)、挂接根文件系统、运行应用程序。bootlolder的最主要的目的:启动内核补丁? 所谓的补丁就是我们在原码包上做了什么修改,我们将这些修改单独列出来放到一个文件,然后发布的时候,把补丁文件给别人家即可原创 2016-11-20 23:33:23 · 1202 阅读 · 0 评论 -
学前班-怎么看原理图之协议类接口之UART
2,协议类2.1 URAT在我们平时对话中应该遵循的原则:双方能够听懂对方在说什么;不能说的太快,即语速要让别人接受; 推广到通信当中, 协议类双方应该遵循的原则:双方协定信号的协议;双方满足时序要求; 如上图所示,硬件的通信是通过连接双方的(串口)引脚信号线传输数据的,为什么两个串口可以传那么复杂的数据?这就要求双方必须遵循一定的协议。下面看一下具体的原理图: 将上图简化后: 如图,24原创 2016-11-18 11:11:48 · 1862 阅读 · 0 评论 -
学前班-怎么看原理图之协议类接口之I2C
I2C的原理图如图所示: 原理图可以简化成:2440的SCL外接到外部芯片的SCL,SDA外接到外部芯片的SDA I2CSCL:时钟线 I2CSDA:数据线 两条线上可以挂接多个设备,2440到底是要访问设备1,还是设备2?每一个I2C设备都有一个地址,当数据线的值等于自己的地址值,才做出回应。 I2C的停止信号如图所示: 传输数据? 注意:设备要在SCL为高电平的时候采集数据。回原创 2016-11-18 11:56:19 · 1308 阅读 · 0 评论 -
学前班-怎么看原理图之协议类接口之SPI
SPI芯片引脚示例图及引脚描述: 2440: SPI与2440引脚连接简化图: 其中SPIMOST中的M表示master(主机),s表示slave,o表示output,gpio可以用于与spi芯片片选引脚相连。时钟由2440发送,访问前先输出低电平选中(片选)。数字电路就像堆积木一样,找到对应的线,将它接在一起就可以了。如果要通信的话,就需要去查看芯片手册内部的协议。同理也存在SPI芯原创 2016-11-18 14:11:20 · 1415 阅读 · 0 评论 -
学前班-怎么看原理图之协议类接口之NAND Flash
NAND Flash原理图: 由NAND Flash的原理图可以看出,做为一个存储芯片,只有I/O引脚,并没有地址引脚,怎么传地址?遵循一定的规范,先通过LDATA把地址传出去,再传数据。具体的需要查看芯片手册。 由图可知:IO0-IO7:既可传送数据也可传送地址,也可以送传命令(是读还是写,还是擦除),怎么区分IO0-IO7传送的是数据?地址?命令? 需要通过CLE与ALE的状态来区原创 2016-11-18 15:17:46 · 5389 阅读 · 1 评论 -
学前班-怎么看原理图之内存类接口
类似内存接口,RAM-Like接口 地址线 数据线 2440上可以接网卡、Nor Flash,SDDRAM,这些外设都一起共用数据线与地址线;当2440访问内存的时候,一定不要让网卡、Nor Flash干扰(即互不干扰),怎么样才能做到这一点? CS(chip select):片选线,当某个芯片的CS为低电平的时候,才响应。 地址线、数据线接有众多的设备,怎么做到只访问其中一个,避免原创 2016-11-18 18:31:24 · 1702 阅读 · 0 评论 -
环境搭建及工具、概念介始 (makefile)
一、安装 1,安装ubuntu 2,安装虚拟机,然后打开虚拟机,二、安装windows下的配套开发工具。 1,源码编辑查看源码工具:source insight 如何查看uboot源代码? 在uboot源代码新建一个目录si,这个目录用于source insight临时生成的文件;然后新建一个source insight工程,加入相应的文件到目录(可以先全部加入,然后删除不需要的单板对应原创 2016-11-19 11:36:57 · 939 阅读 · 0 评论 -
GPIO实验
目标:点亮LED 怎么点亮LED?看原理图,确定LED是怎么接线的。相关原理图: 简化的原理图: 从原理图中可以看出GPF4=0,灯亮;GPF4=1,灯灭怎么设置GPF4的值呢? GPF4既然做为一个管脚,就可以做为输入管脚、也可以做为输出管脚。因此我们需要配置GPF的功能是输入还是输出还是中断(这里应该配置成输出)?配置完以后,需要设置它的值。具体怎么样设置?操作相应的寄存器,需要进一步查原创 2016-11-19 14:45:34 · 5084 阅读 · 0 评论 -
存储管理器、SDRAM实验
对于2440的存储器来说,他的结构是这样的:存储管理器作用: 2440可以外接SDRAM、网卡,CPU怎么访问这些外设,就是通过存储管理器来访问它们的, 比如CPU想从0X3000,0000 读四个字节的地址,CPU只要执行: MOV R1 0X30000000 , ldr R0 ,[R1];这两条指令即可,存储管理器根据内部的配置信息:1,发出片选信息 2,发出bank选择信号 3原创 2016-11-19 21:27:40 · 1232 阅读 · 0 评论 -
内存管理单元MMU实验
MMU介绍 权限管理:当我们使用windows时,有时候会弹出地址访问错误,但这不影响整个操作系统的运行。 假设A、B程序的时序图如下: 因为A、B程序的地址空间各不相同。权限管理就使得A程序无法访问B程序的地址。如果A程序写的非常糟糕,A程序并不能破坏内核。地址映射:假如有两个hello.c文件,如图: 这两个程序的死循环保证了两个程序同时运行,且这两程序的a变量的地址一样,如图:这两个程原创 2016-11-20 00:01:29 · 1310 阅读 · 0 评论 -
Nand Flash控制器
回忆一下,一上电以后,Nand Flash的前面4K就会被拷贝到2440的片内存里面。 在前面几个程序,编译出来的程序都小于4K;如果我们编译出来的程序大于了4K,这时候Nand Flash的前面4K拷贝到2440的片内存里面,拷贝到2440里面的这4K的任务就是将更大的程序从Nand Flash里面读出来放到SDRAM里面去。地址空间:Nand Flash只有数据线,地址总线并没有跟CPU相连。原创 2016-11-20 11:17:07 · 4514 阅读 · 0 评论 -
中断控制器
在ARM中CPU有七种工作模式:什么叫做工作模式? 每一种工作模式都有哪些东西? 每一种工作模式下面都有一些不同的寄存器、不同的权限、不同的触发条件;不同的寄存器,如图: 可以看出,不同工作模式使用的寄存器是不一样的。比如同是一条指令: mov R8 #1; 在不同的模式下会对应不同的寄存器,这样作的好处是:当从一种模式切换到另外一种模式的时候,如果那一种模式有自己独有的寄存器的话,那么原来原创 2016-11-20 16:54:50 · 3892 阅读 · 2 评论 -
系统时钟与URAT(串口)实验
系统时钟,台式机CPU可以跑:1GB 、2GB的赫兹的频率,而我们买的内存跑的频率可能只有133MB赫兹;同样的道理,对于2440的开发板的CPU可以达到400M HZ,而SDRAM的频率范围为:100M-133M HZ,而URAR的频率为 50M HZ; CPU、SDRAM、UART的频率的分别叫:FCLK、HCLK、PCLK;2440的结构是一个SOC(System on chip)的结构;整原创 2016-11-20 18:52:26 · 3630 阅读 · 1 评论 -
LED实验
2440 LCD原理图如下:从图中可以看出,需要的信号有:垂直方向上的信号(vsync)、水平方向的垂直信号(hsync)、时钟(vck)、使能信号(vden)、背光信号(LED+,LED-),数据信号(vd0 - vd23)如果我们想点亮LED,首先要设置GPB0.要知道这些信号怎么联系起来,需要看2440手册上的时序图: 假设LED的分辨率为240*320,LED从左到右、从上到下呈Z 字状的原创 2016-11-20 22:32:32 · 1576 阅读 · 0 评论 -
应用调试之自制系统调用、编写进程查看器(二)
出自:点击打开链接在本节里面我们就详细来讲一下如何用我们自己实现的系统调用来调试应用程序一、步骤1、修改应用程序的可执行文件,替换某个位置的代码为swi val2、执行程序3、进入到sys_hello->在sys_hello里面打印信息->执行原来的指令->返回二、具体实现我们的应用程序是://file:test_sc.c#inclu转载 2017-06-11 15:57:19 · 713 阅读 · 0 评论