自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

林世霖的技术博客

专注编程技术普及20年

  • 博客(30)
  • 资源 (11)
  • 收藏
  • 关注

原创 C语言(跳转语句中的流氓)

别跟我提goto,那孙子除了能在出错处理讨两口饭吃之外,一无是处! 拓展:goto语句一般的语法规则如下:从上面的代码看到goto的语法很简单,就是直接跳转到指定的标签处,所谓的标签(如例子中的label)指的是后面带一个冒号的标识符。要注意一下,goto的这种跳转是“无条件”跳转,也就是说goto跟标签之间可以跨越代码块,从而破坏其中的栈逻辑,对的

2016-03-31 11:00:16 11702 4

原创 C语言(浮点精度)

关于C语言的浮点数精度问题,很多人存在误解,他们往往认为精度指的是float、double和long double三种数据类型,这是片面的。 拓展:浮点数的二进制存储细节:对于每个不同的浮点数,都有相应的最小可辨识精度(即δ),此最小可辨识精度随着该浮点数的数值变化而变化,具体究竟是多少要具体分析该浮点数的二进制存储内部细节,找到其指数域之后才能确定,我们根

2016-03-29 10:06:20 11384 1

原创 C语言(总有刁民想害朕)

“总有刁民想害朕,他们总说:我是老古董,既没有面向对象的功能,又不提供泛型编程,更可恨的是:害得他们挂科!挂科是什么鬼?” —— C语言 拓展:面向对象是一种思想,一种构建软件结构的思路,而不是某种编程语言,C语言即便没有类,但同样可以使用结构体和函数指针,来实现面向对象的思想。整个Linux内核除了极少量的汇编代码,全部都是C语言编写的,其中的设备模型、虚拟文件系

2016-03-28 13:44:29 886

原创 C语言(对内存的理解)

很多人学习C语言总是不得要领总是不入门,明明听了很多课,明明买了很多书,却无法独自写出规范像样的代码,要领在哪里?门在哪里? 拓展:学习编程要踏入的第一个门槛是对内存的深刻理解,记住一句话:任何数据、变量、指针甚至是函数,都是一块一块的内存。对他们取址,就是取得这块内存的首地址。从中我们还要有一个非常重要的结论:内存从本质上来讲都是一样的,所以理论上你只要有权限,那

2016-03-27 16:16:02 2116

原创 Linux并发(易混淆的基本API)

初学者十有八九都会误以为signal函数是给进程发信号的,误以为kill函数是杀死进程的,还误以为exec函数栈是用来创建新进程的。 拓展:正确的理解是:1,signal()用来注册一个信号的出发行为。2,kill()用来向进程或者进程组发送指定信号。3,exec函数族用来改变一个现有进程的代码段。编辑

2016-03-26 11:29:02 421

原创 Linux并发(函数的可重入性)

可重入函数是并发编程中必须要考虑的问题,否则代码就会有隐患,更糟糕的是这些隐患往往只能在特定场景下才能复现。 拓展:一个函数所谓的可重入性,是在多线程的语境下的概念:一个函数如果同时被多条线程调用,他返回的结果都是严格一致的,那么该函数被称为“可重入”函数(reentrance funciton),否则被称为“不可重入”函数。 在使用不可重入函数时要注意:多

2016-03-25 13:49:06 1423

原创 Linux并发(POSIX信号量)

System-V的信号量是老古董,除非万不得已,否则我们一般用POSIX信号量,好用、简单、靠谱。 拓展:POSIX信号量分为两种,分别是POSIX无名信号量和POSIX有名信号量,这两种信号量比之前介绍的system-V的信号量机制要简洁,虽然没有后者的应用范围那么广泛(尤其在一些老系统中,因为system-V的信号量机制要更古老一些),但是POSIX良好的设计使得他们更

2016-03-24 10:36:43 970 1

原创 Linux并发(多线程协作)

一个程序里的线程数,就像一家公司里的员工数一样,太少了忙不过来,太多了入不敷出。因此我们需要有更好的机制来协调它们。 拓展:最理想的情况是:让进程有一些初始数目的线程(所谓的线程池),当没有任务的时候这些线程自动进入睡眠,有了任务他们会立即执行任务,不断循环。进程还应该可以根据自身任务的繁重与否来增删线程的数目,当所有的任务都完成了之后,所有的线程还能妥当地收官走人,不带走

