<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Destihang的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Destihang</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Destihang]]></copyright><item><title><![CDATA[嵌入式系统设计师]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/71023735</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/71023735</guid><author>Destihang</author><pubDate>Sun, 30 Apr 2017 17:46:57 +0800</pubDate><description><![CDATA[这两个月来，因为公司项目比较多，所以工作量也比较大，学习的时间比较少。但是从工作中还是学到了不少，特别是cpu编译器相关方面的东西。
打算下半年考一个中级软件工程师的证书，就把这段时间需要注意的东西纪录下来。
CPU是计算机的控制中心，主要由计算器，控制器，寄存器组和内部总线等部件组成。控制器由程序计数器，指令寄存器，指令译码器，时序产生器和操作控制器组成。
程序计数器是专用寄存器，具有寄存]]></description><category></category></item><item><title><![CDATA[fat32文件系统]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/55270310</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/55270310</guid><author>Destihang</author><pubDate>Thu, 16 Mar 2017 18:14:55 +0800</pubDate><description><![CDATA[MBR主引导记录由446(0x1BE)个字节的引导代码，64字节的主分区（4个）表及两个字节的签名值“55 AA”组成。]]></description><category></category></item><item><title><![CDATA[libuv流程]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51872052</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51872052</guid><author>Destihang</author><pubDate>Mon, 20 Feb 2017 19:01:38 +0800</pubDate><description><![CDATA[考虑到系统性能的问题，现在很多流程都使用了异步机制，这样可以更快的返回去做另外的事情，但是异步也存在一个很大的问题，就是不知道何时会完成之前的事情，很多流程就变得不够可控，现在在项目中就碰到过因为此问题而产生的bug，因为不可控，所以多线程之间资源的互斥和保护就变的异常重要，否则一不小心就会因为修改了本部应该修改的线程或进程资源而导致系统crush掉。
现在使用的是libuv，它是一个第三方的异]]></description><category></category></item><item><title><![CDATA[linux下USB驱动]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/50718869</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/50718869</guid><author>Destihang</author><pubDate>Sun, 15 Jan 2017 23:01:32 +0800</pubDate><description><![CDATA[USB拓扑结构不是以总线方式的，而是一棵由几个点对点的连接构成的树，连接线由4根电缆组成（电源，地线，两个数据线）。
USB主控制器负责询问每一个USB设备是否有数据需要发送，也就是说一个USB设备在没有主控制器要求的情况下是不能发送数据的。
USB端点（endpoint）：只能往一个方向传送数据。
控制端点：用于配置设备获取设备信息，发送命令到设备或获取设备的状态报告
中断端点：每当US]]></description><category></category></item><item><title><![CDATA[linux下安全备份升级（网页）]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/53383052</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/53383052</guid><author>Destihang</author><pubDate>Tue, 29 Nov 2016 20:05:32 +0800</pubDate><description><![CDATA[如果在大部分开发完成，并且已经交付完成软件之后，如果产品要可持续的发展，并且与客户有长久合作关系，不可避免的需要进行技术支持，同样的，只要是人写出来的代码，就一定会存在bug，问题严重的还会影响产品的产量。所以，升级的必须的，现在我所知道的升级方式有三种：
一。直接把产生的二进制bin文件通过烧录器烧写到flash里面，在嵌入式linux中一般有三种类型的bin文件，分别是bootloader，]]></description><category></category></item><item><title><![CDATA[linux下pm子系统]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/53385078</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/53385078</guid><author>Destihang</author><pubDate>Tue, 29 Nov 2016 19:38:22 +0800</pubDate><description><![CDATA[工作中分配了低功耗相关方面的内容，查了相关资料，linux更是有一套pm相关的子系统。
首先需要说明的是既然是低功耗，那么SoC就要支持相关低功耗。
如果要进入低功耗模式，有一种方式可以在用户空间通知内核空间，echo “stanby" > /sys/power/state至于字符串的内容，需要在/kernel/power/suspend.c去查看或者修改。
linux中/sys/中是内核空]]></description><category></category></item><item><title><![CDATA[浙江软考 程序员]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/52503639</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/52503639</guid><author>Destihang</author><pubDate>Tue, 13 Sep 2016 22:10:43 +0800</pubDate><description><![CDATA[计算机系统中，数值一律用补码来表示和存储。原因在于，使用补码，可以将符号位和数值域统一处理，同时加减法也可以统一处理。此外，补码与源码相互转换，其运算过程是相同的，不需要额外的硬件电路。
原码就是符号位加上真值的绝对值，即第一位表示符号，其余位表示值。
正数的反码是其本身，负数的反码是在其原码的基础上，符号位不变，其余各个位取反。
正数的补码是其本身，负数的反码是在其原码的基础上，符号位不变]]></description><category></category></item><item><title><![CDATA[spi nor flash驱动]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/52345980</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/52345980</guid><author>Destihang</author><pubDate>Sun, 28 Aug 2016 16:20:39 +0800</pubDate><description><![CDATA[嵌入式系统中flash的作用相当于PC上的硬盘来存放永久的数据，不像内存那样掉电数据就会消失。而我们使用的是nor flash，操作也比较简单，直接读取flash的地址就可以将数据通过memcpy到内存(当然是需要给相关寄存器配一些值)，然后传给上层使用。
专用SPI控制器主要有CTRL，CMD，DATA，ADDR，STATUS寄存器。
相关命令
 /*      Command      ]]></description><category></category></item><item><title><![CDATA[read()函数流程(USB读取文件)]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/52266622</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/52266622</guid><author>Destihang</author><pubDate>Sun, 21 Aug 2016 17:32:31 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[程序员的自我修养-链接装载与库笔记]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/52074809</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/52074809</guid><author>Destihang</author><pubDate>Mon, 01 Aug 2016 22:59:53 +0800</pubDate><description><![CDATA[花了近一个礼拜的时间算是把这本书看完了大部分的内容，因为工作接触的是linux有关windows的部分没有去看。个人觉得如果要做底层的话，这本书不得不看，看完之后虽然没有全部理解，但是对于我之前的知识体系结构有了很大的一个补充。现在就要记录下书中一些重难点，可以以后去回顾，将基础知识打扎实。
为了协调I/O设备与总线之间的速度，也为了能够让CPU能够和I/O设备进行通信，一般每个设备都会有一个相]]></description><category></category></item><item><title><![CDATA[linux下DMA驱动]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/50706524</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/50706524</guid><author>Destihang</author><pubDate>Wed, 20 Jul 2016 23:05:46 +0800</pubDate><description><![CDATA[/**
   * 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:]]></description><category></category></item><item><title><![CDATA[mount函数分析]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51824579</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51824579</guid><author>Destihang</author><pubDate>Wed, 06 Jul 2016 22:13:53 +0800</pubDate><description><![CDATA[首先判断挂载的类型是否符和已经定义好的文件系统类型。里面的实现方式是比较对应字符串是否相同。
mount_findfs(g_bdfsmap, filesystemtype);
其中g_bdfsmap就是已经定义好的文件系统类型。

static const struct fsmap_t g_bdfsmap[] =
 {
 #ifdef CONFIG_FS_FAT
     { "vfat"]]></description><category></category></item><item><title><![CDATA[ADC按键驱动]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51823926</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51823926</guid><author>Destihang</author><pubDate>Mon, 04 Jul 2016 22:16:58 +0800</pubDate><description><![CDATA[ADC是有通道的概念的，每一个GPIO可以被复用一个ADC按键，公司芯片有8个ADC通道。
至于为什么要用ADC按键，因为按键可以通过形成一个阵列的方式，每一个开关按键分到不同的电压，通过ADC就能软件判断到底是哪一个按键在产生作用。这样的话就大大提高了gpio管脚 的利用率。
首先设置ADC控制器CFG模块使能位。读取ADC控制器中断位，并且清相对应的中断。当然最终要打开ADC相对应的pad]]></description><category></category></item><item><title><![CDATA[stat()函数解析]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51793627</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51793627</guid><author>Destihang</author><pubDate>Thu, 30 Jun 2016 22:52:57 +0800</pubDate><description><![CDATA[在完成任务的过程中遇到了一个问题就是调用stat函数获取文件信息的时候有些文件总是返回错误代码22（EVAL），后来一步一步跟踪到内核源码里面发现原来是文件名的长度超出了规定的长度。
因为是在nuttx上使用的该系统调用，所以以为是不是其中有bug，最后才知道是配置文件.config中配置CONFIG_FAT_MAXNAME为32太小了。之前也没有了解过该系统调用，所以就来仔细的看一看这个函数。]]></description><category></category></item><item><title><![CDATA[LCD驱动]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51764607</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51764607</guid><author>Destihang</author><pubDate>Sun, 26 Jun 2016 22:50:15 +0800</pubDate><description><![CDATA[因为上头任务的安排，需要将Linux上的LCD驱动移植到Nuttx(一种实时操作系统，据说现在很火，还是一个外国人自己在维护，这真是一个大牛！有很多接口和Linux上的接口都不怎么相同，甚至有的都没有相对应的接口，同时该操作系统没有底层和应用层的概念，最后所有的程序镜像都合成一个nuttx镜像，该镜像中有已经有事先写好的程序)。因为之前已经在Linux上已经写好了驱动程序，所以任务还是比较简单的，]]></description><category></category></item><item><title><![CDATA[shell编程和正则表达式相关知识]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51661033</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51661033</guid><author>Destihang</author><pubDate>Mon, 13 Jun 2016 22:47:19 +0800</pubDate><description><![CDATA[工作了大半年了，发现学习嵌入的我，还需要对shell脚本有一定的了解，因为个人感觉Makefile有很多的基础语法就是shell基础。所以在51CTO上，弥补了一把shell的基础，虽然没有精通，但是现在能够看懂还不是什么问题了。接下来我就把我印象中比较重要的知识点记录一下。
shell中变量直接赋值是不能加空格的，也不需要封号。 比如 name=sean
变量的间接赋值 read -p “g]]></description><category></category></item><item><title><![CDATA[linux下文件]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51194683</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51194683</guid><author>Destihang</author><pubDate>Tue, 26 Apr 2016 08:54:51 +0800</pubDate><description><![CDATA[系统调用read（）将阻塞调用进程，直到数据被拷贝进用户态地址空间。但系统调用write不同，它在数据被拷贝到页高速缓存（延迟写）后马上结束。
O_SYNC标志只影响写操作，它将阻塞调用进程，直到数据被有效地写入磁盘。
对磁盘文件来说，read，write方法能够确定正被访问的数据所在物理块的位置，并激活块设备驱动程序开始传送。
对于大部分文件系统来说，从文件中读取一个数据页就等于在磁盘上查]]></description><category></category></item><item><title><![CDATA[linux同步]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51193186</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51193186</guid><author>Destihang</author><pubDate>Tue, 19 Apr 2016 22:17:45 +0800</pubDate><description><![CDATA[如果进程正执行内核函数时，即它在内核态运行时，允许发生内核切换（被替换的进程是正在执行内核函数的进程），这个内核就是可抢占的。
所有进程切换都是由宏switch_to（）来完成的。
使内核可抢占的目的是减少用户态进程的分派延迟，即从进程变为可执行状态到它实际开始运行之间的时间间隔。
只有当内核正在执行异常处理程序（或系统调用），而且内核抢占没有被显式禁用，才可能抢占内核。
内核抢占会引起不]]></description><category></category></item><item><title><![CDATA[linux下进程通信]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51050757</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51050757</guid><author>Destihang</author><pubDate>Sun, 17 Apr 2016 15:37:02 +0800</pubDate><description><![CDATA[管道被看作是打开的文件，但在已安装的文件系统中没有相应的映像。
POSIX只定义了半双工的管道，因此即使pipe()系统调用返回了两个描述符，每个进程在使用一个文件描述符之前仍得把另外一个文件描述符关闭。
在linux中，popen()和pclose()都包含在C函数库里面。
对每个管道来说，内核都要创建一个索引节点和两个文件对象，一个文件对象用于读，一个文件对象用于写。]]></description><category></category></item><item><title><![CDATA[linux下信号]]></title><link>https://blog.youkuaiyun.com/Destihang/article/details/51050100</link><guid>https://blog.youkuaiyun.com/Destihang/article/details/51050100</guid><author>Destihang</author><pubDate>Sun, 03 Apr 2016 15:59:41 +0800</pubDate><description><![CDATA[信号是很短的信息，可以被发送到一个进程或一组进程。发送给进程的唯一信息通常是一个数，依次来标识信号。
POSIX标准引入了一类新的信号叫做实时信号，在linux中他们的编码范围是32-64.他们与常规信号有很大的不同，因为他们必须排队以便发送的多个信号能被接收到。
如果一个常规信号被连续发送多次，那么，只有其中的一个发送到接收进程。
发送给非运行进程的信号必须由内核保存，知道进程恢复执行。]]></description><category></category></item></channel></rss>