- 博客(30)
- 资源 (2)
- 收藏
- 关注
转载 【linux学习笔记】Linux内核学习经验总结
转载了大佬的文章,文章对我这种菜鸟来讲启发很大原文链接:http://blog.chinaunix.net/uid-24669930-id-4039377.html侵删:yaoxitong123@hotmail.com开篇学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。内核学习,一偏之见;疏...
2020-02-17 18:37:41
247
原创 【linux学习笔记】内存管理
页(page)内存管理的基本单位。这和体系结构中MMU有关。32位的体系结构支持4K的页。struct page用于管理一个物理页,表示这个页是不是“脏”、被引用的次数、映射的虚拟地址等信息。区(zone)内核采用区对页进行分组。主要是解决以下两个问题:1.一些硬件只能采用特定的内存执行DMA操作。2.一些体系结构的物理内存寻址范围大于虚拟内存的寻址范围,所以并不是所有的页都能映射到...
2020-02-13 17:19:56
203
1
原创 【linux学习笔记】SPI驱动
本部分是本人学习linux的学习笔记,本人系菜鸟一枚,如有错误欢迎指正。个人邮箱:yaoxitong123@hotmail.comSPI特点:全双工,速度高,4个pin以SPI总线为代表,I2C、USB在驱动设计的时候都采用了分隔的思想(注意区分分层思想):举个例子L138,它有一个ARM核和一个DSP核,如果此时外设有3个设备为SPI总线,那么理论上需要的驱动数量有6个(2*3);但实际...
2020-02-13 15:56:48
528
原创 【C语言学习笔记】typedef的运用
参考文章:https://www.cnblogs.com/ktao/p/8578074.html在linux内核中经常遇到这种typedef操作,一直以为在C中其意义与define相似,但是现在发现是我想简单了。四大意义:1.定义一种类型的别名,而不只是简单的宏替换。typedef char *pStr1; define pStr2 char *; pStr1 s1, s2; ...
2020-02-11 18:23:06
159
原创 【linux学习笔记】非阻塞IO轮询(也叫IO复用)
一. 非阻塞操作非阻塞操作的进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。这就是我们常说的“轮询”。这是一种比较浪费CPU的方式。但是可以通过信号等方式以异步的形式提高CPU的利用率。使用非阻塞I/O 的应用程序可借助轮询函数来查询设备是否能立即被访问,用户空间调用select()、poll()和epoll()接口,设备驱动提供poll()函数。设备驱动...
2020-02-10 19:39:14
875
原创 【linux学习笔记】中断上下文
中断是我们的老朋友了,在裸机开发中中断处于不可或缺的地位。在linux开发中,也有一套自己的中断体系。与裸机开发最大的不同是,操作系统通常将中断划分为了上下文。比如上文处理硬件请求,而下文则对数据进行处理,网卡是一个典型的例子。中断上文相关函数接口申请一个中断:int request_irq(unsigned int irq, irqreturn_t (*handler)(int...
2020-02-04 14:02:10
333
原创 【ARM学习笔记】ARM中断嵌套模式理解
之前一直是做DSP,DSP上有中断嵌套,为了保证在多中断的情况下终端不丢失,在读取完硬件数据后会重新开启中断。因此想当然的以为ARM架构也存在这样一种根据优先级的抢占机制。但是事实上不是的,ARM架构中只有FIQ模式才能打断IRQ中断模式。而内核中,为了防止中断丢失直接在SVC模式下执行中断服务程序。以下是来自韦东山老师的一盘文章:几天前一个学生问我ARM中断嵌套的问题,我才发现原来在我心中理...
2020-02-04 14:01:53
828
1
原创 【linux学习笔记】内核同步
临界区就是访问、操作共享资源的代码段。为什么需要进行同步?是因为存在任务的抢占和重新调度,或者多核处理器的并发导致多个进程可以同时进入临界区修改共享资源。可能造成并发的原因:1)中断;2)软中断和tasklet,内核可以在任何时候环形或者调度软中断和tasklet打断当前正在执行的代码;3)内核抢占;4)进程进入睡眠状态;5)多个处理器同时执行代码。同步过程中常见的几个BUG:...
2020-02-03 18:40:17
109
原创 【linux学习笔记】Nandflash驱动程序实现
nandflash裸机原理分析常见的flash芯片如nand和nor。后者比较“高级”,有数据线和地址线,一般支持内存一样的数据读取,写数据时需要按照datasheet发送命令代码,数据较前者稳定,可擦除次数少,编程速度较前者满;前者则是“皮实耐操”的典型代表,无数据线、地址线,数据、命令、地址都从IO口输入、输出,因此想要读写nand,必须要通过IO口,拉高/拉低一系列引脚,如ALE(addr...
2020-01-31 23:27:09
581
转载 自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
转自:http://blog.csdn.net/wh_19910525/article/details/11536279自旋锁的初衷:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。单处理器的自旋锁:首先,自旋锁的目的如果在系统不支持内核抢占时,自旋...
2020-01-30 15:04:32
196
原创 【linux学习笔记】linux块驱动设备基本框架探索及尝试
在此首先对比一下之前经常打交道的字符型驱动设备。二者的区别主要可以概括为支不支持随机访问,字符驱动设备如键盘,执行读命令只能获取一个按照顺序的字符流,如“linux”,对这个字符流随机的访问是没有意义的;但是块驱动设备最大的不同是,它可以支持用户程序随机的访问,比如访问nandflash的某个扇区等操作。写一个字符型驱动涉笔的大致套路就是,首先确定该字符型驱动设备的设备号,随后,在这个设备号下,...
2020-01-29 22:45:47
179
转载 kmalloc()、kzalloc()、vmalloc()对比
我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free()。注意:动态申请的内存使用完后必须要释放,否则会造成内存泄漏,如果内存泄漏发生在内核空间,则会造成系统崩溃。那么,在内核空间中如何申请内存呢?一般我们会用到 kmalloc()、kzalloc()、vmalloc() 等,下面我们介绍一下这些函数的使用以...
2020-01-29 22:34:55
224
原创 如何实现LCD显示摄像头图像(2)
上图是LCD显示摄像头图像的原理,上部分完成了摄像头参数的设置以及数据的读取。这部分要做的是采集到摄像头图像之后的图像转换问题。摄像头采集的图像可能是YUV格式,也可能是MJPEG格式,统一的需要转化成RGB格式。因此需要实现的是convert文件夹下convert_manager.c、yuv2rgb.c、mjpeg2rgb.c、rgb2rgb.c文件,以及头文件。实现convert_mana...
2020-01-13 15:16:40
1015
翻译 CCS多级优化
–O0简化控制流图分配变量到寄存器进行循环旋转(loop rotation)删除未使用的代码简化表达式和语句内联声明为inline的函数–O2执行局部复制/常量传递删除未使用的赋值语句删除局部共有表达式–O3进行软件流水进行循环优化删除全局共有子表达式删除全局未使用的赋值语句把循环中的对数组的引用转化为递增的指针形式循环展开(loop unrolling)–O4...
2020-01-13 10:17:03
1984
翻译 ARM编程优化方式
通过一定的风格来编写C程序,可以帮助C编译器生成执行速度更快的ARM代码。下面就是一些与性能相关的关键点:对局部变量、函数参数和返回值要使用signed和unsigned int类型。这样可以避免类型转换,而且可高效地使用ARM的32位数据操作指令。最高效的循环体形式是减计数到零(counts down to zero)的do-while循环。展开重要的循环来减少循环的开销。不要依赖编译...
2020-01-13 10:11:36
1356
原创 ucosII学习之消息队列
ANSI C中,malloc和free有自己的缺陷:1.内存碎片;2.运行时间不能确定。ucosii的内存管理方法:将内存设置成分区,每个分区有若干个块,申请内存时,从分区中取出若干个块,施放时将这些块放回原分区。OSMemCreate()建立一个分区,与malloc类似,需要先申请一个空指针,再将这个空指针作为参数,除此之外还有分区中块的大小和分区中块的数量;函数调用位置在OSInit()...
2020-01-12 16:13:51
783
转载 实时系统与非实时系统的区别
嵌入式操作系统分为实时系统和非实时系统两类,常见的实时系统有:ThreadX、FreeRTOS、ucOS;常见的非实时系统有:windows、linux、Android。两类操作系统的主要区别在于任务调度处理方式不同,常用的任务调度方式有两种:基于任务优先级的任务调度方式和基于时间片的任务调度方式。基于任务优先级的调度方式:一旦内核把资源分配给某进程后,便让该进程一直执行,直到该进程完成或...
2020-01-12 15:40:24
3785
原创 如何实现LCD显示摄像头图像(1)
摄像头数据的读出首先需要将摄像头采集到的数据读出,那么就需要摄像头采集到数据的基本格式以及相关操作函数:typedef struct VideoDevice { int iFd; int iPixelFormat; int iWidth; int iHeight; int iVideoBufCnt; int iVideoBufMaxLen; ...
2020-01-11 11:22:01
928
原创 ucosII学习之时间管理
OS_Time.cOSTimeDly()这个函数延时的时间长度是规定好的时钟节拍长度;OSTimeDlyHMSM()延时的时间可以精确到ms;但是要注意延时的换算节拍数目不能超过65535,否则不能恢复;OSTimeDlyResume()恢复正在延时中的任务,参数是优先级(任务ID);正在等待资源(比如等待互斥量,消息队列、消息邮箱)而挂起的任务可以被认为是延时超时而被这个函数恢复,...
2020-01-10 22:49:50
190
原创 ucosII学习之任务管理
OS_TASK.cOSTaskCreat在进行任务调度之前(OSStatr())需要至少建立一个任务;任务不能在ISR中建立;四个参数:代码指针,参数指针,任务栈栈顶指针,优先级;此函数向下兼容。OSTaskCreatExt这个函数是上面函数的附加,也就意味着调用这个函数会耗费更多的资源;多了一些参数,栈有关的用于任务栈校验;opt参数的选在ucos_II.h中,如果任务需要进行浮点运算...
2020-01-10 21:57:57
174
原创 USB摄像头驱动程序分析
uvc驱动程序主要位于3.42内核\drivers\media\video\uvc文件夹中。由于本身十分复杂,在此只做简单分析。这幅图来源于UVC的规格书。可以看到一个完整的UVC设备主要分为两个部分:通过VideoControl Interface来控制,通过VideoStreaming Interface来读视频数据,VC里含有多个Unit/Terminal等功能模块,可以通过访问这些...
2020-01-10 20:05:39
693
原创 ucosII学习之内核结构
ucosII中理论上可以有64个任务,但是优先级0-3和61-64不能使用,所以可以使用的优先级有56个;os的5种状态:睡眠(没有交给系统管理的任务或者已经被删除的任务)、就绪(调用创建函数后的任务)、运行(osstart())、等待(延时的任务或者等待事件发生而挂起的任务)、中断状态;任务控制块OS_TCB:一个结构体,任务创建的时候初始化主要配置一些如堆栈的任务基本参数;代码中存在一个...
2020-01-08 23:47:48
138
原创 DSP28335移植ucosii
在https://www.micrium.com/ 中,存在一个已经移植好的28335工程。但是只是实现一些简单的功能,缺乏如寄存器、中断向量表等底层实现。本博客的目的就是讲原先的裸机工程移植到ucosii工程上,实现ADC中断上下文。cmd文件移植CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间。C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真...
2020-01-04 23:09:08
3936
1
原创 一小时学会网络编程
网络通讯数据传输三要素:源、目的、长度服务器:被动的相应请求。客户端:主动的发起请求。UDP和TCP:UDP传输,如传输视频,某一帧数据丢失关系也不大,是无连接的传输;但是TCP主要是传输文件或者控制命令这些每一帧都很重要的信息,是可靠的有连接的传输。TCP文件读写:fd=open(“文件名”);read(fd,buf,len);write(fd,buf,len);服务...
2019-12-30 23:34:55
195
原创 多线程实现电子相框输入
多线程输入基本框架初始化时,创建子线程;主线程调用休眠函数进入休眠状态,等待被子线程唤醒;子线程中,分别调用各个设备的事件函数,随即各个子线程进入休眠状态;当输入事件发生的时候,唤醒子线程,子线程唤醒主线程;在主线程中对事件进行处理。在原先实现查询方式的工程中修改:input_manager.c中:创建主线程休眠函数,有之前程序的事件处理函数修改;初始化函数中创建子线程;创建子线程函...
2019-12-26 10:16:48
84
原创 采用select的方式实现多输入
在上一篇博客中,我才用了轮询的方法实现LCD文本的多输入控制。主程序如下:while (1) { if (0 == GetInputEvent(&tInputEvent)) { if (tInputEvent.iVal == INPUT_VAL_DOWN) { ShowNextPage(); } else if (tInputEvent.iVal...
2019-12-23 19:05:31
224
转载 SRAM DRAM SDRAM的区别
问题1:什么是DRAM、SRAM、SDRAM?答:名词解释如下,DRAM,动态随即存取器,需要不断的刷新,才能保存数据,而且是行列地址复用的,许多都有页模式;SRAM,静态的随机存储器,加电情况下,不需要刷新,数据不会丢失,而且一般不是行列地址复用的;SDRAM同步的DRAM,即数据的读写需要时钟来同步。问题2:为什么DRAM要刷新,SRAM则不需要?答:这是由RAM的设计类型决定的,DRA...
2019-12-21 21:21:03
688
原创 为什么U-boot程序中要设置成svc模式?
ARM的7中工作模式用户模式(USR):正常程序执行模式,不能直接切换到其他模式。==是用户程序的运行模式。==因此想要访问硬件资源或者切换到其他模式只能通过中断。系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权。运行特权级的操作系统任务。管理模式(SVC):概括:1.系统复位、开机时自动进入该模式。2.当操作系统申请硬件资源时,由软件中断进入...
2019-12-21 21:08:59
928
原创 在linux3.4.2内核配置freetype
在PC上配置环境将freetype移动到/user/local/目录下。sudo tar -xjf freetype-2.4.10.tar.bz2sudo mv freetype-2.4.10 freetype-2.4.10_pccd freetype-2.4.10_pc/./configure //配置mak...
2019-12-19 23:37:59
506
原创 移植触摸屏驱动程序
tslib是什么:Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。一、实验环境硬件: JZ2440开发板内核版本: Linux-3.4.2交叉工具链:arm-linux-gcc-4.3.2tslib版本: tslib-1.4二、安装解压文件。tar xzf tslib-1.4.t...
2019-12-19 18:56:00
287
经验模态分解(EMD)对复杂信号进行分解的matlab实现
2017-12-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人