2016-03-23 13:35:47 1321 1

原创 Linux并发(控制线程不撞车的红绿灯)

信号量就是代码世界里的红绿灯,没有它,许多代码横冲直撞必将导致严重的“车祸”。 拓展:LINUX中可能用到的信号量有3种:Ststem-V信号量POSIX有名信号量POSIX无名信号量他们虽然有很多显著不同的地方,但是最基本的功能室一致的:用来表征一种资源的数量,当多个进程或者线程争夺这些稀缺资源的时候,信号量用来保证他们合理地、秩序地使用这些资源,而不会陷

2016-03-22 10:09:02 1019 1

原创 Linux并发(异步信号)

Linux下的信号是诸多进程间通信(IPC)中唯一一种异步通信方式,这决定了信号的处理跟其他的IPC有本质差别。 拓展:一般情况下,进程什么时候会收到信号、收到什么信号是无法事先预料的(除了某几个特殊的信号之外),信号的到来就像你家门铃的响起一样,你不知道他什么时候会响。下图展示了内核中跟信号相关的最重要的数据组织关系:对这幅图的理解提几点重要说明:

2016-03-21 11:00:36 3341 1

原创 Linux并发(子进程退出状态的处理)

进程的退出状态不等于其退出值,退出值只是退出状态的其中一个量。 拓展:子进程在退出的时候,其状态信息是怎么传递给父进程的呢?答案是:可以使用exit()/_exit()来退出并传递这些信息,这几个函数的接口如下:以上两个函数中的参数:status就是所谓的退出值,这个退出值是整个子进程的退出状态的一部分信息。那么父进程是怎么获取子进程的整个退出状态的呢?答案

2016-03-20 09:09:14 3213 1

原创 Linux并发(无名管道)

对于无名管道pipe来说,由于它不保证写入的原子性,因此它只适合双方简单通信,不能用在多进程间通信。 拓展:无名管道创建简单,占用资源少,但同时也无法承担“大任”,他仅能用在双方少数据量的通信中,且在进程退出后就自动消失了。

2016-03-19 09:54:57 605 1

原创 Linux并发(线程特征)

进程跟线程有很多不同,其中一个最重要的差异是:每个进程都有自己独立的内存空间,但每条线程却全都挤在一个公共的内存空间之中。 拓展:线程实际上是应用层的概念,在Linux内核中,所有的调度实体都被称为任务(task),他们之间的区别是:有些任务自己拥有一套完整的资源,而有些任务彼此之间共享一套资源。图5-16 进程中的线程 如上图所示,左边是一

2016-03-18 10:24:56 1139 1

原创 Linux并发(进程裂变)

进程的分裂跟细胞的分裂几乎一致,一个进程通过fork函数来自我复制,新出现的子进程拥有跟父进程几乎一样的外表和内在。 拓展:这个fork()函数接口本身非常简单,简单到连参数都没有,但是这个函数有个非常与众不同的地方:他会使得进程一分为二!就像细胞分裂一样: 图5-3 细胞分裂 当一个进程调用fork( )成功后,fork( )将分别

2016-03-17 10:34:22 755 1

原创 Linux并发(进程的生老病死)

Linux中的进程有生老病死,就跟人一样,我们尤其关注其死,因为进程死后如果不处理,它会变成僵尸! 拓展:说进程是动态的活动的实体,指的是进程会有很多种运行状态,一会儿睡眠、一会儿暂停、一会儿又继续执行。下图给出Linux进程从被创建(生)到被回收(死)的全部状态,以及这些状态发生转换时的条件: 结合该图,一起理一理进程从生到死的过程:1,从

2016-03-16 07:10:35 684 1

原创 Linux并发(多线程)

进程实际上是一个线程组,因此一个多线程进程就是一个团队,里面的每一条线程都可以被单独调度,提高了程序执行的并发性。 拓展:通常,对于一个多任务的程序来说,需要创建多条线程,但是线程的多寡应该是由任务的轻重来决定的,因此对于一个更加灵活的多线程程序而言,更高级的使用技巧是所谓的线程池。下面是一个线程池的实现模板样图,并处于初始状态: 有这么几点

2016-03-15 14:29:20 2579 1

原创 Linux并发(task_struct结构体)

