- 博客(88)
- 资源 (3)
- 收藏
- 关注
原创 51单片机外设之——按键的检测(快速识别)
前面提到的按键的检测,第一种传统的扫描存在延时消抖和while松手检测语句的缺点;第二种的带标志位的检测法存在延时消抖的缺点;而现在介绍的按键扫描法是“快速识别”方法(以独立按键为例,因为矩阵键盘的扫描与独立按键类似)。 首先附上按键的原理图: 用跳帽连接排针 J5 的2脚与3脚,将键盘设置为独立按键(只有S4~S7有效)。此时,S4~S7一端分别与P3^3~P3^0相连,另一端连向GND。其核心...
2018-04-30 12:46:49
9352
原创 51单片机外设之——按键的检测(带有标志位的按键识别法)
前面提到了独立按键,可见,独立按键是由矩阵键盘分离而来的。接下来看的是 4*4 的矩阵键盘,这里使用的还是上节所使用的,延时消抖检测。 先附上矩阵键盘的原理图: 在使用据矩阵键盘时,J5 排针处的跳帽连接 1 脚和 2 脚,使所有按键的有效端口全部连接至 I/O 口。 具体的扫描方式为: 先把P3^0~P3^7高四位和第四位赋不一样的电平值,当确定有键按下时,检测按下的是哪一行或哪一列(原本高电平...
2018-04-30 12:14:11
5758
原创 51单片机外设之——矩阵键盘(传统法一)
前面提到了独立按键,可见,独立按键是由矩阵键盘分离而来的。接下来看的是 4*4 的矩阵键盘,这里使用的还是上节所使用的,延时消抖检测。 先附上矩阵键盘的原理图: 在使用据矩阵键盘时,J5 排针处的跳帽连接 1 脚和 2 脚,使所有按键的有效端口全部连接至 I/O 口。 具体的扫描方式为: 先把P3^0~P3^7高四位和第四位赋不一样的电平值,当确定有键按下时,检测按下的是哪一行或哪一列(原本高电平...
2018-04-30 12:12:48
3178
原创 初识固件库
1.固件的含义固件(Firmware)就是写入EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序,它是软件。固件是指设备内部保存的设备"驱动程序",通过固件,操作系统才能按照标准的设备驱动实现特定机器的运行动作,比如光驱、刻录机等都有内部固件。固件是担任着一个系统最基础最底层工作的软件。而在硬件设备中,固件就是硬件设备的灵魂,因为一些硬件设备除了固件以外没有其它软件组成,...
2018-04-22 21:57:41
6750
1
原创 利用.bat(批处理)来删除KEIL编译生成的无用文件.
1. 利用.bat(批处理)文件可以用来删除KEIL编译生成的无用文件,减少工程的磁盘占有量,方便讲工程发给合作者。2. 程序中已经将编译生成的无用文件存放目录设置为OBJ文件夹。当编译后,会发现OBJ目录下有多个文件,约100多个文件,占空间将近20M。3. 创建keilkilll.bat,并执行后,会发现多余文件会被删除,OBJ目录下只有hex文件被保存,大小只有...
2018-03-30 22:10:50
1236
原创 Linux下的内部命令与外部命令的区别
Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是写在bashy源码里面的,其执行速度比外部命令快,因为解析内部命令shel...
2018-03-26 19:37:13
6892
转载 STM32固件库详解
sTM32标准库可以从官网获得,也可以直接从本书的配套资料得到。本书讲解的例程全部采用1.5.1库文件。以下内容请大家打开STM32标准库文件配合阅读。解压库文件后进入其目录:"STM32F4xx_DSP_StdPeriph_Lib_V1.5.1\"软件库各文件夹的内容说明见图 92。图 92 ST标准库 目录:STM32F4xx_DSP_StdPeriph_Lib_V1.5.1\ ...
2018-03-17 18:55:36
20099
1
转载 嵌入式中的BSP---BSP到底是什么?
(1)什么是BSP? BSP是板级支持包,(board support package)是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口
2018-02-03 19:29:36
60982
原创 const有哪些作用
const有哪些作用常类型也称为const类型,是指使用类型修饰符const说明的类型。const是C和C++中常见的关键字,在C语言中,它主要用于定义变量为常类型以及修饰函数参数与返回值,而在C++中还可以修饰函数的定义,定义类的成员函数。常类型的变量或对象的值是不能更新的。一般而言,const有以下几个方面的作用:1)定义const常量,具有不可变性。2)进行类
2018-01-30 14:47:28
10716
转载 const常量与define宏定义的区别
#define RADIUS 100;const float RADIUS = 100;(1) 编译器处理方式不同 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。(2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查。(3) 存储方式
2018-01-30 14:13:59
377
原创 Linux网络编程之UDP
一、概述 UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的运输层协议,在网络中用于处理数据包,是一种无连接的协议。UDP 不提供可靠性的传输,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地。由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。二.U
2017-12-06 15:55:31
223
原创 Linux网络编程之TCP编程
一.概述 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。二.TCP 具有以下特点 1.电话系统服务模式的抽象 2.每一次完整的数据传输都要经过建立连接、使用连接、终止连接的过程 3.可靠、出错重传、且每收到一个数据都要给出相应的确认,保证数据传输的可靠性。三.TCP 客户端编程 对于 TCP 客户端编
2017-12-06 15:44:19
247
原创 Linux的内核相关问题
1、简述Linux进程内存空间分为哪几个段?作用分别是什么?主要分为以下5部分:Text:存放可执行的指令操作,其只读不能写;Bss:存放未初始化的全局变量和静态变量;Data:存放初始化的全局变量和静态变量;Stack:存放临时变量,函数参数等;Heap:存放New/Malloc等动态申请的变量,用户必须手动进行Delete/Free操作;其中,Stack和Hea
2017-12-05 17:15:01
257
原创 Linux的线程间通信方式总结
Linux系统中的线程间通信方式主要以下几种:* 锁机制:包括互斥锁、条件变量、读写锁和自旋锁。 互斥锁确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进入阻塞状态(释放CPU资源使其由运行状态进入等待状态)。当锁释放时哪个等待线程能获得该锁取决于内核的调度。 读写锁当以写模式加锁而处于写状态时任何试图加锁的线程(不论是读或写)都阻塞
2017-12-05 16:06:33
7182
原创 Linux进程间通信方式总结
Linux系统中的进程间通信方式主要以下几种:同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory)网络主机间的进程通信方式
2017-12-05 16:05:27
330
转载 Linux进程间通信——使用匿名管道
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值。这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据。一、什么是管道如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号“|"来使用管道,但是管理的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通
2017-12-04 15:21:40
238
转载 Linux进程间通信——使用命名管道
在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。一、什么是命名管道命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系
2017-12-04 15:19:59
212
转载 Linux进程间通信——使用消息队列
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道一、什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消
2017-12-04 15:18:20
200
转载 Linux进程间通信——使用信号量
这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物。有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号。下面就进入信号量的讲解。一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码
2017-12-04 15:15:26
157
转载 Linux进程间通信——使用共享内存
下面将讲解进程间通信的另一种方式,使用共享内存。一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一
2017-12-04 15:12:29
165
转载 Linux进程通信之信号
一、什么是信号用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们
2017-12-04 12:34:15
252
转载 fork()复制进程
fork()复制进程1、fork()的基本概念一个现有进程可以用fork()函数通过系统调用创建一个新进程,该函数定义如下:[cpp] view plain copyprint?#include pid_t fork(void); // 返回:若成功则在子进程中返回0,在父进程中返回子进程PID,若出错则返回-1 #inc
2017-12-02 21:14:05
567
转载 fork之后子进程到底复制了父进程什么
[cpp] view plain copyprint?#include #include #include #include void main() { char str[6]="hello"; pid_t pid=fork(); if(pid==0) { str[0]='b';
2017-12-02 20:42:15
449
转载 Linux进程地址空间 && 进程内存布局
一 进程空间分布概述 对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。未初始化过的数据(BSS):在程序运行
2017-12-02 18:22:09
235
原创 网络编程和套接字
网络编程其实和我们计算机上的文件读取操作很类似,通俗地讲,网络编程就是编写程序使两台联网的计算机相互交换数据。那么,数据具体怎么传输呢?其实操作系统会提供名为“套接字”的部件,套接字就是网络数据传输用的软件设备而已。即使你对网络数据传输原理不太熟悉,你也可以通过套接字完成数据传输。因此,网络编程常常又称为套接字编程。下面我们再通过一个通俗地例子来理解什么是套接字并给出创建它的过程。实际上,
2017-11-29 22:35:13
317
转载 网络编程是什么
网络编程是什么? 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。 在网络编程中,发起连接程序,也就是发送第一次请求的程序
2017-11-29 22:25:56
363
原创 进程间通信方式
linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进
2017-11-29 22:23:10
160
转载 带缓存的I/O和不带缓存的I/O的区别
《APUE》的第三章为“不带缓存的I/O”,第五章为“带缓存的I/O”。 首先,我们需要明确一点,上面两个是“术语”,不是“述语”(描述性质的语言)。 其实“不带缓存的I/O”实际上也是带缓存的,只不过此缓存非比缓存,这里的“不带缓存”指的是“不带流缓存”,而这也就是和“带缓存的I/O”的区别了。 下面让我详细解释下:
2017-11-29 17:52:37
464
转载 在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出
在Linux中,所有对设备和文件的操作都使用文件描述符来进行。 Linux中一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。这三个文件分别对应文件描述符0、1、2。 在C语言中,在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出。通常这3个文件都与终端相联系。因此,以前我们所用到的从终端输入或输出都不需要打开终端文件。系统自定义了3个文件指
2017-11-29 17:33:38
1874
原创 文件描述符与流的区别
任何一种操作系统中,程序在开始读写一个文件的内容之前,必须首先在程序与文件之间建立连接或通信通道,这一过程称为打开文件。打开一个文件的目的可以是为了读或者为了写,也可以是即读又写。 UNIX系统中有两种机制用于描述程序与文件的这种连接: (1)文件描述符 (2)流文件描述符 和 流 相同点:1. 都是用来表示用户程序与被操作的文件之间的连接,并在此连接的
2017-11-29 14:30:30
1592
原创 Linux中文件描述符与索引节点的区别
一般来讲,使用与管理文件是通过文件名来进行的,但从应用编程的角度看,文件描述符更有用,而系统中的文件在本质上是通过其索引节点进行管理的。 文件描述符是应用程序中表示被打开的文件的一个整数,其他对文件的操作接口都要使用这个整数来指定所操作的文件。 从系统的角度来看,文件的索引节点(inode)是文件的唯一标识。一个文件的inode包含文件系统处理文件所需要的全部信息,如访问权限、当前
2017-11-24 22:23:38
953
原创 Linux的进程相关命令
1.查进程 ps命令查找与进程相关的PID号: ps a 显示现行终端机下的所有程序,包括其他用户的程序。 ps -A 显示所有程序。 ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。 ps -e 此参数的效果和指定”A”参数相同。 ps e 列出程序时,显示每个程序所使用的环境变量。 ps f 用ASCII字符显示树状结构,表达程
2017-11-24 15:34:32
202
原创 Linux文件简单介绍
一个基本的计算机系统由“硬件”和“软件”组成,一台Linux设备,主要的组成如下图所示:一般情况下,我们所说的Linux系统,特指中间内核级的部分,我们看到的Linux的桌面Desktop,例如:KDE,GNOME都只是普通的应用程序而已。Linux的核心在于其内核,内核是应用程序和硬件程序联系的纽带。Linux的人机交互方式有两种:图形交互界面命令行交互接口(CLI)
2017-11-24 15:23:13
318
转载 typedef 定义数组类型用法
今天看Weiss的《数据结构与算法分析》看到一条typedef语句,不明白其意义。typedef struct TableEntry Table[ NunVertex ];1通过查看《 C Primer Plus 》中typedef的相关用法,找到答案。 typedef 关键字有如下用法typedef int arrs[5]; typedef arrs * p_arr5;
2017-11-01 21:54:30
1240
原创 c语言获取用户输入字符串是scanf和gets的区别
gets(s)函数与 scanf("%s",&s) 相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。1.scanf()所在头文件:stdio.h语法:scanf("格式控制字符串",变量地址列表);接受字符串时:s
2017-11-01 12:05:41
862
原创 C语言结构体部分知识
数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:struct 结构体名{ 结构体所包
2017-10-27 12:53:28
2119
原创 错误: 程序中有游离的‘\302’ ‘\240’等
在写程序时,有时候编译器需要程序必须是英文输入,但大家经常切到中文或者直接复制网络上的源代码,所以就出现了et_ip.c:28:1: 错误: 程序中有游离的‘\302’get_ip.c:28:1: 错误: 程序中有游离的‘\240’get_ip.c:28:1: 错误: 程序中有游离的‘\302’get_ip.c:28:1: 错误: 程序中有游离的‘\240’get_ip
2017-10-20 23:11:11
5472
原创 数组与指针
1. 一维数组 1.一维数组的定义格式为: 类型说明符 数组名[常量表达式]; 例如: int a[10]; 它表示定义了一个整形数组,数组名为a,有10个元素。 2.在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。 3.常量表达式中可以包括常量和符号
2017-10-19 20:48:02
471
原创 函数
1.C程序: 只包含一个主函数main(),也可以包含一个主函数和若干个其它函数(库函数和自定义函数) 函数类型 函数名(形式参数类型说明表) { 声明部分 执行部分 }2.函数调用的形式: (1)作为函数语句调用。函数一般无返回值。例: p
2017-10-19 20:45:58
265
转载 static作用(修饰函数、局部变量、全局变量)
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global variable
2017-10-18 17:17:04
414
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人