自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 嵌入式系统设计师

这两个月来,因为公司项目比较多,所以工作量也比较大,学习的时间比较少。但是从工作中还是学到了不少,特别是cpu编译器相关方面的东西。打算下半年考一个中级软件工程师的证书,就把这段时间需要注意的东西纪录下来。CPU是计算机的控制中心,主要由计算器,控制器,寄存器组和内部总线等部件组成。控制器由程序计数器,指令寄存器,指令译码器,时序产生器和操作控制器组成。程序计数器是专用寄存器,具有寄存

2017-04-30 17:46:57 5035 1

原创 fat32文件系统

MBR主引导记录由446(0x1BE)个字节的引导代码,64字节的主分区(4个)表及两个字节的签名值“55 AA”组成。

2017-03-16 18:14:55 951

原创 libuv流程

考虑到系统性能的问题,现在很多流程都使用了异步机制,这样可以更快的返回去做另外的事情,但是异步也存在一个很大的问题,就是不知道何时会完成之前的事情,很多流程就变得不够可控,现在在项目中就碰到过因为此问题而产生的bug,因为不可控,所以多线程之间资源的互斥和保护就变的异常重要,否则一不小心就会因为修改了本部应该修改的线程或进程资源而导致系统crush掉。现在使用的是libuv,它是一个第三方的异

2017-02-20 19:01:38 1503

原创 linux下USB驱动

USB拓扑结构不是以总线方式的,而是一棵由几个点对点的连接构成的树,连接线由4根电缆组成(电源,地线,两个数据线)。USB主控制器负责询问每一个USB设备是否有数据需要发送,也就是说一个USB设备在没有主控制器要求的情况下是不能发送数据的。USB端点(endpoint):只能往一个方向传送数据。控制端点:用于配置设备获取设备信息,发送命令到设备或获取设备的状态报告中断端点:每当US

2017-01-15 23:01:32 967

原创 linux下安全备份升级(网页)

如果在大部分开发完成,并且已经交付完成软件之后,如果产品要可持续的发展,并且与客户有长久合作关系,不可避免的需要进行技术支持,同样的,只要是人写出来的代码,就一定会存在bug,问题严重的还会影响产品的产量。所以,升级的必须的,现在我所知道的升级方式有三种:一。直接把产生的二进制bin文件通过烧录器烧写到flash里面,在嵌入式linux中一般有三种类型的bin文件,分别是bootloader,

2016-11-29 20:05:32 1152

原创 linux下pm子系统

工作中分配了低功耗相关方面的内容,查了相关资料,linux更是有一套pm相关的子系统。首先需要说明的是既然是低功耗,那么SoC就要支持相关低功耗。如果要进入低功耗模式,有一种方式可以在用户空间通知内核空间,echo “stanby" > /sys/power/state至于字符串的内容,需要在/kernel/power/suspend.c去查看或者修改。linux中/sys/中是内核空

2016-11-29 19:38:22 3780

原创 浙江软考 程序员

计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理,同时加减法也可以统一处理。此外,补码与源码相互转换,其运算过程是相同的,不需要额外的硬件电路。原码就是符号位加上真值的绝对值,即第一位表示符号,其余位表示值。正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。正数的补码是其本身,负数的反码是在其原码的基础上,符号位不变

2016-09-13 22:10:43 1923

原创 spi nor flash驱动