Linux下的进程也好,线程也罢,在内核中统统都以任务(task)的面目示人,他们用一样的内核数据结构来表示。 拓展:内核中用一个非常大的结构体来表达进程或者线程(统称任务task),下面是这个结构体的掠影:如果没什么意外,这个结构体可能是这个宇宙中最大的单个变量了,一个结构体就有好几k那么大,想想他包含了一个进程的所有信息,这么庞大也不足为怪了。LINUX

2016-03-14 11:30:50 535 1

原创 C语言(关键字const)

const是C语言中最坑爹的关键字,典型挂羊头卖狗肉,const本意是常量,但是C语言const只能用来定义只读变量。 拓展:const在C语言中的作用,基本都是用来修饰指针的,而且都是前置修饰:const int *p = &a; // 前置修饰int *const p = &a; // 后置修饰前置修饰时,我们可以通过指针p访问到数据a,但是无法通过指针

2016-03-13 09:03:04 477

原创 C语言(支持插件的软件实现原理)

平常使用的库文件分为静态库和动态库,而用的最多的动态库还分为静态联编和动态加载两种方式,所谓的动态加载就是插件式管理动态库,是非常实用的技术。 拓展:假设有两个库,一个叫libxxx.so,一个叫libyyy.so,他们都实现了函数init(),但是功能不同,现在我们可以使用以下函数来动态加载指定的动态库:void *handle = dlopen("libxxx.

2016-03-12 17:08:42 3359

原创 C语言(调试技巧)

C语言中的调试语句通常使用条件编译语句来框定,在不需要修改源代码的情况下,能非常方便地使能和清除调试语句。 拓展:例如有如下代码:// example.cint main(void){    printf("这条语句是正常语句");#ifdef DEBUG    printf("这条是调试语句");#endif

2016-03-11 11:09:29 4012

原创 C语言(各种基本定义)

数组指针即“指向某个数组的指针”,指针数组即“存放了一堆指针的数组”,函数指针即“指向某个函数的指针”,这些与其说是编程语法,不如说是小学语文。 拓展:数组指针定义(以整型数组为例):int a[3]; // 整型数组int (*p)[3]; // 整型数组指针 指针数组定义(以整型指针为例):int *p; // 整型指针i

2016-03-10 09:42:47 1129

原创 C语言(回调函数)

回调函数在程序开发中是一个非常重要的概念,所谓的回调其实就是不同程序模块之间的接口和约定,是软件分层设计的基本方式。 拓展:回调(callback)是一种非常重要的机制,主要可以用来实现软件的分层设计,使得不同软件模块的开发者的工作进度可以独立出来,不受时空的限制,需要的时候通过约定好的接口(或者标准)相互契合在一起,也就是C++或者JAVA等现代编程语言声称的所谓面向接口

2016-03-09 09:53:01 11303 15

原创 Linux音视频(SDL与YUV)

SDL是一个比较底层的音视频处理库,很多UI系统的内核都用到它,我们还可以用它来处理摄像头中YUV数据。 拓展:SDL(Simple DirectMedia Layer)是一个跨平台的底层开发库,提供操作诸如音频、键盘、鼠标、游戏杆以及显卡等硬件的方法,被很多多媒体播放器、模拟器和流行游戏所使用,SDL支持Windows、MacOS、Linux、iOS以及Android,也

2016-03-08 09:55:45 1231 2

原创 Linux音视频(流媒体)

多媒体原始数据,一般会经过压缩编码、音视频封装、协议打包等过程,才能流转到网络,被互联网传递,成为所谓流媒体。 拓展:一般而言,网络上传输过来的多媒体文件,第一个步骤要经过相关协议解析,得到媒体数据,然后再进行所谓的解封装,得到某种编码格式的音频流和视频流,然后再针对编码格式分别进行解码,得到音频和视频的原始数据,理论上就可以将这些数据分别输送到音频设备(喇叭)和视频设备(

2016-03-07 11:44:51 2983 1

原创 Linux音视频(YUV图像数据格式)

摄像头图像数据的主流封装格式是JPEG/MJPG/YUV等,这些都是经过编码压缩的数据,大大减少了图像尺寸,方便传输和存储。 拓展:YUV是视频图像数据的主流格式,它根据人类眼睛的视觉特征设计——由于人类的眼睛对亮度的敏感度比颜色要高许多,而且在RGB三原色中对绿色有尤为敏感,利用这个原理,可以把色度信息减少一点,人眼也无法查觉这一点。 YUV三个字母中,其

2016-03-06 14:03:28 2875 1

原创 Linux音视频(V4L2运行原理)

Linux内核用一个被称为V4L2的机制来管理摄像头图像信息,它的核心工作原理就像日本料理店常见的流转餐桌,大厨将美食不断放到空盘子里,客人不断拿来吃。 拓展:在内核中,摄像头所捕获的视频数据,我们可以通过一个队列来存储,我们所做的工作大致是这样的:首先配置好摄像头的相关参数,使之能正常工作,然后申请若干个内核视频缓存,并且将它们一一送到队列中,就好比三个空盘子被一一放到传

2016-03-05 10:39:45 1553 1

原创 Linux音视频(SDL库)

直接操作LCD显存中的帧缓冲,是图像显示应用层操作的最原始的接口,因此只能提供最基本的图像显示效果,想要图像特效就需要更高级别的算法库来辅助达到。 拓展:所有的UI系统,核心都有一些视音频算法库,提供最基本的视音频处理效果。比如SDL,我们可以使用SDL来简化对视音频数据的操作,比如它可以帮助我们直接显示YUV数据、直接播放wav音频等等。编辑

2016-03-04 09:31:51 1978 1

原创 Linux音视频(液晶硬件参数获取)

当我们操作LCD时,需要让程序自动获取诸如色深、分辨率、像素结构、虚拟区可见区大小等硬件参数,再根据这些参数来操作显存。 拓展:第一步,定义LCD参数结构体:struct fb_fix_screeninfo finfo; // 显卡设备的固定属性结构体struct fb_var_screeninfo vinfo; // 显卡设备的可变属性结构体第二步

2016-03-03 11:21:58 386 1

原创 Linux音视频(显存的可见区和虚拟区)

给LCD映射显存时,有可见区和虚拟区之分,可见区相当于一个房间里的窗户,虚拟区是窗户外的风景。 拓展:当我们讨论LCD的显存映射的时候,我们的确应该把LCD当做一扇窗户,透过这扇窗户,我们看到了显存中的图像。请看下图:编程时,可见区的大小,一般就是LCD的大小,当我们将虚拟区设置成比可见区大而不是相等时,意味着我们可以在显示图像之前预先缓冲起来,提高整个程序

2016-03-02 09:37:22 642 1

原创 音视频(色深)

用多少个bit来表示一个像素点的颜色值,被称为色深,即bpp(bits per pixel)。一个像素点所对应的字节数越多,其色彩深度越深,表现力就越细腻。 拓展:我们通常听到的1600万色的液晶显示屏,指的也是色深的概念。这个数是怎么算出来的呢?实际上这种屏幕的一个像素点由4个字节组成,如下图所示。红绿蓝每种原色用一个字节来表达,每种颜色有256个梯度值,

2016-03-01 10:36:03 844 1

最新版本Node.js 15.4.0.pkg

Node.js最新版,从墙外搞过来的,方便国内的朋友开发和学习Node.js最新版,从墙外搞过来的,方便国内的朋友开发和学习

2020-12-17

触摸板的库源代码

触摸板的优化算法库源代码,可在linux下编译,通用于各个平台

2016-10-24

jpegsrc.v9a.tar.gz

jpegsrc.v9a.tar.gz

2015-05-15

纯C语言+libalsa实现最简单录音程序

纯C语言+libalsa实现最简单录音程序

2014-12-08

纯C语言+libjpeg实现最简单jpeg图片解码显示程序

纯C语言+libjpeg实现最简单jpeg图片解码显示程序

2014-12-08

taglist.zip

Taglist是vim的一个插件,可以方便地在终端侧边显示出当前程序所有的函数、宏等信息,支持鼠标双击跳转,对于规模比较大的代码而言,这是一个非常实用功能。

2013-11-10

arm-linux-gcc-4.4.3.tar.gz

针对ARM和LINUX平台的交叉工具链,下载时请注意版本

2012-12-11

移植uboot1.3.4.pdf

详细描述uboot1.3.4的移植过程,有具体的实验步骤,按照步骤可以傻瓜式完成uboot1.3.4的ARM平台移植。

2012-12-11

ads_keygen多版本注册机.7z

ads_keygen多版本注册机.7z

2012-05-16

串口工具putty.ext

串口工具,可以实现串口信息的显示,远程连接ssh服务等等等很多很多很好的服务的

2012-05-16

空空如也

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

TA关注的人

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