自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Frank的专栏

从起源理解事物,就是从本质上理解事物。

  • 博客(145)
  • 资源 (3)
  • 收藏
  • 关注

原创 开始使用OpenCV

开始使用OpenCV1. 编译OpenCV1.1 使用命令行的方式配置OpenCVOpenCV官网教程OpenCV官网教程使用命令行的方式进行配置,写的很详细,按照教程操作,一般都能成功,由于国内访问GitHub不稳定,所以推荐使用wget获取OpenCV源码压缩包,这样比较快。OpenCV的CMAKE的预定义的变量cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-master/modules-DBUILD_NEW_PYTHON_SU

2021-08-08 17:27:04 1573 2

原创 离线安装STM32CubeMX软件包

离线安装STM32CubeMX软件包如果你使用STM32CubeMX,并且你的电脑没有联网,那么这篇文章对你有用。1. 获取STM32软件包点击下载你需要的STM32软件包注意:本文以STM32F1系列为例进行讲解。从上图中可以看出,STM32Cube软件包分为两部分:基础包,版本是1.8.0补丁包,版本是1.8.4,既是升级包每一个版本的STM32CubeMX软件包,都会有基础包和补丁包,比如1.7版本的基础包就是1.7.0,升级包(补丁包)就是1.7.x。2. 安装STM32

2021-06-12 10:12:27 5568 6

原创 Linux通过shell脚本操作串口

Linux通过shell脚本操作串口1.向串口发送数据循环发送不同的字符串到串口/dev/ttyS1,时间间隔5秒#!/bin/bashwhile :do echo -e "send_string_1\r" > /dev/ttyS1 sleep 5 echo -e "send_string_2\r" > /dev/ttyS1 sleep 5done循环发送不同的字符串到串口/dev/ttyS1,时间间隔0.5秒#!/bin/bash

2020-07-20 21:55:21 5000

原创 VSCode与CMake搭配使用之交叉编译

首先你需要配置VSCode中的CMake插件:VSCode与CMake搭配使用之基本配置,如果你已经配置好了CMake插件,请继续往下看:1. 在VSCode中设置交叉编译工具打开cmake-tools-kits.json文件:vim .local/share/CMakeTools/cmake-tools-kits.json这个文件的作用就是:告诉VSCode当前系统中都有哪些编译器可供使用,一般是CMakeTools插件自动获取到的,但是CMakeTools插件无法自动获取到我们的交叉编译器。

2020-07-20 21:48:21 9328

原创 VSCode与CMake搭配使用之基本配置

