- 博客(40)
- 资源 (4)
- 收藏
- 关注
原创 基本套接字调用函数
socket()函数原型如下:#include <sys/types.h>#include <sys/socket.h>/***********************************************domain:指定协议族,常用的为AF_INET/AF_INET6*type:套接字类型:SOCK_STREAM/SOCK_DGRAM/SOCK_RAW*protocol:指定网
2016-12-21 16:02:25
721
原创 网络字节序和地址转换
1:大小端字节序参考博文:大小端模式2:存储字节序和传输字节序存储字节序:一个多字节的变量在内存中的存储方式,变量的小端数据存储在内存起始位置是小端字节序;变量的大端数据存储在内存起始位置是大端字节序;传输字节序:协议传输多字节变量时的传输方式,先传输大端字节的方式成为大端字节序;先传输小端字节的方式成为小端字节;网络协议使用大端字节序传输数据,USB协议使用小端字节序传输协议;
2016-12-21 03:19:28
1678
原创 大小端模式
1:大小端模式概述内存存储多字节变量时,存在大小端模式;将低字节存储在内存起始地址,称为小端模式;将高字节存储在内存起始地址,称为大端模式;术语“小端”和“大端”表示多个字节变量的哪一端(小端或大端)存储在该变量的起始地址;如下图,描述大小端模式:2:大小端测试代码使用指针判断#include int main(void){ unsigned s
2016-12-21 02:27:53
795
原创 认识套接字Socket
套接字概述套接字是抽象出来的概念,是应用程序进行网络通信的接口,对套接字的操作最终都会调用内核中的网络驱动程序,对系统应用程序开发,内核驱动透明不可见,用户只需创建一个套接字(socket),调用套接字API即可使用网络进行通信,相当便捷;在linux系统中,套接字就是一个文件;一个套接字对应一个套接字地址结构,套接字地址结构包括:网络协议、本地IP地址、本地端口,远程IP地址、远程端口;套接字地址
2016-12-21 01:23:51
635
原创 usb标准设备请求+usb各种描述符结构+usb枚举过程
usb标准设备请求usb协议中规定了一个8字节的标准设备请求,主要用在设备的枚举过程中,标准设备请求的结构如下: bmRequesType域:表明此请求的特性;包括:数据在控制传输的第二阶段的传输方向,请求的类型,请求的接收者; bRequest域:表示具体的请求代码,usb协议规定了11种标准请求,标准请求的代码如下: wVawValue:此域用来传送当前请求的参数,随请求不同而
2016-12-19 19:37:11
2629
原创 usb的包结构和传输类型
1:usb包结构概述usb总线上传输数据是以包为基本单位的,一个包被分成不同的域,根据不同类型的包,所包含的域是不一样的。不过,所有的包都有共同的特点,就是都要以同步域开始,紧跟着一个包标识符PID,最终以包结束符EOP来结束这个包。同步域就是sync总线信号,包结束符就是EOP总线信号;PID用来标识一个包的类型,总共8位,高4位标识包的类型,低4位是高4位的取反,用来检验PID,usb协议规定了
2016-12-19 12:28:24
3298
原创 usb协议基础
usb简介usb是一种支持热插拔的高速串行传输总线,使用差分信号来传输数据,高速模式下传输速率为480Mb/S,全速模式为12Mb/S,低速模式为1.5Mb/S,USB支持“总线供电”和“自供电”两种供电模式,在总线模式下,设备最多和获得500mA的电流(设备未配置前枚举阶段提供100mA)。usb优缺点优点:传输速率快,支持热插拔,即插即用; 缺点:传输距离短,供电能力有限;usb的拓扑结构us
2016-12-18 01:33:46
4611
原创 建立linux内核机制学习的模板
1:概述打算总结一下linux内核中的一些机制,所以建立了一个字符设备的模板,本驱动中申请一个1k的内存当作全局变量,用户空间的操作的对象都是这个1k的内存;2:驱动分析2.1:驱动的私有数据buff指针指向1k内存的起始地址,current_len描述内存中的有效数据长度,写进程写数据,current_len增加,读进程读数据,current_len减小,当current_l
2016-12-02 20:04:12
609
原创 简单led驱动(未使用led子系统)
1:概述2:交叉编译环境搭建3:编写驱动4:测试驱动5:总结1:概述1.1:代码基于exynos 4412平台,android 4.4系统,为了提高代码的移植性,将led驱动挂在platform虚拟总线下,自动建立设备节点,创建节点属性,并且gpio操作全部采用标准的gpio操作;1.2:代码参考led子系统,使用了led子系统的一些数据结构;2
2016-12-02 13:53:34
639
原创 输入子系统(3):按键驱动实现
1:概述按键驱动实现的过程,主要完成:input_dev的申请和注册,按键中断的实现,中断底半部的实现,在中断底半部调用事件上报函数,完成按键键值的上报;如果增加按键防抖,需要实现一个内核定时器。本文主要分析的是内核中的gpio_keys.c的文件,这是内核提供的参考,我们就借鉴这个文件,来实现我们的按键驱动,首先,看看内核中已经实现的和按键驱动有关的数据结构;2:和按键相关的数据结构
2016-12-01 00:25:13
2178
原创 输入子系统(2):代码分析
1:概述上一篇文章对input子系统中的数据结构做了总结,本篇通过对代码的分析,总结输入子系统的整体架构;本文中所涉及的文件有:input.c和evdev.c文件;input.c:是输入子系统的核心层,提供了一个input_dev设备注册的方法,以及input_handler处理层的注册方法,并且注册了input字符设备节点;evdev.c:注册了input_handler,实现具体的
2016-11-29 23:27:54
764
原创 输入子系统(1):数据结构总结
1:概述输入子系统在linux内核中使用广泛,按键,鼠标,sensor类,touch等驱动都会用到输入子系统。输入子系统的结构分为以下三层:1.1:设备驱动层这一层需要用户在设备驱动中去实现,调用核心层的函数接口,完成输入设备的注册和并将发生的事件上报给子系统核心层;1.2:输入子系统核心层为驱动层和事件处理层提供函数接口,并且注册input字符设备,主设备号是13,次
2016-11-23 00:54:26
1139
原创 字符设备驱动
1:本文实现简单的字符设备的驱动,并且提供两种访问设备资源的两种方法:一是传统的利用文件接口来访问,二是利用devfs文件系统来访问;2:首先来看hello.h文件,其中实现了用户自定义的数据结构体#include #include struct hello_dev{ int val; /*共用的设备资源,4字节数据*/ struct semapho
2016-11-22 14:36:11
572
原创 通用定时器(中断功能和PWM输出)
目录:1:概述2:常用中断功能3:PWM输出 1:概述在开发中,定时器的应用很广泛,简单总结为三个方面:1.1:中断功能的应用,常用的是利用定时器中断,实现定时、记时、延时、超时判断,前面博文中有总结过内核定时器的各种使用的方法;1.2:比较输出,常用应用就是PWM输出,用脉宽调制来实现led、电机等的控制;1.3:输入捕获,可以抓取输入的方波信号,统计波形
2016-11-21 00:40:25
10358
原创 文件操作系统调用_壹
目录:1:概述2:open、read、write、lseek、close3:代码示例1:概述linux体现了“一切都是文件”的设计思想,所有的文件操作都是通过操作文件描述符来进行的,文件描述符是一个整形的变量,系统默认最大是1024,可以使用ulimit -a命令查询或者修改,系统已经分配的三个标准文件描述符,标准输入(stdin)、标准输出(stdout)、标准错误(
2016-11-11 15:14:37
448
原创 IPv4——网际协议(第一部分)
目录:1:概述2:IP封装3:IP分片/重组4:IP编址5:IP交付1、概述1.1:IP协议不仅可以实现同一局域网中的设备进行数据交互,更重要的可以使不在同一个局域网中的设备进行数据远程交互;1.2:IP层依赖下层的数据链路层协议,为上层运输协议提供服务(TCP/UDP/ICMP),IP层提供了一种将数据帧从某个LAN中的一个设备运输到一个远程LAN中另一设
2016-11-03 15:47:28
589
原创 ARP——地址解析协议
目录:1:概述2:ARP报文格式3:ARP解析缓存4:ARP实现例程1、概述1.1:当数据需要在不同的局域网中进行传输时,由于不同的局域网可能其物理地址(MAC地址)格式不同,所以制定IP地址,来统一标识网络中的设备;1.2:ARP协议是通过给定的IP地址,找到所对应设备的物理地址:,通过以太网协议进行传输;1.3:当上层协议通过IP协议发送数据报时,已经有
2016-11-03 11:44:03
922
原创 嵌入式以太网第三部分——以太网协议实现
目录:1:概述2:MAC地址设置3:以太网协议4:PING指令测试1、概述1.1:以太网是实现LAN的一种技术,它允许嵌入式系统连接到一个LAN中,并可通过使用网关经Internet连接到外部世界,以太网的主要目的是向LAN发送和从LAN接收以太网帧,在TCP/IP协议族中,不包括以太网协议,可以理解它为TCP/IP中的网络接口层(物理层和数据链路层),为TCP/IP中的上
2016-11-02 00:21:52
4228
原创 嵌入式以太网第二部分——ENC28J60网卡驱动
目录1:概述2:enc28j60初始化1、概述1.1:以太网是实现LAN的一种技术,它允许嵌入式系统连接到一个LAN中,并可通过使用网关经Internet连接到外部世界,以太网的主要目的是向LAN发送和从LAN接收以太网帧,在TCP/IP协议族中,不包括以太网协议,可以理解它为TCP/IP中的网络接口层(物理层和数据链路层),为TCP/IP中的上层协议(比如:IP协议和
2016-11-01 20:57:04
1950
1
原创 HTML+CSS绘制表格
概述:本篇利用HTML和CSS完成表格的绘制,实现单元格高亮和表格圆角效果,如下图:代码:table.html Tables Demo Modbus Protocol Data Num Address Type Data 1 0x01 uns
2016-11-01 16:32:19
5931
原创 TCP迭代服务器
概述:本篇利用Linux下的socket编程,实现TCP客户端和TCP迭代服务器(循环服务器);过程描述:1:启动TCP服务器进程,listen客户端connect进程,服务器阻塞等待accept客户端connect;2:启动TCP客户端进程,发送connect连接;3:服务器进程accept客户端connect请求,客户端进程阻塞等待recv服务器数据;4:服务器
2016-11-01 01:51:39
791
原创 STM32串口环形缓冲区
目录1:概述2:代码1:概述1.1:本篇实现串口驱动,实现printf函数的重定向,实现串口的中断接受和发送,效仿modbus协议中的3.5T超时机制,判断是否接受完毕;1.2:如果串口仅仅是实现一个控制台,打印一些debug数据,使用printf函数(串口发送数据忙等待),如果是需要用串口进行外设设备的控制,比如串口GPRS模块,需使用串口中断进行控制,因为受限于串口
2016-10-18 02:23:26
6551
原创 嵌入式以太网第一部分——ENC28J60网卡驱动
目录:1:概述2:enc28j60寄存器描述和读写寄存器例程3:缓冲器描述和读写缓冲器例程4:发送和接受数据包例程 概述:1:以太网是实现LAN的一种技术,它允许嵌入式系统连接到一个LAN中,并可通过使用网关经Internet连接到外部世界,以太网的主要目的是向LAN发送和从LAN接收以太网帧,在TCP/IP协议族中,不包括以太网协议,可以理解它为TCP/IP中
2016-10-16 01:24:14
2734
原创 嵌入式按键驱动,支持短按、长按、双击(中断方式)
目录:1:概述2:stm32外部中断配置3:code概述:1:本篇利用按键中断输入方式,当按键触发,中断处理函数置按键扫描标志位为1,开始按键键值扫描,完成后,主程序根据键值(短按、长按、双击),完成相应的动作;2:当K1按键短按:LED1闪烁;当K1按键长按,LED2闪烁;当K1按键双击,LED3闪烁;3:优点:相比于轮询扫描按键键值的方式,按键响
2016-10-14 02:38:50
15517
3
原创 嵌入式按键驱动,支持短按、长按、双击(轮询方式)
目录:1:概述2:代码功能3:代码分享概述:代码利用轮询方式对按键状态进行扫描,扫描得出按键的键值(短按、长按、双击),然后根据键值进行相应的事件处理;平台:奋斗STM32F103 V5开发板 开发环境:KEIL MDK5代码功能:短按K1按键,LED1灯闪烁,闪烁间隔250ms;长按K1按键1.5S以上,三个LED同时闪烁,闪烁间隔250ms
2016-10-08 20:44:42
8593
5
原创 时钟滴答定时器(sysclk)用法详解
目录:概述:本篇博客针对sysclk内核定时器(时钟滴答定时器)的常见用法进行总结,分别实现sysclk的定时、延时、计时功能,全部为代码,寄存器描述需参考《Cortex-M3 权威指南》。平台:stm32f103奋斗开发板 开发环境:MKD51:sysclk的定时功能2:sysclk的us/ms级延时功能3:sysclk实现us级精度计时功能1:s
2016-10-03 04:06:17
14320
1
原创 ubuntu14.04 LTS安装手册(contiunous new)
ubuntu14.04 LTS安装手册1:下载ubuntu14.04LTS镜像,下载地址:Ubuntu 14.04 LTS.2:下载Universal USB_Installer 1.9.5软件.3:使用第2步下载的软件Universal USB_Installer制作启动盘(U盘).4:将U盘插入电脑,选择从U盘启动,按照提示,成功安装Ubuntu14.04.5:安装搜狗拼音输入法1:下载搜狗拼
2016-09-21 18:31:22
1508
1
原创 使用结构体存储多变量类型数据
1:需要存储的变量具有多种类型时(char/int/float),采用结构体整体写入和读取的思路,不需要考虑结构体对齐; 2:动态申请100个字节大小的buff,认为buff等同于FLASH、E2P中的一段存储; 3:将flash_1中需要存储的元素整体写入FLASH,然后从FLASH中读取sizeof(FLASH)大小的数据赋值给flash_2,最终打印flash_2元素验证; 4:
2016-08-31 17:02:04
2305
原创 STM32标准库新建工程模板
新建自己的工程模板,便于以后做项目的时候直接拿来用,本文从ST官网下载标准库文件,建立一个工程模板1:从官网下载ST官方库文件登录官网,中文和英文都可以,搜索框搜索"stm32 firmware",进入,如下图:红色标记的就是标准库文件,不过显示的不全,我们随便点击一个型号的版本,然后进入到“STM32 固件”,如下图:看到的计时标注库文件的不同版本,根据支持的
2016-08-27 00:32:57
3612
原创 FreeModbus源码详解
本篇按照FreeModbus协议栈的工作流程,对源代码进行总结解析;FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机,实现主机和从机之间的通信;1:demo.c中三个函数,完成协议栈的准备工作;eMBInit()函数:(mb.c)/*函数功能:*1:实现RTU模式和ASCALL模式的协议栈初始化;*2
2016-08-18 15:23:42
26943
8
原创 使用rand函数产生伪随机数
概述:使用c库函数rand()和srand()函数产生伪随机数,代码可选择产生整形和浮点型的随机数,用随机数模拟AD值,作为后续铝箔算法的原始采样值。code/****************************************************FUNC:产生伪随机数*AUTHOR:GOLF/FXB*COMPILE:GCC*DATE:2016/08*******
2016-08-13 01:18:34
1457
原创 Linux kernel简单驱动模型和Makefile文件
目录:1:hello word驱动2:Makefile的分类3:外部模块编译4:内部模块编译5:总结正文:1:hello word驱动代码2:Makefile的分类Kernel Makefilekernel Makefile位于内核源码的顶层目录,也叫TOP Kernel,编译整个内核或者模块时,首先被读取,配置整个内核的环境变量;Kbuild
2016-08-11 17:00:30
711
原创 SPI实现SST25VF016B驱动(Flash)
本文在STM32F103上实现SSH25的驱动,实现数据的写入和读取:1:此驱动未加擦除时候是否擦除成功的判断,一般写入FLASH不成功的最大原因就是擦除不成功,所以一般特选FLASH里面的一个地址存储一个特征字,比如0x12,当执行完操作擦除命令后,去判断这个特征字是否被擦除为0xff,如果擦除成功,执行写指令,当然,也可以进行CRC校验,判断写入和读取的是否一致;2:FLASH的写入时
2016-08-06 00:21:10
7271
原创 叁:Modbus poll|Modbus Slave|虚拟串口的使用
概述:可以使用modbus poll和modbus slave软件验证modbus协议,modbus poll为主机,modbus slave作为从机,虚拟串口模拟两个串口供modbus poll和modbus slave软件使用; 1:设置虚拟串口,模拟COM4和COM5 2:设置modbus poll主机:设置从机地址0x01,读多个保持寄存器,保持寄存器起始为0,读取数量为10;
2016-07-27 16:17:07
2347
原创 51内核UART串行总线环形缓冲区驱动实现
目录:1:驱动简述;2:代码示例;3:串口波形;正文:1:驱动简述;驱动实现串口中断接收和发送数据,缓冲区使用环形缓冲区。发送:手动置RI中断标志位为1,发生中断,在中断发送函数中将需要发送的数据一一发送出去,具体见示例;接收:在中断接收函数中保存接收到满足协议的数据,后置接收成功标志位,最终在main函数while循环中轮训接收成功标志位是否置1,如果置1,处理接收到的数
2016-07-27 09:17:19
2158
原创 贰:Modbus常用功能码协议详解
01H-读线圈状态1)描述:读从机线圈寄存器,位操作,可读单个或者多个; 2)发送指令: 假设从机地址位0x01,寄存器开始地址0x0023,寄存器结束抵制0x0038,总共读取21个线圈。协议图如下:3)响应: 返回数据的每一位对应线圈状态,1-ON,0-OFF,如下图; 上表中data1表示0x0023-0x002a的线圈状态,data1的最低位代表最低地址的线圈状态,可以理解为小端模式
2016-07-21 02:14:48
18251
4
原创 壹:Modbus协议功能码及格式简述
目录一:Modbus寄存器种类说明 二:Modbus功能码简述 三:Modbus寄存器PLC地址 和 寄存器协议地址简述 四:Modbus汇总正文一:Modbus寄存器种类说明 1:线圈状态 输出端口,可设定端口的输出状态,也可以读取该位的输出状态; 2:离散输入状态 输入端口,通过外部设定改变输入状态,可读但不可写; 3:保持寄存器 控制器运行时被设定的某些参数,可读可写; 4
2016-07-21 00:46:26
7958
原创 malloc动态申请内存
1:malloc概述malloc(num)动态申请num字节的内存空间,函数申请成功返回内存的起始地址(void型),申请不成功返回NULL指针,malloc不初始化内存空间;calloc(type,num)函数会初始化申请的内存空间为0;使用完申请的内存后需要用free(*p)释放内存并且将指针P=NULL,防止野指针;2:一维内存动态申请#include #include i
2016-07-21 00:36:25
7761
原创 字节对齐详解
目录一:字节对齐概述 二:字节对齐原则 三:设置编译器对齐系数n的两种方法 四:代码示例正文一:字节对齐概述 cpu根据自身处理器的字长和数据总线宽度确定一条指令寻址的位数,比如16位处理器每次访问16bit的数据,为了提高处理器效率,编译器会对不同数据类型的变量进行内存对齐。 二:字节对齐原则 字节对齐三原则:(以结构体数据类型为例) 1:确定有效对齐位数; 假设设置编译器的对齐位
2016-07-20 01:18:06
1000
原创 volatile限定符
目录一:volatile概述 二:volatile代码示例 三:总结正文一 :volatile概述1 : 编译器优化对代码生成的指令会产生影响,导致不可控的bug,为了限制编译器的优化本领,设定volatile限定修饰符; 2 : 编译器将定义的变量在通用寄存器和Cache中保存副本,来提高变量的寻址效率,对于“易变型”的变量,就需要用volatile进行标识,不让编译器对此变量进行优化;
2016-07-19 08:47:56
954
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人