自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于互斥量和条件变量

条件变量一般用于阻塞线程以及给线程发信号,解除阻塞。而条件变量往往和互斥量一起使用,因为条件变量在阻塞的时候会有一个加锁解锁的过程。还记得以前写过一个生产者——消费者的实例,那时候对一些问题还不是很理解。下面是一个简单的练习实例,以及最后总结遇到的一些问题。//wait后面要执行的语句必须在while循环之内//wait后面必须要解锁//最后一个函数执行的时候不要解锁//查看pthrea...

2018-08-31 09:19:11 553

原创 多线程socket练习中的问题

以前写过多进程的socket通信,但是没有深究其中的一些细节问题,这次从多线程socket通信中学习到了很多东西,下面直接给出这次练习的程序代码://pthread_t tid应该在循环里面,每次创建一个去执行线程//close(fd)的问题,无法关闭fd,论shutdown和close的区别,shutdown禁用套接字,但是不减计数,close直接关闭套接字,描述符减1//客户端一...

2018-08-30 10:10:13 514

原创 关于线程的内存泄漏问题

线程在程序设计中占有很重要的地位,而关于线程的使用方法和注意事项也有很多,这篇文章主要讲讲如何创建一个线程并且让我们的程序避免内存泄露问题的出现。线程的创建很简单,使用pthread_create函数,但是要注意参数的问题。下面就一些例子说明线程的内存泄露问题。```#include "../common.h" //包含一些函数所需要的头文件pthread_t ...

2018-08-24 14:41:15 1763

原创 浅析I2C总线驱动

最近在看驱动程序的时候,学习了解了I2C总线,前面有platform平台总线,是一种虚拟的总线,用于分离设备和驱动,便于驱动工程师移植程序。而I2C是一种实实在在的,具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线,I2C总线是两线式的串行总线,用于连接微控制器及其外围设备,如果我们的外设是用I2C总线连接的,那就意味着我们可以直接使用I2C驱动来控制设备了,那么我们为什么要使用

2017-09-06 16:41:32 2288

原创 解决复制粘贴出现的错误

proc2.c:49:5: 错误:程序中有游离的‘\240’ proc2.c:49:5: 错误:程序中有游离的‘\302’proc2.c:49:5: 错误:程序中有游离的‘\240’ proc2.c:49:5: 错误:程序中有游离的‘\302’proc2.c:49:5: 错误:程序中有游离的‘\240’ proc2.c:49:5: 错误:程序中有游离的‘\302’proc2.c:49:5:...

2019-01-21 11:10:20 3823

原创 关于条件变量

最近想自己实现一个线程池,发现线程池的实现主要是条件变量和互斥量的使用,因此先练习了条件变量个互斥锁。这篇文章主要记录学习过程中遇到的问题。下面是自己写的一个程序,用于练习。#include "../common.h" //包含线程所需头文件pthread_t pid1, pid2;pthread_cond_t num;pthread_mutex_t mu...

2018-12-19 08:41:40 277

原创 文件I/O

本章主要说明系统调用相关的文件I/O函数基本函数有open、read、write、lseek和close不带缓冲的I/O,即每个read和write都直接调用内核中的一个系统调用,和后面第五章的标准I/O有所差别,标准I/O是通过标准函数调用系统调用的。原子操作:由于多进程之间的资源共享问题,特别是在操作文件的时候,我们必须保证同一时刻只有一个进程在操作文件,才能保证文件数据不被搞乱,...

2018-09-05 14:12:33 324

转载 I2C驱动的框架实现分析

前面讲了一下I2C的基本概念以及一个怎么去运用它的一个流程,但是没有做具体的分析,这篇博客转自http://m.blog.csdn.net/Guet_Kite/article/details/77870905,写得很明了,于是忍不住就转载啦。首先这张图片很好的说明了我们内核的I2C驱动的一个框架,现在从上到下看起,先看我们的平台文件:mach-smdk2440.c,这里内核为3.0.54版本。sta

2017-09-07 15:46:28 632

转载 sudo免密码

因为经常要用到sudo命令,经常输入密码,久了感觉有点繁琐。以下有一个方法可以解决。 [luliteng@luliteng etc]$ sudo vim sudoers 在代码末尾添加一句如下代码就可以了 username  ALL=(ALL)       NOPASSWD:ALL 然后wq!退出就可以了。

2017-08-27 19:41:32 401

原创 linux文件系统

通过前面内核的启动流程,可以知道内核启动时,要挂载文件系统,而文件系统包括根文件系统以及建立于Flash设备上的文件系统,里面包含了Linux系统能够运行所必需的应用程序和库,比如给用户提供操作Linux控制界面的shell程序和动态链接的程序运行时需要的库等等。还记得在烧录ARM最小系统的时候,如果没有烧文件系统,那么我们的系统就无法完整启动,而是卡在那里,那么,内核在等什么呢?内核在找我们的根

2017-08-27 15:48:58 883

原创 linux内核定时器

Linux内核定时器,一个硬件逻辑单元,系统的定时器硬件,定时一一定周期频率输出方波,给CPU产生定时器中断。以某种频率自行触发时钟中断,其频率可通过变成预定。在内核中,有一个对应的时钟中断的处理程序,这个中断处理程序一般会做下面的事情: 1. 更新系统的运行时间(jiffies); 2. 更新实际时间(年月日时分秒); 3. 检查进程的时间片,如果时间片用尽了,将重新调度; 4. 检查有

2017-08-24 12:37:38 526

原创 内核回顾

起初只是简单的了解了内核移植的一个过程,现在再来梳理一下个人的理解。对于Linux内核,其功能之强大,结构之复杂,没有个几年的时光估计是搞不明白的,本篇文章主要是理解一下内核的一个启动流程以及一些关于内核的问题解答。Linux内核启动过程1、架构/开发板相关的引导过程,通常使用汇编来编写,首先检查内核是否支持当前架构的CPU处理器,然后检查是否支持当前的开发板,只有通过这两部分的确认,为调用下一步C

2017-08-23 19:20:52 443

原创 关于中断

中断在嵌入式方面用得很多,本篇文章具体介绍一下中断。中断的概念 CPU执行过程中,出现了突变事件,而暂停正在进行的工作,转去处理突变事件,处理完以后CPU返回源程序被中断的位置并继续执行。为什么要有中断 先说说轮询,由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一个周边,接着不断周而复始。很明显,轮询的方式很实在,但是效率很低,因为CPU的处理速

2017-08-21 16:55:30 669

原创 u-boot回顾(二)

前面那篇文章回顾并理解了关于u-boot的基本概念,作用,以及它的一个启动的流程,这篇文章写一下自己对u-boot移植的理解。我们的u-boot主要是用来初始化硬件设备以及引导加载内核的,下载官方的u-boot源码包以后,我们先编译一下,生成一个链接文件u-boot.ld,当然我们得先找一块板子试一下嘛,先在顶层目录执行一个make boardname_config,再make,我这里以smdk2

2017-08-18 10:45:38 396 1

转载 回顾U-boot(一)

如果我们要想让一个操作系统在我们的板子上运转起来,我们就必须首先对我们的板子进行一些基本配置和初始化,然后才可以将操作系统引导进来运行。而我们的u-boot就是来干这个事情的现在我们的windows的引导程序一般是BIOS+Bootloader,我们的u-boot是一个通用的bootloader,即boot+loader,boot阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的软硬件带到

2017-08-17 21:54:21 380

转载 看门狗的认识

在学习U-boot相关知识的时候,有一个看门狗的关闭过程,然后就百度了解了一下看门狗的作用,下面是原文:一直以来对于嵌入式中的watch dog(看门狗)都比较陌生,一直都不知道它到底是做什么的,单从名字上看也不知其所以然,然后就在网上找到了一篇blog,就是再说看门狗的作用和概述,原文如下:1、概述: WATCHDOG对于没有底层开发经验的开发人员来说,可能比较陌生,但是它在系统起到

2017-08-16 15:51:02 590

原创 生产者/消费者问题

在模块化编程中,高内聚和低耦合通常是我们要达到的标准,相信对于生产者消费者就是一个这样的问题。在对线程的学习中,看了一下这个实例,因此在这里学习一下。 生产者和消费者问题是一个经典的线程同步的问题,在实际生活中我们很容易遇到,也称为有限缓冲区问题,生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时

2017-08-14 14:17:27 1290

原创 循环buffer的学习

这几天在做一些笔试题的时候,遇见了一个关于读写循环缓冲区的题目,然后通过学习,这篇文章大致总结一下对循环buffer的认识。 首先循环buffer是一个可以无限循环读写的缓冲区,上图是一个初始化的循环缓冲区。当然,当循环缓冲区满了的时候是不允许继续写的,应为里面的内容还没被读取,如果满了还继续写的话就会覆盖我们还没读取到的数据,造成数据丢失,然后下面是一个对我们循环缓冲区的初始化typedef

2017-08-12 21:04:09 2814 3

原创 C语言函数传参

最近在做一些笔试面试之类的题目,今天遇到一个关于C语言函数传参的问题,感觉自己的概念还是有点模糊,本篇文章再学一下关于函数传参。这是遇到的一个题目:(高质量C++编程指南)#include <stdlib.h>#include <stdio.h#include <string.h>void GetMemory(char *p, int num){ p = (char *)malloc

2017-08-07 15:19:53 1166 2

原创 内存检测工具valgrind

最近在学习数据结构的时候总是遇到关于内存错误的问题,因为数据结构这块多用指针,由此产生的段错误多不胜数,因此学习了一下valgrind这个工具,来检测我们的程序是如何出现内存问题的。centos系统下的valgrind,首先我们得有autoconf和automake两个工具,一般系统都会自配。安装过程:wget http://valgrind.org/downloads/valgrind-3.10.

2017-08-07 14:04:33 812

原创 数据结构之二叉树

二叉树的一些概念这里简单说一下二叉树的遍历有三种,前序,中序和后序,前序即按照DLR(结点->左子树->右子树)的顺序遍历,中序则是LDR,后序则是LRD。完全二叉树,除了最底层,各层节点数均为最大值,同时最下层的节点集中在左侧,且中间不能有间隔。满树即为全满的树。树的存储结构:顺序存储和链式存储。顺序存储即从上到下,从左到右依次存放,完全二叉树可用数组,一层一层放,非完全二叉树先用无效的数据

2017-08-05 19:27:55 352

转载 中文man手册

本文讲述了一下在CentOS系统下安装中文man手册1、下载中文包; http://pkgs.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz/13275fd039de8788b15151c896150bc4/2、编译安装 tar xf manpages-zh-1.5.1.tar.gz cd manpage

2017-08-03 10:26:24 1084

原创 GitHub远程仓库操作

和SVN一样,GitHub也有远程仓库存储我们的项目,首先在GitHub官网注册一个账号。https://github.com/登陆之前输入以下命令$ ssh-keygen -t rsa -C "[email protected]"后面为自己的邮箱地址然后在自己的主目录可看见一个.ssh文件,打开id_rsa.pub,里面即有我们的公钥。复制下来登录之后打开Account setting->

2017-08-02 19:38:54 427

原创 GitHub查看日志和标签

这篇文章继续介绍GitHub的操作查看提交历史[tangyanjun@VM_216_80_centos git]$ git commit -m "bb"# On branch masternothing to commit (working directory clean)[tangyanjun@VM_216_80_centos git]$ git logcommit 8b71690bcff

2017-08-02 17:06:47 5345 2

原创 GitHub本地操作

上一篇文章介绍了GitHub与SVN的区别,这篇文章主要介绍GitHub本地仓库的一些基本操作Git的安装因为本人使用的是Linux系统,因此在这里只介绍Linux上安装过程先判断自己是否已经安装好git:[tangyanjun@VM_216_80_centos GIT]$ gitusage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--htm

2017-08-02 16:40:24 456

转载 GitHub和SVN的区别

之前用的版本控制系统是SVN,但是最近因为流行使用GitHub,这篇文章认识一下Git和SVN的区别。1)Git是分布式的,SVN不是: 这 是git和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;如果你能理解这个概念,那么你就已经上手一半了。需要做一点声明,GIT并

2017-08-02 15:00:16 14181 2

原创 单链表的学习总结

前面学习了单链表的一些基本操作,这篇文章对在学习单链表的过程中遇到的一些问题做一些总结。初学单链表,很多东西都很难理解,因为之前的C语言基础的指针这块不是很熟悉,对于指针的操作很模糊,在一边百度一边看视频学习的过程中,渐渐加深了对指针的理解,以及对程序的模块化编程的学习。分不清楚头结点和头指针我学习的是没有头结点的,即只有一个头指针,在写代码的时候我总是会把头指针误认为一个头结点,然后定义另一个指针

2017-08-01 10:58:55 7060

原创 数据结构之单链表操作二

上一篇文章介绍了单链表的一些基本操作,包括节点的创建与销毁,链表的初始化与摧毁,以及头插法和尾插法添加节点和正反向打印链表等,这篇文章深入介绍单链表其他的操作。链表的中间数据插入void inse_data(LIST* list, int data){ LIST_NODE* node = create_node(data); LIST_NODE* p = NULL;

2017-08-01 10:01:40 310

原创 SQLite C/C++接口

所谓接口,就是用函数来执行SQLite的一些命令。

2017-07-29 15:17:09 442

原创 常用字符串处理函数

常用的字符串处理函数在我们平时的作用很大,在找工作的笔试面试中也经常会考到,因此,鄙人总结了一下常用的几个字符串处理函数strlenstrcpy && strncpystrcat && strncatstrcmp && strncmp以下为本人自己定义的函数strlenstrlen是用来获取字符串的长度的函数,当然,不包括最后的 ‘\0’下面是一个实现接口:/* realize of str

2017-07-28 11:21:36 474

原创 数据结构之快速排序

前面介绍了三种排序算法:冒泡排序,插入排序以及选择排序,这篇文章介绍最常用的排序算法,快速排序 快速排序即从待排序序列中任意选择一个元素,作为基准,然后将多有小于基准的元素放在基准之前,大于基准的元素放在基准之后,等于基准的元素随意,这个过程为分组,再以递归的方式分别对基准之前和基准之后的分组继续进行分组,直到每个分组内的元素个数不多于一个为止

2017-07-27 21:51:02 517

原创 数据结构之排序算法

上一篇学习了数据结构基本的查找算法,二分法和线性法,这篇文章谈一谈一些比较经典和常见的排序算法。冒泡排序冒泡排序即扫描数组,相邻元素两两比较,小数放左边,大数放右边,依次比较,即可完成排序。下面是一个冒泡排序的接口:

2017-07-26 21:59:32 259

原创 数据结构之查找算法

算法是找工作笔试面试的必考点,一般算法分为数值算法和非数值算法。数值算法一般用于工程的计算,比如研究导弹方向之类的工程非数值算法一般用于系统编程,比如研究程序的运行效率之类的编程这篇文章谈一谈查找算法,即在一系列数据中去查找我们所要的数据。线性查找所谓线性查找,即从头开始,一次将每一个元素与查找目标进行比较,或找到目标,或找不到目标线性查找的平均时间复杂度为O(N),对被查找的数据没有任何规律性的要

2017-07-26 21:20:17 457

原创 堆栈与队列

前面学习了队列和堆栈的操作,这篇文章将队列与堆栈结合起来学习,即用堆栈来实现队列操作队列的特点是先进先出,而堆栈的特点是先进后出,那么要用堆栈来实现队列的操作,这里我们使用两个堆栈的操作来实现队列的先进先出,即先将数据压入第一个堆栈,然后再将第一个堆栈的数据取出放入第二个堆栈,再从第二个堆栈中弹出数据。头文件/*********************************************

2017-07-24 18:58:44 574

原创 队列操作

前面学习了基于顺序表以及链式表的堆栈操作,这里的链式表指单向链表,这篇文章学习同样是基于顺序表以及链式表的队列操作。 队列与堆栈的不同之处在于队列是先进先出,即队列的两边都可以进行操作,一头压入,另一头弹出。这就需要用到头指针和尾指针两个指针,为了避免指针指向空的内存,因此这两个头尾指针可以循环,而且当队列处于空或者满状态的时候,头尾指针均可能重合。 基于顺序表的实现,初始化空

2017-07-24 18:30:44 746

原创 C++实训心得

我祝你不幸并痛苦——美国首席大法官在儿子毕业典礼上的演讲这是为期12天C++培训的结训时光庭的校长对我们说的话,我百度了这个毕业典礼,然后看了这些毒鸡汤,确实是够毒,但是却发人深省,瑾针对这些天的实习生活谈一谈我的感想。 一开始抱着多学点有用的东西去上课,因为将来的笔试面试很可能会遇到关于C++的题目,在开始的三天,学的C语言写贪吃蛇,老师讲得很详细,对于基础比较好的我们,学得很轻松,到了学习M

2017-07-23 14:03:10 8702

原创 C++实训二

只要不停地走,就有数不尽的风光前三天的C++实训帮我们回顾了C语言的知识,然后接下来的一个大项目就是用VC的MFC来做一个超市管理系统,MFC是一个在WINDOWS下制作图形化界面的软件,然后对于从未接触过这个东西的我们,既新奇又感到困惑,既然是来学习C++,为何来弄这些呢?虽然MFC使用C++来包装的,但是都是封装好的函数,为了认识这些函数我们得花很多时间。接下来说一下这个超市管理系统的整个开发

2017-07-23 12:35:36 991

原创 C++实习

C++暑假实习的前三天的任务就是用C语言做一个贪吃蛇的小游戏,然后开始跟着老师一起做核心功能板块,最后由我们自己去改善和美化我们的程序。下面就介绍一下这个简单的贪吃蛇游戏的实现过程。虽然是个小程序,但是其代码也有一定长度,并且其逻辑性很强,要实现程序的逻辑,必须要模块化地进行编写。以下叙述一下鄙人的思想1、如何产生一条蛇?2、蛇如何进行运动? 3、运动的方向我们如何去控制? 4

2017-07-23 10:52:20 996

原创 SQLite学习(二)

UNION子句SQLite的UNION子句、运算符用于合并两个或多个SELECT语句的结果,不返回任何重复的行,因此每个SELECT被选择的列数必须相同,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同长度。UNION 的基本语法:SELECT column1 [, column2 ]FROM table1 [, table2 ][WHERE condition]U

2017-07-09 21:08:55 347

原创 堆栈操作

了解数据结构的都清楚,堆栈操作很重要,堆栈存储数据与取出数据是先进后出,就像一个垃圾桶,最先倒进去的垃圾最后倒出来,而堆栈有两种操作方式:1、基于顺序表的堆栈:初始化空间,通过栈顶指针表示当前可以接受新数据的位置。 2、基于链式表的堆栈:每个节点随压入随创建,随弹出随销毁,通过栈顶指针标识出最后压入的元素。堆栈的操作主要是压入和弹出,下面针对上面两种操作方式给出相关程序。基于顺序表/*******

2017-07-09 08:25:02 2131

空空如也

空空如也

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

TA关注的人

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