嵌入式系统中flash的作用相当于PC上的硬盘来存放永久的数据,不像内存那样掉电数据就会消失。而我们使用的是nor flash,操作也比较简单,直接读取flash的地址就可以将数据通过memcpy到内存(当然是需要给相关寄存器配一些值),然后传给上层使用。专用SPI控制器主要有CTRL,CMD,DATA,ADDR,STATUS寄存器。相关命令 /* Command

2016-08-28 16:20:39 4428

原创 read()函数流程(USB读取文件)

ssize_t read(int fd, FAR void *buf, size_t nbytes);通过当前的TCB(或者说PCB的文件列表找到) 找到打开的文件列表group->tg_filelist,然后根据相应的fd,找到对应filep(&list->fl_files[fd])。size_t file_read(FAR struct file *filep, FAR void *b

2016-08-21 17:32:31 4581

原创 程序员的自我修养-链接装载与库笔记

花了近一个礼拜的时间算是把这本书看完了大部分的内容,因为工作接触的是linux有关windows的部分没有去看。个人觉得如果要做底层的话,这本书不得不看,看完之后虽然没有全部理解,但是对于我之前的知识体系结构有了很大的一个补充。现在就要记录下书中一些重难点,可以以后去回顾,将基础知识打扎实。为了协调I/O设备与总线之间的速度,也为了能够让CPU能够和I/O设备进行通信,一般每个设备都会有一个相

2016-08-01 22:59:53 3001

原创 linux下DMA驱动

/** * dma_request_channel - try to allocate an exclusive channel * @mask: capabilities that the channel must satisfy * @fn: optional callback to disposition available channels * @fn_param:

2016-07-20 23:05:46 3281

原创 mount函数分析

首先判断挂载的类型是否符和已经定义好的文件系统类型。里面的实现方式是比较对应字符串是否相同。mount_findfs(g_bdfsmap, filesystemtype);其中g_bdfsmap就是已经定义好的文件系统类型。static const struct fsmap_t g_bdfsmap[] = { #ifdef CONFIG_FS_FAT { "vfat"

2016-07-06 22:13:53 2241

原创 ADC按键驱动

ADC是有通道的概念的,每一个GPIO可以被复用一个ADC按键,公司芯片有8个ADC通道。至于为什么要用ADC按键,因为按键可以通过形成一个阵列的方式,每一个开关按键分到不同的电压,通过ADC就能软件判断到底是哪一个按键在产生作用。这样的话就大大提高了gpio管脚 的利用率。首先设置ADC控制器CFG模块使能位。读取ADC控制器中断位,并且清相对应的中断。当然最终要打开ADC相对应的pad

2016-07-04 22:16:58 5344

原创 stat()函数解析

在完成任务的过程中遇到了一个问题就是调用stat函数获取文件信息的时候有些文件总是返回错误代码22(EVAL),后来一步一步跟踪到内核源码里面发现原来是文件名的长度超出了规定的长度。因为是在nuttx上使用的该系统调用,所以以为是不是其中有bug,最后才知道是配置文件.config中配置CONFIG_FAT_MAXNAME为32太小了。之前也没有了解过该系统调用,所以就来仔细的看一看这个函数。

2016-06-30 22:52:57 4214

原创 LCD驱动

因为上头任务的安排,需要将Linux上的LCD驱动移植到Nuttx(一种实时操作系统,据说现在很火,还是一个外国人自己在维护,这真是一个大牛!有很多接口和Linux上的接口都不怎么相同,甚至有的都没有相对应的接口,同时该操作系统没有底层和应用层的概念,最后所有的程序镜像都合成一个nuttx镜像,该镜像中有已经有事先写好的程序)。因为之前已经在Linux上已经写好了驱动程序,所以任务还是比较简单的,

2016-06-26 22:50:15 667

原创 shell编程和正则表达式相关知识

工作了大半年了,发现学习嵌入的我,还需要对shell脚本有一定的了解,因为个人感觉Makefile有很多的基础语法就是shell基础。所以在51CTO上,弥补了一把shell的基础,虽然没有精通,但是现在能够看懂还不是什么问题了。接下来我就把我印象中比较重要的知识点记录一下。shell中变量直接赋值是不能加空格的,也不需要封号。 比如 name=sean变量的间接赋值 read -p “g

2016-06-13 22:47:19 283

原创 linux下文件

系统调用read()将阻塞调用进程,直到数据被拷贝进用户态地址空间。但系统调用write不同,它在数据被拷贝到页高速缓存(延迟写)后马上结束。O_SYNC标志只影响写操作,它将阻塞调用进程,直到数据被有效地写入磁盘。对磁盘文件来说,read,write方法能够确定正被访问的数据所在物理块的位置,并激活块设备驱动程序开始传送。对于大部分文件系统来说,从文件中读取一个数据页就等于在磁盘上查

2016-04-26 08:54:51 595

原创 linux同步

如果进程正执行内核函数时,即它在内核态运行时,允许发生内核切换(被替换的进程是正在执行内核函数的进程),这个内核就是可抢占的。所有进程切换都是由宏switch_to()来完成的。使内核可抢占的目的是减少用户态进程的分派延迟,即从进程变为可执行状态到它实际开始运行之间的时间间隔。只有当内核正在执行异常处理程序(或系统调用),而且内核抢占没有被显式禁用,才可能抢占内核。内核抢占会引起不

2016-04-19 22:17:45 572

原创 linux下进程通信

管道被看作是打开的文件,但在已安装的文件系统中没有相应的映像。POSIX只定义了半双工的管道,因此即使pipe()系统调用返回了两个描述符,每个进程在使用一个文件描述符之前仍得把另外一个文件描述符关闭。在linux中,popen()和pclose()都包含在C函数库里面。对每个管道来说,内核都要创建一个索引节点和两个文件对象,一个文件对象用于读,一个文件对象用于写。

2016-04-17 15:37:02 497

原创 linux下信号

信号是很短的信息,可以被发送到一个进程或一组进程。发送给进程的唯一信息通常是一个数,依次来标识信号。POSIX标准引入了一类新的信号叫做实时信号,在linux中他们的编码范围是32-64.他们与常规信号有很大的不同,因为他们必须排队以便发送的多个信号能被接收到。如果一个常规信号被连续发送多次,那么,只有其中的一个发送到接收进程。发送给非运行进程的信号必须由内核保存,知道进程恢复执行。

2016-04-03 15:59:41 670

原创 linux系统调用

Unix通过系统向内核发出系统调用实现了用户态进程和硬件设备之间的大部分接口。系统调用通过软中断向内核发出一个明确的请求。lib的标准C库所定义的一些API引用了封装例程(其唯一目的就是发布系统调用)。通常情况下,每个系统调用对应一个封装例程,而封装例程定义了应用程序使用的API。一个API没必要对应一个特定的系统调用,API可能直接提供用户态的服务或者一个单独的API函数可能调用几个

2016-04-03 13:54:50 485

原创 linux下进程

从内核的观点来看,进程的目的就是担当分配系统资源(CPU时间,内存等)的实体。尽管父子进程共享含有程序代码的页,但是他们各自有独立的数据拷贝(堆和栈),因此子进程对一个内存单元的修改对父进程是不可见的。多线程应用程序多个执行流的创建,处理,调度整个都是在用户态进行的(通常使用POSIX兼容的pthread库)。两个轻量级进程基本上可以共享一些资源,诸如地址空间,打开的文件等等,只要其中

2016-04-01 22:09:30 1054

原创 linux下时间子系统

每个architecture相关的代码中要有实现clock event会让clock source模块。一般而言,每个CPU形成自己的一个小系统,有自己的调度,有自己的进程统计,这个小系统都是拥有自己的tick设备,而且是唯一的。硬件有多少个timer硬件就注册多少个clock event device,各个CPU的tick device会选择自己合适的那个clock event设备。

2016-03-29 21:34:52 681

原创 linux下内存

MMU由一个或一组芯片组成,其功能是把逻辑地址映射为物理地址,进行地址转换(MMU是CPU的一部分)机器指令仍然用逻辑地址指定一个操作数的地址或一条指令的地址MMU包含两个部件:分段部件和分页部件,分段机制将逻辑地址转换为线性地址,分页机制把线性地址转换为物理地址。系统的运行速度一般是被CPU从内存中取得指令和数据速率限制的。TLB(translation lookside buf

2016-03-29 11:07:34 784

原创 VMware配置静态IP

已经很久没有在Windows上用虚拟机了,因为最近工作需要用到虚拟机所以在笔记本上安装了VMware(为了搭建这个环境还专门买了一台二手的笔记本电脑!!!).  首先VMwareWorkstation 12上安装了ubuntu14.04安装时间大概花了一个小时左右。  一开始没有VIM编辑器,这对于在在linux上做开发的自然是不可以的。sudo apt-get install vim

2016-03-15 21:22:38 441

原创 视频基本知识

一个序列的第一个图像叫做IDR图像(立即刷新图像)。只要显示屏幕分辨率>=1280*720即可分为HD等级。SPS(序列参数集)/PPS(图像参数集):包含了初始化H.264解码器所需要的信息参数,包括编码用profile,level,图像宽和高,deblock滤波器H.264把图像分为一帧(frame)或两场(filed);帧又分为片(slice),片由宏块(MB)组成,宏块是编码处

2016-02-23 21:19:17 984

原创 Ethernet/IP

之前花了一段时间看过Ethernet/IP的东西,虽然最后没有移植成功,但是依旧是学到了不少的东西。  熟悉了STM32F407的开发板,在大学期间,有上过嵌入式系统这门课用的是STM32F103系列的,也算是对这次任务打下了一定的基础。  了解了LwIP协议和uc/os ii实时操作系统。  对协议栈也有了一定的概念。

2016-02-22 22:22:15 7147 3

原创 linux启动代码分析

在bootloader将linux的uImage搬到指定内存空间地址并且引导linux内核启动后,linux首先从arch/xxx_cpu/kernel/head.S先一步一步执行汇编代码。  (1)加载bootloader_tags的地址  (2)使能指令cache  (3)使能数据cache  (4)使能MMU  (5)初始化TLB  (6)建立中断异常向量表  (

2016-02-21 20:45:23 1957

原创 linux下模块编译基本知识和格式

Make -c 只编译不链接Make -C切换到指定目录再执行make过程make -C $(LINUXROOT) M=$(PWD)EXTRA_CFLAGS="$(EXTRA_FLAGS)" modules当用户需要以某个内核为基础编译一个外部模块的话,程序会自动到指定的dir目录中查找模块源码,将其编译,产生ko文件。

2016-02-21 15:49:39 1136

原创 linux下I/O体系结构和设备驱动程序

一台计算机包括集中不同类型的总线,它们通过被称为“桥”的硬件设备连接在一起。任何I/O设备有且仅能连接一条总线。linux内核包含了辅助函数来简化汇编语言指令的访问I/O端口(inb(),inb_p(),outb(),outb_p()).通常I/O设备驱动程序为了探测硬件设备,需要盲目地向某一I/O端口写入数据,但是,如果其他硬件设备已经使用了这个端口,那么系统就会崩溃,为了防止这种情

2016-02-21 14:04:13 1011

原创 linux下VFS

通用文件模型由下列对象类型组成:超级块对象:存放已安装文件系统的有关信息索引节点对象:存放关于具体文件的一般信息文件对象:存放打开文件和进程之间交互的有关信息目录项对象:存放目录项与对应文件进行链接的有关信息  所有的超级块对象都以双向循环链表的形式链接在一起。  任何基于磁盘文件系统都需要访问和更改自己的磁盘分配位图,以便分配或释放磁盘块。  文件系统处理文件所需要的

2016-02-20 14:51:51 426

原创 linux下中断子系统

request_irq().  request_thread_irq().//分配中断资源,使能中断线和中断处理函数。  几个比较关键的数据结构struct irqactionstruct irq_descstruct irq_chip //hardware interrupt chip descriptor在arch/xxx_cpu/xxx_sys/irq.c下

2016-02-16 22:34:32 1302

原创 linux下MTD驱动

因为之前不是很了解文件系统,所以要探究一下mtd来加深一下印象。

2016-02-16 21:58:02 6787

原创 linux下网络驱动

在stmmac_dvr_probe函数中,一开始获取linux中的硬件资源,分配一个网络设备的内存空间alloc_etherdev(本质还是调用alloc_netdev_mqs()).,接下来比较重要的是stmmac_mac_device_setup()函数。里面将mac_device_info中的三个operations注册了回调函数,以便让接下来的函数stmmac_probe()进行调用。

2016-02-15 22:20:56 1091

原创 linux下SPI驱动

进入xxx_spi_probe()函数,首先分配spi_master内存空间,spi主控制器被抽象为spi_master  spi_bitbang是对spi主控制器的硬件操作函数和参数的封装。  在probe中要注册上面这些回调函数。  之后就是获得一些platform的资源(时钟,中断,内存空间等),再对spi主控制器进行复位(控制,地址,数据和命令进行写零操作)。  之后调用s

2016-02-15 21:41:07 856

原创 linux下TTY驱动(serial)

之前因为是刚入门所以看了串口有关的东西,一开始看了stm32f407上的串口编程(Keil MDK),那算是裸的驱动了。  linux下的串口如果要正常工作的话,就必须通过TTY这个子系统,TTY子系统算是比较复杂,概念也是比较复杂的,有三类驱动程序:控制台,串口,pty。任何tty驱动程序的主要数据结构是结构tty_driver.概念性的问题还是去看一下《linux设备驱动程序》这本书,它也

2016-02-15 20:28:35 3906

原创 linux下I2C驱动

说起Linux下的子系统,I2C子系统已经算是比较简单的框架了。  首先相关代码在driver/i2c下.built-in.o.cmd .i2c-dev.o.cmd algos/ i2c-boardinfo.c i2c-core.h i2c-dev.o muxes/.i2c-boardinfo.o

2016-02-14 21:48:29 1146

原创 platform_device和platform_driver

上班已经3个月了,本来就打算工作中有什么收获就能够写出来的,虽然这段时间里看了很多linux子系统(I2C,TTY,SPI,MTD,网络,USB)相关的内容,但是,因为没有做过比较多的实践经验,所以不敢马上写出来,但是又怕过了段时间很多东西都忘了,所以还是先把这段时间的感悟和心得写下来。如果要开始写linux系统的话,我觉得就不得不从platform_device和platform_driver开

2016-02-14 19:59:53 728

原创 opus交叉编译

从上个礼拜四接到带我的老师的任务,了解一下开源的音频编解码库opus,并且将这个开源库交叉编译到sc6138的板子上,看一下测试程序运行时cpu使用率。 先去opus.org上将源代码下载下来,同时看了一点点的Documentation。一开始有点不知所措,按照之前的编译顺序(1)./configure (2)make (3)make install了一番,现在电脑x86_64上跑了一下测试程

2015-12-22 21:30:01 3483 1

原创 MPlayer上支持RTSP流媒体(live555作为流媒体播放器)

条件: 在中天CK810的CPU上运行linux12.04操作系统以tft传输方式加载uImage;考虑到针对性,一开始mplayer的编译选项并不是mplayer官网上下载下来的configure,很多条件都是disable的,链接文件和链接库也是有自己的指定位置 -Ixx -Lxx   (1)查找player播放RTSP流的命令 mplayer rtsp://192.168.1.2:/

2015-11-27 21:39:25 5755

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除