- 博客(53)
- 资源 (5)
- 收藏
- 关注
原创 Linux 资源互斥(同步)方法 --锁和信号量
为什么要有互斥(同步):多个线程共享资源时,需要确保每个线程看到一致的数据视图,否则可能产生不可预知的结果。常见的互斥机制如表中所示名称 类型 简述 优缺点 使用场景 原子操作 非睡眠锁 原子操作可以保证指令以原子的方式执行--执行过程不被打断,因此以原子操作的共享资源就不存在一致性问题。被操作的资源一般为4字节或者8字节的资源,一般用于对计数器进行保护。 优点:使用简单,指令以原子方式操作。操作资源时,不存在阻塞和自旋的状态。一种非常轻量级的互
2022-02-19 15:53:54 1288
原创 C常用内存分配接口,malloc/calloc/realloc/alloca。
函数原型 参数说明 返回值说明 功能 特殊说明 void *malloc(size_t size); size:被分配的堆内存大小 成功:分配的堆内存的起始地址 失败:NULL 内存的动态存储区中分配一个长度为size的连续空间 无 void *calloc(size_t numElements, size_t sizeOfElement); numElements:对象个数 sizeOfElement:单个对象大小 成功:分.
2022-01-08 11:39:56 769
原创 路由器工作原理简要说明
设计思路:忽略链路层(以太网、无线局域网、ADSL、FTTH)差异,将ip报文由源设备发送到目的ip设备。接收处理流程:路由器端口收到网络报文后,PHY模块和MAC模块将信号转换为数字信息,并通过包末尾的FCS进行错误校验。校验无误后,首先剥离出报文的MAC头部,将MAC头部中目的MAC地址与端口的MAC地址进行比对,如果相同,则将报文(丢弃MAC头部后的报文,当报文到达路由器后,MAC头部的...
2021-06-15 20:33:00 359
原创 交换机工作原理简要说明
设计思路:将以太网帧原样的转发到目的地。流程:信息到达交换机端口后,由端口PHY模块进行接收,PHY(MAU)会将信号转发为通用格式,然后传递给MAC模块,MAC模块将信号转发为数据信息,然后通过包为的FCS校验错误,如果没有错误则放到缓冲区中。接下来要查询一下这个包的接收方MAC是否已经在MAC中有记录,有记录则按照MAC表中的记录条目,将该以太网帧转发对应的端口。否则,丢弃该以太网帧。...
2020-04-18 14:30:11 782
原创 集线器工作原理简要说明
集线器是以太网基本架构的忠实体现者,集线器会将其收到的信号广播到其所有端口上,信号从这些端口流出后,到达连接这些端口的设备,该设备在收到信号后会根据其MAC头部中的接收方MAC地址判断此以太网帧是否是发给自己的,是则接收,不是则丢弃。从最右边发出的以太网帧到达集线器后,从所有端口广播出去,因此左边的两台设备都能收到该以太网帧。...
2020-04-14 19:35:00 5850 4
原创 u-boot移植(五)使支持DM9000
将u-boot 2012.04.01移植到JZ2440开发板 DM9000的移植比较简单,因为其实u-boot内部已经支持了DM9000网卡,不过smdk2410默认使用的是cs8900网卡,我们要做的工作就是将支持DM9000的相关代码链入u-boot,然后将cs8900的相关代码替换成DM9000的相关代码。DM9000的初始化函数为eth_initialize(gd->bd),它
2017-06-27 10:14:36 375
原创 u-boot移植(四)使支持NAND FLASH
将u-boot 2012.04.01移植到JZ2440开发板 NAND FLASH在u-boot中的初始化位置参见NAND的初始化函数为nand_init,先来看一看各函数的调用流程nand_init -->board_nand_init -->时序设置(NCONF),NAND使能(NCONT) -->nand
2017-06-26 15:47:28 469
原创 u-boot移植(三)使支持norflash
将u-boot 2012.04.01移植到JZ2440开发板 让u-boot支持自己的开发板比较简单,因为norflash的接口跟内存很相似,我们不需要自己实现NORFLASH的操作集,u-boot中含有norfalsh的操作集我们要做的工作就是根据自己开发板上的norflash的特性,在u-boot的norflash的匹配表中加入自己的norflash的数据u-boot中 b
2017-06-25 17:16:50 490
原创 u-boot移植(二)支持串口及u-boot框架
从这里开始,我们就要跟随源代码,分析源代码,修改相应部分,使得代码支持我们自己的开发板从链接文件中我们可以得知代码从start.S部分开始执行,现在我们进入start.S文件,分析此文件所做的工作1、设置CPU模式为管理模式2、关看门狗3、设置时钟比例 FCLK:HCLK:PCLK = 4:2:1,FCLK默认为120MHZ4、bl cpu_init_crit --
2017-06-25 16:15:57 419
原创 u-boot 移植(一) 准备工作
将u-boot 2012.04.01移植到JZ2440开发板 拿到一个UBOOT,要知道怎样编译和修改可以看一看顶层目录下的README文件,其中有如下内容Building the Software:======================U-Boot is intended to be simple to build. After installing thesource
2017-06-25 16:06:28 404
原创 JZ2440 ADC和触摸屏学习笔记
S3C2440的CMOS模数转换器可以接收8个通道的模拟信号输入,并将它们转换成10位的二进制数据S3C2440的触摸屏接口向外提供4个控制引脚(XP,XM,YP,YM)与触摸屏的直接相连。S3C2440的ADC和触摸屏机构图如下所示图中有两个中断信号:INT_ADC,INT_TC,前者表示A/D转换已经完成,后者表示触摸屏被按下了,或者弹起了。在使用触摸屏是AIN[7:4]被用来
2017-06-21 15:08:03 1688
原创 JZ2440 LCD学习笔记
S3C2440支持STN、TFT、SEC TFT三种类型的LCD显示器TFT LCD的TTL信号VSYNC :垂直同步信号HSYNC :水平同步信号HCLK :像素时钟信号VD[23:0] :数据信号LEND :行结束信号PWREN :电源开关信号S3C2440 LCD控制器的内部结构如下图插图
2017-06-19 16:04:40 720
原创 JZ2440 串口分析
UART:通用异步串行收发器发送数据时:CPU将数据写入UART,UART按照一定的格式在一根线上串行发出接收数据时:UART检测另一根线上的信号,将串行收集放在缓冲区中,CPU即可读取UART获得的数据在两个设备进行串行通讯前两者的UART要约定数据的传输速率(波特率),数据的传输格式(多少个数据位,是否使用校验位,是奇校验还是偶校验,有多少个停止位)下图演示了UART使
2017-06-13 20:07:07 575
原创 JZ2440定时器
S3C2440时钟控制逻辑给整个芯片提供了3种时钟:FCLK:用于CPU核HCLK:用于AHB总线上设备,比如存储控制器,中断控制器,LCD控制器,DMA和USB主机模块。PCLK:用于APB总线上的设备,比如WATCHDOG,IIC,PWM定时器,MMC接口,ADC,UART,GPIO,RTC,SPI开发板上的晶振为12MHZ,为了提高频率,需要时钟控制逻辑PLL提高系统时钟
2017-06-13 10:27:13 769
原创 JZ2440 中断分析
当某事件发生时,硬件会设置某个寄存器;CPU会在没执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址处理这事情,事后返回继续执行的程序。中断的使用步骤:(1)设置好中断模式下的栈,禁止中断。当发生中断IRQ时,CPU进入中断模式,这时使用中断模式下的栈(2)准备好中断服务程序(ISR),在中断服务程序中跳转到具体的
2017-06-12 13:29:17 367
原创 JZ2440 NAND Flash控制器
NAND Flash在嵌入式系统中的地位与PC上的硬盘类似,用于保存系统运行所必须的操作系统,应用程序,用户数据,运行过程中产生的各类数据。NOR Flash:支持XIP,即代码可以直接在NOR Flash上运行,无需复制到内存中,NOR Flash的接口与ARM完全相同可以随意访问地址的数据。在NOR Flash上常用JFFS2文件系统NAND Flash:为支持
2017-06-10 21:52:00 601
原创 JZ2440内存管理单元MMU
内存管理单元(memory management unit),简称MMU,它负责虚拟地址到物理地址的映射arm采用页表的形式将一个虚拟地址转换成物理地址,以段的方式进行转换时只用到一级页表,以页的方式进行转换则会用到二级页表。插入图具体的映射过程如下,假设CPU发出一个32位的虚拟地址addr首先根据页表基值寄存器的[31:14]位找到页表(假设内存地址为P),
2017-06-09 16:05:35 557
原创 JZ2440存储控制器
s3c2440的“存储控制器”提供了访问外部设备的信号在JZ2440共有8个bank,每个bank的最大访问容量为128Mbank0~bank5支持外接ROM,SRAMbank6~bank7支持外接ROM,SRAM,SDRAM在外接SDRAM时,支持自刷新,和省电模式S3C2440理论上可寻址4G地址范围,可实际上除了外接的8个bank可最大寻址1G空间外,还有一部分
2017-06-08 15:49:09 569
原创 JZ2440点灯程序
离找工作只有不到三个月的时间,为了复习嵌入式方面的知识,这里会写一系列的博客,包含裸机,内核移植,驱动。为了督促自己遇到难点时不要放弃,这里粘贴一条《高质量程序设计指南C++C语言》中的一段名言:如果放弃一次,那么碰到下一个挫折时我就会继续放弃;如果坚持而成功,那么碰到下一个挑战时我就会激励自己再次取得成功
2017-06-07 11:39:20 752
转载 为什么代码和数据要分开存放成代码段和数据段
原文地址:http://www.cnblogs.com/yeahwell/archive/2013/03/25/5226045.html在百度里面看到这样一个问题和答案,记录一下。汇编中把数据段和代码段定义在同一段内有好处么? 悬赏分:10 -解决时间:2009-11-12 14:58在汇编语言,把代码段和数据段放在同一段内,在伪指令定义变量时位置有何要求么? 放在S
2017-05-30 10:52:21 5236 1
原创 基本数据类型强制转换问题-值的截断和内存的截断
(1)double a1=22.32; int b1=(int)a1;(2)double a2=2.5e20; int b2=(int)a2;按照浮点数到整数的转换语义,结果应该截去浮点数的小数部分,而保留整数部分。所以b1应该为22,而b2则超出了其能表示的范围。这是值的截断基本数据类型直接的指针转换一般来说必将造成内存截断或内存
2017-05-21 16:38:05 6341
原创 viso2010相关操作技巧
(1)对于直线的任意角度旋转问题,这几天在画图过程中需要对直线做任意角度旋转,捣鼓了很长时间却发现这是个很简单的问题解决方法,先画出一条直线,放大图像,会发现,直线上有三个点,如下我们只需要点击非中间的那个点,然后做切线方向拖动就好了(2)对于线的相交时跨线问题的解决方法设计-->在页面设置中-->布局排列-->跨线-->将跨线添加到 改为 无
2017-05-20 10:03:11 578
原创 vim常用命令
1 进入插入模式a 从光标后面开始添加文本A 从光标所在行的末尾开始添加文本i 从光标的前面开始插入文本I 从光标所在行的开始处开始插入文本o 在目前光标所在行的下一行处插入新的一行O 在目前光标所在行的上一行处插入新的一行s 删除光标所在的字符
2017-05-17 22:22:43 355
原创 Makefile相关规则
定义变量的方法(1)变量名=变量值 递归变量展开(几个变量共享一个值) //不常用(2)变量名:=变量值 简单变量展开 //通常采用的形式常用的变量$@ : 当前规则的目标文件$$^ : 当前规则的所有依赖文件,
2017-05-17 21:46:11 252
转载 同步串行通信与异步串行通信
转载地址:http://blog.chinaunix.net/uid-22778496-id-2114647.html串行通信是微机接口的一个重要组成部分,有着极其广泛的应用。随着微机特别是单片机的发展,其应用已从单机逐渐转向多机或联网,而多机应用的关键又在微机通信。微机通信有串行和并行两种通信方式,并行通信可以提高数据交换速度而串行通信可以节省系统资源,降低系统成本。串行通信又分为同步串
2017-05-12 20:54:48 2061 1
原创 JZ2440 中断分析
ARM体系结构的7中工作模式1、用户模式(usr) :ARM处理器正常的程序执行状态2、快速中断模式(fig) :用于高速的数据传输或通道处理3、中断模式(irq) :用于通用的中断处理4、管理模式(svc) :操作系统使用的保护模式5、数据访问终止模式(abt) :当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护6、系统模式(sys) :运行具有特权的操作系统任
2017-05-05 17:40:19 754
原创 JZ2440 系统时钟
时钟控制逻辑给整个芯片提供了三种时钟FCLK:用于CPU内核HCLK:用于AHB总线上设备,比如cpu核,存储控制器,中断控制器,lcd控制器,DMA控制器,和USB主机模块,主要用于高性能模块PCLK:用于APB总线上设备,比如WATCHDOG,IIS,I2C,PWM定时器,MMC接口,ADC,UART,GPIO,RTC和SPI。S3C2410 CPU 工作电压1.8v 主频
2017-05-05 17:37:12 543
原创 JZ2440看门狗分析
使用WATCHDOG定时器的“WATCHDOG”功能时,在正常的程序中,必须不断重新设置WTCNT寄存器使得它不为零,这个可以保证系统不被重新启动,这称为“喂狗”,当程序崩溃,不能喂狗,计数值达到0后系统将被重新启动,这样程序将重新运行。这就避免了各类系统错误时系统彻底死机。WATCHDOG需要设置的三个寄存器:(1)WTCON寄存器(WATCHDOG TIMER CONTROL)
2017-05-05 17:27:30 729
原创 u-boot mkconfig 文件分析
#!/bin/sh -e# Script to create header files and links to configure# U-Boot for a specific board.## Parameters: Target Architecture CPU Board [VENDOR] [SOC] //注释此文件参数形式## (C) 2002
2017-04-08 15:05:05 307
转载 ARM工作模式与中断
文章转载自:http://blog.chinaunix.net/uid-26404201-id-2998793.html在ARM处理器7种运行模式中,除用户模式外,其余6种模式称为非用户模式或特权模式,其中除用户模式和系统模式以外的5种又称为异常模式。在非特权模式(用户模式)下,不能对CPSR寄存器设置,只能读取CPSR的值。ARM汇编进入默认模式的是管理模式。CPSR的控制位共有8位
2017-04-04 11:32:46 1204
转载 对.lds链接脚本文件的分析
对于.lds文件,它定义了整个程序编译之后的连接过程,决定了一个可执行程序的各个段的存储位置。虽然现在我还没怎么用它,但感觉还是挺重要的,有必要了解一下。先看一下 GNU官方网站上:http://www.gnu.org/对.lds文件形式的完整描述:SECTIONS {...secname start BLOCK(align) (NOLOAD) : AT ( lda
2017-03-28 09:01:34 330
原创 关于指针的引用与指针的指针的理解
今天上午在学习数据结构的过程中,写了一段错误的代码,找了一上午的错误才发现是因为用错了指针的问题,错误的关键点是:将指针当做形参其实也是值的传递,在在副本中改变了指针变量的内容,即函数内部改变了指针的指向,在函数外部指针的指向并没有改变。这种情况下应该要用双重指针或指针的引用作为形参。多说无益,直接上代码。#include using namespace std;void f1(int *
2017-03-23 14:53:57 325
原创 GDTR、LDTR、GDT、LDT的理解’
网上关于GDT与LDT的内容很多,这里只是在别人的基础上加入了自己理解的内容,首先贴一段LDTR的百度百科说明:LDTR(Local Descriptor Table Register)即局部描述符表寄存器,为自intel 80386起引入的寄存器。其中存放内容由两部分构成,第一部分为16位的LDT(局部描述符表)段的段选择子;第二部分为LDT段的段描述符的内容,intel 80386起引入的
2017-03-22 13:27:22 931
原创 Linux内核0.11版本 fork.c文件
fork.c中含有fork的辅助子程序,其位置为Linux-0.11/kernel/frok.c.文件中主要包含了verify_area(),copy_mem(),copy_process(),find_empty_process()这几函数首先分析verify_area()函数,源代码如下void verify_area(void * addr,int size){ unsig
2017-03-21 17:30:24 1452
原创 Linux内核0.11版本sys_waitpid()函数分析
文章内容摘自与Linux内核完全注释(修正版v1.9.5)5.10.2部分系统调用waitpid()。挂起当前进程,直到pid 指定的子进程退出(终止)或者收到要求终止该进程的信号,或者是需要调用一个信号句柄(信号处理程序)。如果pid 所指的子进程早已退出(已成所谓的僵死进程),则本调用将立刻返回。子进程使用的所有资源将释放。如果pid > 0, 表示等待进程号等于pid 的子进程。如果pi
2017-03-21 09:32:53 835 1
原创 do_signel()函数的理解
在 中记录了对signal()函数和sigaction()函数的分析,这里分析用户程序进行系统调用(int 0x80)时中断处理程序对信号的处理。在进程每次调用系统调用时,若该进程已收到信号,则该函数就会把信号的处理句柄(即对应的信号处理函数)插入到用户程序堆栈中。这样,在当前系统调用结束返回后就会立刻执行信号句柄程序,然后再继续执行用户的程序,如下图所示在用户程序调用系统调用刚进
2017-03-20 21:00:28 1820
原创 Linux内核0.11版本signal.c中sys_signal()和sys_sigaction的理解
signal()和sigaction()的功能比较类似,都是更改信号原处理句柄(handler ,或称为处理程序)。但signal()就是内核操作上述传统信号处理的方式,在某些特殊时刻可能会造成信号丢失,造成信号丢失的原因在于signal()函数会在一处理句柄结束后将其恢复成信号的默认处理句柄。所以要持续保持新的信号处理函数就得在新的信号处理函数中再次signal()设置,但在上一次响应信号进
2017-03-20 17:52:14 1107
高质量程序设计指南C++C语言(第3版) .
2017-05-01
一个简单的背单词的QT程序
2017-05-01
组合导航松组合间接法的MATLAB程序
2017-04-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人