- 博客(37)
- 收藏
- 关注
原创 Zigbee应用之搭建开发环境
*** 本章学习目的 ***1)熟悉集成开发环境IAR EW8051 10.10.12)熟悉建立工作空间及工程3)掌握程序的下载及仿真4)掌握固件的生成及烧录2.1 搭建开发环境2.1.1 新建工作空间及工程* 新建工作空间运行软件-IAR EW8051 10.10.1新建一个工作空间保存工作空间* 新建新工程在工作空间中新建工程选中创建一个空工程保存工程1.2 源代码编写及编译* 新建源码文件在保存工作空间和工程的目.
2020-11-08 22:55:26
1515
原创 ZigBee简介\应用协议\解决方案商介绍
本章目的:学习、应用一个技术,很重要的一点是了解技术本身的发展情况,一方面我们知道技术发展到哪一步,让我们知道学习的内容是否是最新的而不是已经过时的;另一方面可以和行业的发展同步,知道行业发展得怎么样,从而少走弯路;本章主要做到以下几点即可:了解ZigBee技术及其发展情况 了解现在主流的ZigBee解决方案商 了解Ti协议栈的发展情况1 ZigBee发展历程1.1IEEE802.15.4深层地讨论ZigBee技术自然绕不开IEEE 802.15.4,因为:ZigBee是基于IE...
2020-11-08 21:58:35
1414
原创 嵌入式Linux系统mqtter(支持AES加解密)
1 接口说明mqtter是基于libmosquitto封装出来的C++接口类,同时内部传输报文通过AES加密,基本API如下:注意MQTT的端口是1883,mqtter一样需要ev_proxy的支持,来完成轮询,构造函数中的参数列表分别是:evp: ev_proxy对象指针host:主机地址,本地可以是”localhost”或者”127.0.0.1”port:固定1883topic是接收数据订阅的主题成员函数set_callback用来设置一个回调函数,有数据就会完成回调。.
2020-11-08 00:09:33
725
原创 嵌入式后Linux系统AES加解密
1 简介AES也就是高级加密标准(Advanced Encryption Standard,AES),是一种对称加解密的算法,所谓对称加解密,简单可以理解为,加密方和解密方的密钥是一样的才行,然后约定加解密的策略,就能完成网络安全通信了。密钥是AES算法实现加密和解密的根本,对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。目前AES主要有三种:AES128,AES192,AES256,数字表示的意思是密钥的位数,位数越大运算越复杂同时也越安全。AES加密模式有5种: E.
2020-11-08 00:05:22
792
1
原创 嵌入式Linux系统libmosquitto移植
1 什么是mosquitto1.1 什么是MQTT简单来讲,MQTT是一个基于客户端-服务器的消息发布/订阅传输协议;类似于现在的很多新闻软件,我们订阅了某一个主题(比如体育欧冠板块),那么这个板块有新闻时你就能够收到;同时我们不订阅八卦新闻,那么就是有八卦新闻,也不会收到。MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由
2020-11-07 23:58:29
906
原创 嵌入式Linux系统基于libevent&openssl的https服务
1 重新交叉编译libevent首先我们需要修改configure文件:给OPENSSL_INCS指定为openssl库的绝对路径/相对路径:然后运行命令:./configure OPENSSL_LIBADD="-L../../openssl/openssl-1.0.2d -lssl -lcrypto" --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc这里-L后面加的路径需要根据实际情况而定,可以是相对路径,也可以是绝对路径!
2020-11-07 23:05:44
1394
原创 嵌入式Linux系统openssl库移植
openssl库移植1 什么是openssl可以这么说,只要你的应用程序和网络安全有关系,不管是http还是mqtt,那么都需要依赖到openssl;首先openssl是一个开源库,功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证书验证、PKCS7标准实现和PKCS12个人
2020-11-07 23:00:03
1590
1
原创 嵌入式Linux系统ev_base及ev_proxy
本章节是基于libevent的应用,C++的编程中,如果遇到C接口,我们可以先封装出一个类出来,也就是C转C++的写法。1 ev_baseev_base是基于libevent封装了一层C++类接口,源码文件两个:ev_base.h和ev_base.cpp;接口定义如下:源码其实非常的简单,就是基于libevent实现了定时器和loop,以及接口对资源的管理(内存申请回收等):ev_base::ev_base() { ::signal(SIGPIPE,SIG_IGN)...
2020-11-07 22:56:12
327
原创 嵌入式Linux系统libevent异步事件库的移植
1 什么是libevent首先大家思考一个问题,你的产品开发过程中,是否使用了多线程?是否加了很多线程锁??如果没有多线程,功能能否实现得了???然后我们看看一般工程师得开发方式,比如你的程序需要和串口通信,需要和TCP服务器交互,需要和其它进程通信,所以只能开3个线程去处理这些东西;好一点得工程师还能想到用线程池加负载均衡的方式,但还是多线程!为什么会这样?因为多线程是处理异步事件的一种方法,而这种方法在嵌入式上的开发是不能容忍的。那有没有一种很好的处理异步事件的开源库而且只要一个线程(主进程本身),
2020-11-07 22:52:27
725
原创 开源库常见许可证
我们在开发过程中,如果引用到了开源库,一定一定要小心,尤其是在大公司工作时的产品开发,一定要明白开源库的来源,以及许可证的限制;不然可能会导致公司巨大的法律风险,目前在软件开发中最常见的许可证有如下几种:详细可以查看网站:https://opensource.org/licensesBSD (Berkerley Software Distribution)BSD许可证给予用户在使用开源代码方面很大的自由,分为2-Clause(两条款)和3-Clause(三条款)两类,需要遵守以下规则:1.
2020-11-07 22:47:21
1092
原创 嵌入式Linux系统串口通信协议设计
1 设计基础这里指的协议是应用层协议,针对应用协议的设计,需要注意的有几个基本点:可识别,兼容性,访问控制,可追溯,数据完整性校验。首先是可识别,一般我们采用一个帧头来表示整个报文的起始位置,这个帧头可以用一个32位(uint32_t)的数值来标识,比如 0xFE01A0BC,大端序是 0xFE,0x01,0xA0,0xBC;通常我们把这个数值称为魔数,magic number。然后是兼容性,一般我们用一个字节来标识报文的版本号,这个版本号的作用是以后协议格式发生改变时,可以上下兼容;我们称
2020-11-07 22:44:49
943
原创 嵌入式Linux系统 TCP数据转发服务器
本章节的代码在目录:…\tutorials\Patchs\5. TCP转发服务器1 link对应的源码link.h 和link.c,用来快速搭建TCP服务器/客户端的程序,基于前面TCP和epoll的章节,基本架构:Network Worker指的是TCP服务器/客户端,接收到的数据会经由Parser再到Handler。接口文件link.h内容如下:全局初始化link_init,使用完需要释放资源的link_release:创建TCP服务器link_build_tcp_.
2020-11-07 22:39:47
884
原创 嵌入式Linux系统jsoncpp的移植
jsoncpp是c++实现对JSON格式数据的构建和解析,如果我们的应用程序的主框架是c++写的,那么建议采用该开源库;该开源库同样遵循MITLicense,通过github克隆仓库下来:git clone https://github.com/open-source-parsers/jsoncpp.git代码放在目录:…\tutorials\Patchs\4. jsoncpp移植project目录中存放从该开源库裁剪出来的源文件还有我们的应用:builder.cpp 构建...
2020-11-05 10:30:50
415
原创 嵌入式Linux系统JSON格式及开源库cJSON的移植
1 什么是JSON格式JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。JSON就是一串字符串,只不过元素会使用特定的符号标注:{} 双括号表示对象[] 中括号表示数组"" 双引号内是属性或值: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象),比如 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象而[{"n
2020-11-05 10:27:28
1421
原创 嵌入式Linux系统epoll机制
1 什么是epoll上一章节中,我们创建了一个tcpserver和client,进行数据的收发,而数据收发的过程是阻塞的,如调用到的recv函数,没有收到数据前一直卡住不会往下去执行其它代码。操作tcp也好,读写文件也罢,或者其它文件描述符,本质都是对I/O资源的操作;但对于什么时候来数据可以进行读取,其它方法比如阻塞,线程池并发,select多路复用这些我们一概忽略,基本现在产品开发可以用epoll代替。简单来说,epoll使用红黑树的数据结构去监听并维护文件描述符。通过事件的方式告诉应用层去处.
2020-11-05 10:21:11
454
原创 嵌入式Linux系统TCP链路
1 IP通信IP是Internet Protocol(网际互连协议)的缩写,IP是整个TCP/IP协议族的核心,IPV4地址由四段组成,每个字段是一个字节,8位,最大值是255,IP地址由两部分组成,即网络地址和主机地址。网络地址表示其属于互联网的哪一个网络,主机地址表示其属于该网络中的哪一台主机。A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号,一般用于大型网络。B类:(128.0.0.0-191
2020-11-05 10:18:23
317
原创 嵌入式Linux系统http网络服务及文件传输
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:默认HTTP的端口号为80,HTTPS的端口号为443。交互逻辑C/S模式,如下图所示:1 搭建服务本章我们在windows下启动一个Http服务器用来传输文件,该服务的路径在:…\tutorials\附加资料\1. 软件工具\hfs.exe运行:右键添加文件.
2020-11-05 10:14:22
1433
1
原创 嵌入式Linux系统用户数据区
1 根文件系统区和用户区的区别虽然用户数据是可以合并到根文件系统中进行管理;但在实际的产品开发过程当中,我们会把产品自身的应用程序和数据,都可以归类为用户数据。为了能更好的区分系统层和用户数据,我们的根文件系统只用于访问系统程序,比如ls命令等等,还有必要的系统数据;而用户数据,比如我们的应用程序和数据库等数据,存放在一个独立的分区中,类似于电脑的C盘(系统盘)和D盘(数据盘)的区别。2 用户数据区2.1 分区说明一个NorFlash,比如我们板载的是128MB,就好比是一个电脑上使用的硬盘
2020-11-05 10:10:32
1755
原创 嵌入式Linux系统可读写根文件系统
前言:本章内容仅做了解,实际开发中,从安全和资源要求为出发点,根文件系统必须是只读的;下个章节会介绍一种系统和用户数据解耦的方法。1 简述我们在buildroot后会得到两个根文件系统,目录如下:一个后缀是squashfs,一个是ext2,之前我们在 系统篇 第二章 2.3节中讲解过根文件系统的编译和烧录,其中烧录的类型就是squashfs,这个文件系统固件是readonly类型的,也就是只读文件系统;而ext2是可读写的文件系统,适用于我们开发调试。2 内核配置树修改修改文件:ar
2020-11-05 10:04:58
663
原创 嵌入式Linux系统串口1与ZigBee主控链路
1 设备树节点串口1的设备节点在rk3308.dts中可以找到其中uart1_cts和uart1_rts是硬件流控脚,这只代表引脚有配置为相应的功能脚,并不代表使能硬件流控。使能硬件流控需要从运用层设置下来。需要注意的是,如果使能流控,uart1_cts和uart1_rts必须同时配上。如果不需要流控,可以把uart1_cts和uart1_rts去掉。需要使用DMA时需要以下配置,如果没有需要自己手动添加:dma-names = "tx", "rx"; 使能DMA发送和接收dma-n
2020-11-05 10:02:03
444
1
原创 嵌入式Linux系统ADC按键驱动
1 硬件基础我们的开发板上集成两个ADC的按键,原理图如下,连接主控的SAR-ADC,SAR(Successive Approximation Register)即逐次逼近的算法,第一个通道:2 设备树节点RK3308支持SAR-ADC,我们工程默认已经支持了该驱动,在rk3308.dtsi中可以找到节点:这个设备节点是在rk3308-evb-v10.dtsi中被开启的:3 应用3.1 了解IIO子系统IIO子系统的全称是Industrial I/O subsys..
2020-11-05 09:58:47
1182
原创 嵌入式linux系统RGB调色灯三路PWM驱动
1 硬件基础在我们的开发板上集成了一颗RGB灯组,引脚连接着主控的三路PWM输出,因此我们可以通过三路PWM输出进行调色的功能,硬件原理图如下:2 内核设备树我们把设备树补丁文件放在目录:~/share/patchs/pwm-dts板载的RGB灯珠连接的是主控的三路PWM(PWM1,PWM2,PWM3);这三路PWM的设备树节点在rk3308.dtsi中;默认情况下是disabled的状态,我们只需要将disabled改成okay即可,补丁文件其实就是做了这个事情,可以通过patch
2020-11-05 09:27:46
1082
原创 嵌入式Linux系统中-WiFi-AP工作模式
WiFi工作在AP模式其实就相当于发出热点(和路由器一样),让其它设备来连接自己;这部分涉及到内核驱动和配置树已经在上一个章节支持了,因此本章节不需要涉及kernel部分。1 hostapd1.1 基础什么是hostapd?hostapd 是一个用户态用于AP和认证服务器的守护进程;它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。1.2 应用测试我们建立一个配置文件,用
2020-11-04 09:55:27
1213
原创 嵌入式Linux系统中WiFi-STA工作模式
1 内核配置修改后的配置文件我们放在目录:~/share/patchs/wifi-config-dts和原生配置文件比较,差异点如下:CONFIG_RTL8189FS=y指定WiFi主控芯片型号:RTL8189FS。CONFIG_MWIFIEX=y外接WiFi设备(类似USB网卡)。CONFIG_MWIFIEX_SDIO=y外接WiFi设备SDIO接口支持。我们需要把改动的代码合并过去~2 内核设备树kernel/arch/arm64/boot/dts/r
2020-11-03 21:54:50
1513
原创 嵌入式Linux系统-SD卡挂载方法
U盘的配置项也是支持SD卡的,因此本章内容不需要对内核配置文件进行修改。1 内核设备树配置树:kernel/arch/arm64/boot/dts/rockchip/rk3308-evb-v10.dtsi在文件中搜索sdmmc:这个配置就是SD卡节点,只需要把disabled改成okey即可;为了不修改原生的源码,我们在下图中的目录打了一个补丁:安装补丁:./patchloader.sh卸载补丁:./patchloader.sh -u安装补丁后编译内核即可:m
2020-11-03 21:49:25
2023
1
原创 嵌入式Linux系统中U盘挂载
USB一般分为主机(Host)和从机(Slave),数据传输是建立在Host和Slave的正常连接基础上,比如电脑上的USB口是Host,U盘是Slave;还有一种协议OTG(On The Go),这是一种USB2.0引入的工作模式,可以进行主从协商,什么时候做Host或者Slave由一个ID决定,这个ID是硬件上的管脚来检测的,原理图:本章内容是有关USBHost进行U盘的挂载。1 配置选项说明在目录~/share/patchs/udisk-config中,有一个配置文件,我们已经把.
2020-11-03 21:45:45
1708
原创 嵌入式Linux系统内核Config
本章内容是为后续介绍内容做一个铺垫,主要是帮助大家快速了解kernelconfig的内容和含义;需要大家了解常用config的选项,以及kernel编译构建时的配置过程。1 menuconfig在Linux kernel编译过程中,有一个系统的配置文件,用来指定哪些模块需要被编译进内核,哪些模块不需要用到,这个配置文件可以在顶层通过make menuconfig进行配置,如下:成功运行后会弹出文本选项终端:当我们选择好所有选项并且保存后,会生成一个配置文件,这时候编译kernel,.
2020-11-03 21:40:49
1173
原创 嵌入式linux系统-Kernel串口2做交互终端
1 驱动源码Kernel中串口的驱动程序使用8250通用驱动,路径在:drivers/tty/serial/8250/8250_core.cdrivers/tty/serial/8250/8250_dma.cdma实现。drivers/tty/serial/8250/8250_dw.cdesignwareip相关操作。drivers/tty/serial/8250/8250_early.cearlyconsole实现。d...
2020-11-03 21:20:59
822
原创 嵌入式系统调试Uboot串口交互调试
1 硬件连接我们需要一个USB转串口线来调试,有两种规格如下:规格1规格2其他转换芯片如CH340,PL2303,FTP232也都是可以的,FTP232能够支持的最大波特率会更高。在板上可以看到如下一个接口:我们使用串口2也就是UART2来做调试口,将USB转串口线的RX,TX,GND连接到板子上UART2的TX,RX,GND。2 波特率配置如果CONFIG_BAUDRATE不是115200,修改为115200,因为不是所有芯片都可以支持高波特率的(15000
2020-11-03 21:14:19
2534
原创 嵌入式linux系统交叉编译
本篇内容需要借助硬件开发板应用式学习--笔者是采用瑞芯微的RK3308平台进行梳理(可参考文章结束内容推荐):我们的整个软件工程目录在:~/workspace/Embedded_kits_rk3308prebuilts目录存放 U-Boot、Kernel 编译使用的交叉编译工具链;u-boot 目录存放着 U-Boot 部分的源码;kernel为内核部分源码;buildroot目录存放 buildroot 开源项目代码,可定制根文件系统;device 目录存放板级配置及一些...
2020-11-03 20:42:45
812
原创 嵌入式linux-系统篇for固件分区和烧录
本篇内容需要借助硬件开发板应用式学习--笔者是采用瑞芯微的RK3308平台进行梳理(可参考文章结束内容推荐):下文是正式使用开发套件的熟悉过程,需要我们能够掌握固件的分区内容,烧录的方法。1 准备工作1.1 硬件连接说明本章需要用到的工具和固件目录如下:烧录用的工具:…\附加资料\1. 软件工具\AndroidTool_Release_v2.61.zip测试固件:…\附加资料\2. 参考资料\TestImages首先准备好硬件连接,通过配套的USB线连接电脑USB口到开发板上的小
2020-11-03 20:22:53
1869
原创 嵌入式系统内容基础
1 固件基本组成1.1 硬件系统结构嵌入式硬件基本组成包括:主控芯片(MCU),FLASH,RAM,外设等,我们提供的开发板MCU型号是RK3308,64MB的RAM,外挂一颗128M的SPI-Nand-FLASH。RAM:也称内存,掉电数据不保存。FLASH:非易失性存储器,掉电数据不会丢失,从总线访问的方式进行区分,FLASH可以分为SPI(串行)和CFI(也叫JEDEC或者Parallel,并行);从存储类型可以分为Nor(价格较高,存储空间一般比较小,但它可以不用初始化,可以在其内部
2020-11-03 20:04:37
651
1
原创 嵌入式Linux系统Shell基础学习
Shell是用户态进行高效,安全访问Linux内核态的一个中间桥梁,是一个应用程序,同时是一个可编程的应用程序(也叫解析器),这种编程的语言是脚本语言(Shell脚本,由解析器解析运行的语言);和音乐播放器一样(酷狗,QQ音乐,网易云),Shell这个解析器也有很多类型:sh、bash、csh、tcsh、ash;在X86服务器平台我们基本都是使用bash,bash也是Linux原生支持的解析器,由GNU组织开发,兼容sh(这意味着针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行);但.
2020-11-03 19:59:06
523
原创 嵌入式C语音基础夯实备用实战
C语言虽然是基础,但实际上是要求学者已经具备入门的能力,然后通过本章节将C语言里面几个比较重要的板块进行加深;如果学者对C语言并不了解,建议先通过网上搜索入门教程学习后再进入本章节。1.数据类型1.1类型定义C语言标准中,常用的类型如下表格: 类型 存储大小 取值范围 signed char 1字节(Byte),8bits -128 到 127 unsi...
2020-11-02 23:22:21
347
2
原创 嵌入式Linux基本命令-常用基础
1.常用命令出于快速掌握的考虑,我们只针对开发中常用到的基本命令和选项进行讲解。1.1 ls用于显示指定工作目录下的内容。选项:-a 显示所有文件及目录。-l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出。-R 若目录下有子目录,则子目录也列出。命令测试:1.2 cdcd命令用于切换当前工作目录至 dirName(目录参数)。比如: cd /usr/bin特殊的,切换到家目录:cd~ 在我们的ubuntuserv...
2020-11-02 22:53:51
1561
原创 Linux学习开发环境及交叉编译链的搭建
1、嵌入式Linuxc/c++的开发基本是基于原厂的BSP或者开源项目比如OpenWrt之类的Linux分支开展的,和在服务器(x86)上的开发模式有非常大的差异,本章我们会尽最大可能还原实际企业开发的环境,让大家提高学习和开发的效率:A.了解Linux开发服务器和开发终端的关系B.了解及使用Samba网络服务C.了解及使用SSH网络服务D.掌握交叉编译的过程开发服务器的搭建1.1VMware导入开发服务器一般企业都会有自己的服务器,而服务器系统一般都是基于Lin.
2020-11-02 22:15:21
416
原创 嵌入式Linux开发实战心路分享
做为一个从事嵌入式开发7年的资深嵌入式软件工程师,在大小公司都就职过;笔者主要擅长于基于Linux/安卓的原厂BSP系统裁剪,内核驱动的适配以及应用软件架构的设计,对主流的IoT通信协议以及开源库的裁剪非常熟悉,基本精通基于c++或c的嵌入软件开发,对语音识别领域也很熟悉;同时笔者早期也在创业公司就职过,对于硬件,生产供应链有一定的了解,为了让后来者不管是出于就业还是兴趣能少踩坑,笔者希望可以将自己踩过的坑做总结,分享给大家,也希望学者可以早日具备系统整体架构和产品落地的能力。 ...
2020-11-02 21:52:46
754
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人