1.首先安装VSCode插件CMake和CMake ToolsCMake插件主要功能是CMake语法高亮、自动补全CMake Tools的功能主要是结合VSCode IDE使用CMake这个工具,比如生成CMake项目、构建CMake项目等2.新建CMake项目Ctrl+Shift+p打开VSCode的指令面板,然后输入cmake:q,VSCode会根据输入自动提示,然后选择CMake: Quick Start然后选择适合你的编译器(VSCode会将你安装的编译器都罗列出来供你选择。如果你

2020-07-20 21:38:53 68981 6

原创 C语言宏定义#与##

C语言宏定义#与##“#” 字符串化#include <stdio.h>typedef struct os_thread_def { char *name; ///< Thread name int pthread; ///< start address of thread function int tpriority; ///< initial th

2020-07-19 19:36:00 326

原创 浅析C语言中的const与volatile关键字

C语言const与volatile1. const声明一个只读变量。2. volatile告诉编译器不要去优化volatile修饰的代码,并且每次直接从数据源头读取数据,不允许将数据缓存到寄存器。注意:对volatile变量的操作不是原子性的。注意:volatile在c语言中和在java语言中的含义是不同的,本文重要阐述在c语言中的作用2.1 volatile的用途2.1.1 寄存器访问(每次都直接从寄存器地址获取数据)访问寄存器必须使用volatile修饰符。对可读可写的寄存器使用v

2020-07-19 19:30:03 641

原创 类linux驱动模块框架module_init(init_fun)在STM32上的实现

设计思想利用编译器的特性,在程序编译时将各模块初始化函数顺序存放到内存的指定地址,然后在程序运行时main函数从这块内存区域中 依次调用各模块的初始化函数,自动完成各个模块的初始化工作,同时增强了程序的高内聚低耦合特性,提高了软件的质量。试验环境工具链:Keil5开发板:STM32F103ZE1. 修改链接脚本修改链接脚本的目的是:在STM32的内存中,留出一块合适的大小(大小根据自己的需求调整), 用来存放各个模块的初始化函数1.1 内存分配在Keil中新建一个工程,编译后在工程目录下的O

2020-07-19 19:15:09 428

原创 完美解决:STM32CubeMX生成MDK项目报错

1. 报错信息2. 解决方法项目路径中不能有中文卸载已安装的java,然后安装java8

2020-03-13 11:18:28 4469

原创 STM32机器学习开发实战

最近ST(意法半导体)公布了一个演示视频:在STM32上使用机器学习算法进行动作识别。视频如下(小编自己翻译的双语字幕,如果喜欢请关注本公众号,谢谢支持!)点击播放视频​视频中使用的硬件是SensorTile开发板,SensorTile由一颗STM32L476JGY微控制器,一颗LSM6DSM MEMS加速度和陀螺仪芯片,一颗LSM303AGR加速度和地磁芯片,一颗LPS22HB气压传感器芯...

2019-10-25 22:15:09 2997

原创 STM32内部Flash使用磨损均衡算法(Erase Leveling)

STM32内部Flash使用磨损均衡算法(Erase Leveling)1. 设计思路芯片:STM32F103ZET6软件:STM32CubeHALFlash Page Size:2K使用Flash的一页Page60(0x0801E000 ~ 0x0801E800(不包含))进行磨损均衡算法试验数据帧格式:|0x5A|data1|data2|0xA5|本实验F...

2019-09-04 13:49:18 6641 1

原创 你真的理解补码吗?

补码“在计算机系统中,数值一律用补码来表示。” 教科书上虽然这么说,但是却没有告诉我们为什么,今天小编就带大家一探究竟!计算机数值运算的基础硬件就是加法器,所以我们就从加法器讲起。1. 加法器加法器是计算机数值计算的最基础硬件单元,加减乘除都是以加法器为基础实现的。加法器的构成如下图所示,其中S是和数,C是进位。半加器半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没...

2019-07-13 20:57:50 331

原创 什么是边缘计算?

边缘计算其实是分布式计算的一种,边缘设备有许多特征是云端无法取代的,下面通过一段视频,直观的了解一下边缘计算吧!博客不能上传视频,想看视频的同学,请文末扫码,关注小编微信公众号!1.聊聊章鱼在聊边缘计算之前,我们先聊聊这个星球上最魔性的生物之一——章鱼。抛开喷墨、变色伪装这些基本技能不提,章鱼还能从瓶子内部打开瓶盖逃走,上演各种精彩绝伦的逃跑计划,或者悄悄把不喜欢的食物扔进排水口,它...

2019-04-07 20:59:33 792

原创 编译Android源码报错:clang++ kernel opps

这是swap区不够大的原因。导致clang++ kernel opps 解决方法: 请加大分区: sudo fallocate -l 6G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile 开机自动挂载swap: 使用 vi 或 nano 在 /etc/fstab 文件底部添加

2019-04-05 11:19:19 860

原创 《ARM嵌入式机器学习设计》连载1

本文翻译自《ARM Embedded Machine Learning Design》一书。本书共有5章,小编会分别翻译,并在公众号连载,喜欢的同学请关注小编,以免错过精彩内容哦!嵌入式软件杂货铺专注于边缘计算。第一章:为什么需要将机器学习迁移到边缘设备?机器学习(ML)是新计算时代以来计算机领域最伟大的转折点——它已经对几乎所有市场产生了重大影响。它领导了互联汽车技术的巨大进步,改变了医...

2019-03-31 22:22:22 958

原创 搭建自己的wiki知识管理系统

搭建自己的wiki知识管理系统本文小编将带大家从零开始搭建一个属于你自己的wiki系统。开源的wiki系统有很多,比如:大名鼎鼎的MediaWiki小巧易用的DokuWiki国内开源的minDocGitbookDocsifyHexoMkDocs小编选择使用的是MkDocs,因为它部署和使用都非常的简便,特别适合作为个人wiki知识管理系统。简单的说MkDocs就是将Mar...

2019-03-31 16:22:57 26894

原创 你知道吗?MCU也能做Machine learning (ML)

你知道吗?MCU也能做Machine learning (ML)刚刚过去的2018年被称为“人工智能元年”,2019年人工智能将会有更大的发展,将会有更多的AI项目落地。随着单芯片计算力的不断增长,机器学习(ML)不再是云计算和高性能处理器的专利,边缘计算正在崛起!边缘计算为AI提供了新的可能性,比如实时智能语音识别和实时人脸检测,其实时性、可靠性和隐私安全性是云计算无法相比的。实战开始...

2019-03-24 21:19:09 864

原创 搭建属于自己的云同步盘

第一篇:Samba初体验家里一台电脑,公司一台电脑,文档来回Copy!!!Copy麻烦,版本混乱,工作效率低,有没有?同学把这一切都交给云同步盘吧!但是,但是,但是…现在中国市场上的云同步盘非常少,一些大厂都关闭了云同步盘的功能,还有一些云同步盘非VIP用户有网速限制,我能怎么办!!!请你不要悲伤,就让小编带着你实现自己的云同步盘吧!在第一篇中小编将教会你Samba的基本使用方法,Let...

2019-03-07 22:08:44 3162

原创 浅析数据对齐

数据对齐1、为什么需要数据对齐?最早在8位CPU的时代,是没有数据对齐的需求的。当CPU发展到16位、32位或者64位时代时,才有了数据对齐的需求,因为CPU一次取4个字节的数据(以32位CPU为例),也就是说CPU是这么取数据的:0x00000000 , 0x00000004 , 0x00000008 ,0x0000000C ….如果把 int a = 0x12345678 存储在地址 0x000

2017-08-05 19:08:19 964

原创 linux模块相关的命令

1、查看设备号cat /proc/devices2、加载模块insmod xxx.ko3、查看模块lsmod 4、卸载模块rmmod xxx.ko5、创建设备节点mknod /dev/xxx6、删除设备节点rm -f /dev/xxx

2017-06-05 00:02:07 541

原创 【记录】linux内核打补丁、编译

JZ2440配套的Linux内核(第一期)在使用之前需要打补丁,要使用光盘里的补丁文件,因为虚拟机中的补丁文件太老了1、解压内核tar -xjvf linux-2.6.22.6.tar.bz2 2、打补丁首先进入Linux内核根目录,然后使用以下命令打补丁patch -p1 < ../linux-2.6.22.6_jz2440.patch3、编译内核cp config_ok .configmake

2017-06-04 18:29:12 1208

原创 【知识点】Android Studio之Gradle的几个知识点

一、Android Studio中Gradle版本的查看 二、Android Studio中Gradle版本的更新请参照 http://www.jianshu.com/p/00beddbe3dbc附录:Gradle的下载地址:http://services.gradle.org/distributionsGradle与Android Studio中Gradle Plugin的版本对照关系h

2016-09-27 11:18:14 505

原创 【记录】使用git进行多人协作开发

官方教程:https://help.github.com/articles/set-up-git/一、项目负责人在github创建项目仓库(项目名称:alarm)此处不再叙述创建过程二、项目成员各自Fork项目alarm此处不再叙述fork过程三、保持你fork到自己github下的alarm项目与项目负责人创建的alarm项目同步详细步骤请看(Keep your fork synced):http

2016-09-04 18:32:24 2087

原创 【记录】科大讯飞语音控件的使用——Android Studio

一、将libs文件夹移至Android Studio的Project的根目录下将科大讯飞提供的SDK中的libs文件夹直接拖拽至Android Studio的Project的根目录下 二、导入xxx.jar文件其实.jar文件已经存在于libs文件夹下了,不过此时它并不会随工程一起编译,所以我们还需要做一些设置。 设置方法很简单,如下图所示: 三、导入xxx.so文件其实.so文件

2016-08-19 11:18:16 6395 2

原创 【知识点】浅谈浮点数

一、浮点数在内存中的表示方式在C语言中: 类型 比特(位)数 float 32(4字节) double 64(8字节) 无论是单精度还是双精度在存储中都分为三个部分: 1. 符号位(Sign) : 0代表正,1代表为负 2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储 3. 尾数部分(Mantissa):尾数部分float数据类型在内

2016-08-09 16:04:04 1352

原创 【知识点】bit-band(stm32)

STM32 bit-band

2016-07-31 18:36:09 780

转载 【记录】链接地址

原文地址:点击查看原文 连接器脚本xxx.lds文件中指定的地址,就是链接地址,程序运行时必须位于它的链接地址处,汇编文件中的各个标号或者c文件中的各个函数名(函数的入口地址)对应的链接地址就是由链接脚本中的起始链接地址和各个目标文件(.s或.c文件编译但还为链接的文件)的排放顺序有关。这些链接地址可以通过查看可执行文件的反汇编文件即xxx.dis文件来获得。如果你不使用全局变量或者静态变量,访问

2016-07-18 10:06:31 716

原创 【记录】Makefile中的%和*

Makefile中的%表示通配符,而*表示任意字符 举例,%.o表示匹配所有的.o文件,注意是用于匹配的。 *.o是表示所有的.o文件。 用途方面:前者一般用作目标,后者一般用作删除

2016-07-18 09:40:00 1637

原创 【记录】常用ARM汇编指令

1.立即寻址 ADD R0,R0,#0x01 ;(R0)=(R0+1) 2.寄存器寻址 ADD R0,R1,R2 ;(R0)=(R1+R2) 3.寄存器间接寻址 LDR R0,[R1] ;(R0)=([R1]) STR R0, [R1] ;([R1]=(R0))

2016-07-18 09:38:06 358

原创 【记录】Makefile

Makefile简介 在执行make之前,需要一个命名为Makefile的特殊文件来告诉make需要做什么,该怎么做。通常,make工具主要被用来进行工程的编译和程序的连接。 当使用make工具进行编译时,工程中以下几种文件在执行make时将被编译或重新编译: 1.所有的源文件都没有被编译过,则对所有的C文件进行编译和链接,生成最后的可执行程序。 2

2016-07-18 09:37:17 347

原创 【记录】Makefile中的$@ $^ $<

$@表示目标文件 $^表示所有的依赖文件$<表示第一个依赖文件

2016-07-18 09:36:23 344

原创 【记录】MOV与LDR

数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。 MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中。

2016-07-18 09:34:09 435

原创 【记录】ldr

没有“LDR R1,0x12345678 ”以下两条指令是一样的,都被称为“伪指令”,就是说编译器会把这条指令替换成其他合适的指令。 LDR R1, =0x12345678 LDR R0, =LED_TAB 如果这些数值不太复杂,那么就会用mov指令代替,比如: ldr r1, =0x00 在编译时就会变成: mov r1, #0x00 如果这些数值很复杂,那么编译时,这个数值会被保

2016-07-18 09:32:48 442

原创 【记录】dd

dd iflag=dsync oflag=dsync if=210-uboot.bin of=/etc/sdb seek=1dd(disk dump) iflag(input flag) oflag(out flag) dsync(data sync)详细信息请使用一下命令查询: man dd info dd dd –help

2016-07-18 09:31:30 374

原创 【记录】.global _start

.global关键字用来让一个符号对链接器可见,可以供其他链接对象模块使用。 .global _start 让 _start 符号成为可见的标识符,这样链接器就知道跳转到程序中的什么地方并开始执行。linux寻找这个 _start 标签作为程序的默认进入点。.global关键字用来让一个符号对连接器可见,可以供其他连接对象模块使用。 .global _start 让_start符号成为可见的标示

2016-07-18 09:28:39 1764

原创 【记录】Makefile

make是如何工作的 在默认的方式下,我们只需键入make命令。那么: 1、make会在当前目录下找出名字叫”Makefile”的文件。(详见:Makefile的文件名) 2、如果找到Makefile,make将会找到文件中的第一个目标文件(firstTarget),并把这个文件作为最终的目标文件。 3、如果firstTarget不存在,或者firstTarget依赖的文件firstRely

2016-07-18 09:27:09 397

原创 【记录】arm-linux-gcc(ld,objcopy, objbump)

gcc是编译器,负责对c代码的编译, ld是连接器 负责将多个*.o的目标文件链接成elf可执行文件。elf可执行文件是unix常用的可执行文件类型,就像windows的exe文件。elf文件中有很多信息包括段信息还有头信息,这些信息对硬件是没有意义的,所以有的时候我们通过objcopy将elf转化成bin 文件加载到内存中运行,bin文件就是一个纯二进制文件,并且你可以通过objdump将elf文

2016-07-18 09:26:13 476

原创 【记录】Lua中冒号的意义

当一个table内的方法被以冒号调用的话表示把这个table作为第一个参数传进去local t = {}t.fun = function(tab,v) print(tab,v)endt:fun(123)t.fun(t,123)

2016-07-15 16:07:10 1931

原创 【知识点】浅谈IP地址

一、IP地址IP地址由网络号和主机号两部分组成那么对于 “ 192.168.1.110 ”这个IP地址来说,网络号是什么?主机号又是什么呢? 欲知答案,且看下面分解二、子网掩码子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址(网络号)和主机地址(主机号)两部分。255.255.255.0是我们常见的子网掩码,它的作用只有一个:就是将某个IP地址

2016-07-15 11:57:04 3284

原创 详解HTTP GET请求

实例1:NodeMcu通过TCP实现HTTP GET请求(无请求主体)srv = net.createConnection(net.TCP, 0)srv:on("receive", function(sck, c) print(c) end)srv:connect(80,"fanyi.youdao.com")srv:on("connection", function(sck, c) sck:

2016-07-14 15:38:50 8024

一个账号管理器(自制)

账号越来越多有没有,账号管理越来越麻烦有没有。账号助手来帮您!

2014-10-05

Zigbee节点的绑定,不一定非要建立绑定表

在SerialApp中 节点通过ZDO MatchReq 来帮定设备 源节点发出匹配描述符请求(请求数据包里有源节点的端点号 网络地址 ProfileID 输入输出簇 以及ClusterID) 目标节点收到这个请求后 对这个请求进行处理 处理后向源节点发出匹配描述符响应(响应数据包里有目标节点的网络地址 匹配到的端点(目标节点中)及其个数 状态 序列号) 源节点在收到响应消息后 对响应数据包进行处理 从中取出目标设备的网络地址 匹配的端点号 写到这里我突然想到 匹配描述符时 发送的匹配描述符请求数据包用的是广播的形式 那么网络中所有的节点都将收到这个数据包 这里我们假设网络中所有的节点都注册了Match Desc req 那么所有的节点都将与源端点进行匹配 那么所有的节点也都会向源节点发出匹配描述符响应 对于源节点来说 a 多条响应消息该如何处理 然后就以这个网络地址和端点向外发送数据包">在SerialApp中 节点通过ZDO MatchReq 来帮定设备 源节点发出匹配描述符请求(请求数据包里有源节点的端点号 网络地址 ProfileID 输入输出簇 以及ClusterID) 目标节点收到这个请求后 对这个请求进行处理 处理后向源节点 [更多]

2014-05-31

ZDO终端绑定请求

使用ZDP EndDeviceBindReq 绑定的过程分析

2014-05-31

空空如也

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

TA关注的人

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