自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

欲盖弥彰1314

嵌入式小菜鸟~~~

  • 博客(156)
  • 资源 (5)
  • 论坛 (4)
  • 收藏
  • 关注

原创 Dahlin控制算法实现

参考 :https://blog.csdn.net/yin_bu_feng/article/details/85871595大林控制算法:#ifndef _DALIN_CONTROLLER_H_#define _DALIN_CONTROLLER_H_#ifndef __API__#define __API__#endif#ifndef __STATIC_INLINE__ #define __STATIC_INLINE__ static inline#endifstruct Da

2021-07-30 18:43:58 17

原创 关于STM32 double类型数据计算

double PresetFlow2PVavleDuty(float presetflow){ double n[8] = { 49.2335778711886, // a 0 55.9585083556069, // b 1 -13.5915770179714, // c 2 1.54143446997669, // d 3 -0.0897576896073748,...

2021-07-30 18:43:16 10

原创 关于曲线拟合

最近由于需要,要对数据进行曲线拟合,知道matlab可以,但安装包太大以及不会用;用python也可以吧,但不方便,所以就用excel来拟合。在将拟合公司用于实测计算的时候发现,计算结果错得离晒谱。兜兜转换,发现是拟合多项前面系数精度的问题导致的。果然还是不能用excel进行重要数据的拟合。在网上找了一个在线拟合工具,拟合出来的多项式方程,完美计算出了结果可以看到算出的每一项的多项式的精度比excel好太多了。用这个工具curvefitter也可以。...

2021-07-28 18:35:31 12

原创 STM32 编译错误记录\ARMCC\Bin\..\include\stdio.h(352): error: #20: identifier “size_t“ is undefine....

前一次编译还没有错误,做了一些改动后就编译出错。以前还出现过很多次类似的情况。 void Delay_Init(void);C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h(352): error: #20: identifier "size_t" is undefined int /*mode*/, size_t /*size*/) __attribute__((__nonnull__(1)));C:\Keil_v

2021-07-20 14:55:49 44 2

原创 修改lvgl Linux demo使用tslib获取触摸坐标

1、为什么要修改/(ㄒoㄒ)/~~交叉编译官方lvgl linux demo发现触摸坐标不准确。官方demo获取坐标的做法是:evdev_fd = open(EVDEV_NAME, O_RDWR | O_NOCTTY | O_NDELAY);if(evdev_fd == -1) { perror("unable open evdev interface:"); return;}fcntl(evdev_fd, F_SETFL, O_ASYNC | O_NONBLOCK);while

2021-05-26 23:39:43 107

原创 sudo make install安装交叉编译库错误解决

交叉编译过很多个库,经常出现sudo make install 安装时出现提示arm-linux-gnueabihf-xxx command not found以交叉编译tslib库为例sudo make install 出现以下错误:/local/tslib/etc/pointercal\" -DTSLIB_INTERNAL -fvisibility=hidden -DGCC_HASCLASSVISIBILITY -O2 -Wall -W -fPIC -module -avoid-version -

2021-05-06 23:10:06 96

原创 emWin的Button控件的单击、双击、长按等识别

emWin的button按钮控件只有按下和弹起两种消息,想识别emWin的双击、长按等还不得不另寻他法。突然想到emWin的button和物理机械按钮有什么不同呢?MulitiButton库应该可以用,try to do it.MulitiButton仓库地址:GIthub地址:https://github.com/0x1abin/MultiButton使用起来和物理机械按键一样1、定义button对象static struct Button g_PressureUp; //static s

2021-04-21 13:40:43 121

原创 记一个#if条件编译问题

#if 条件编译还是用得少,最近编写测试代码发现一个以前不知道的问题。代码1:enum { TEST_A = 0, TEST_B = 1, TEST_C = 2,}; #define TEST TEST_Bint main(){#if (TEST == TEST_A) printf("test A\r\n");#elif (TEST == TEST_B) printf("test B\r\n");#elif (TEST == TEST_C

2021-04-08 17:59:36 35

原创 MQTT协议软件包moquitto C语言编程使用

mosquitto-2.0.9安装:https://blog.csdn.net/qq_36413982/article/details/115184473mosquitto的API文档:/home/roger/src/mqtt/mosquitto/lib/mosquitto.hhttps://mosquitto.org/api/files/mosquitto-h.html#mosquitto_loop_forevermosquitto的API简单易用,基于回调函数编程。订阅者mosquitto_su

2021-03-25 13:06:33 75 3

原创 CMake构建mosquitto应用程序失败 - /usr/bin/ld: cannot find -lmosquitto

CMakeLists.txt:cmake_minimum_required (VERSION 2.8)project(mosquitto_pub)include_directories("usr/include/") #设置头文件路径link_directories("/usr/lib/") #设置库路径aux_source_directory(. DIR_SRCS)add_executable(mosquitto_pub

2021-03-24 18:54:59 71

原创 mosquitto-ubuntu编译安装

1、下载mosquitto源码官网 http://mosquitto.org/download/ 下载源码。直接通过命令下载:wget http://mosquitto.org/files/source/mosquitto-2.0.9.tar.gz2、解压进入目录,解压。 tar -zxf mosquitto-2.0.9.tar.gz3、解决编译错误错误1:In file included from mosquitto.c:17:0:../config.h:48:35: fata

2021-03-24 18:53:11 195

原创 mosquitto测试使用

PC主机上测试mosquitto1、搭建mosquitto环境安装mosquitto:sudo apt-get install mosquitto安装mosquitto客户端:sudo apt-get install mosquitto-clients2、测试测试步骤:1、启动服务mosquitto2、订阅者通过mosquitto_sub订阅指定主题消息3、发布者通过mosquitto_pub 发布指定主题的消息1、启动服务service mosquitto start

2021-03-23 16:26:56 120 2

转载 Linux中鲜为人知的幕后工作者——Idle, Init & Scheduler

Linux中鲜为人知的幕后工作者——Idle, Init & Scheduler · Issue #43 · abbshr/abbshr.github.io · GitHubIdle进程和Init进程, 谁是老大?https://github.com/abbshr/abbshr.github.io/issues/43

2021-03-10 13:44:08 32

原创 Linux驱动学习笔记 -- 驱动总线实验

驱动总线在Linux系统中,除了硬件总线,还有一种软件虚拟出来的总线 – 驱动总线bus这种驱动总线的作用:软件与硬件代码分离,提高程序的复用性驱动总线分三个部分: 三者都是在/include/linux/device.h中定义device - 关联硬件代码struct devicedevice_driver - 关联软件代码struct device_driverbus_type - 管理总线,设置匹配规则,device和device_driver通过匹配规则进行匹

2021-02-03 22:27:54 42

原创 VirtualBox不能安装64位Linux系统解决办法

电脑硬件:华硕主板 AMD CPU问题:virtualBox不能安装64位Linux系统问题原因:AMD CPU的虚拟化**(SVM Mode)**功能未开启解决办法:

2021-01-29 12:04:21 159

原创 嵌入式开发 Linux 出现no space left on device问题

出现no space left on device问题搜索发现是由于磁盘空间不足导致1、引发问题操作1、执行mount_nfs.sh脚本挂载网络文件系统,由于主机IP地址错误,必定是挂载失败的2、没等挂载完就强行使用ctrl + c终止了挂载操作2、解决办法2.1 查看磁盘空间状态 df -h/dev/mmcblklp2 被塞爆了2.2 查看所有文件磁盘占用情况 du -sh /*/var/目录空间占用最大,差不多占了全部空间2.3 猜测可能是log日志占用很大,查看该可以详细文

2021-01-25 23:46:58 74 1

原创 单片机 裸奔 模拟多任务调度模型 :消息队列 + 状态机 + 定时器

对于简单的嵌入式应用多数裸奔就能解决,但写出来的裸奔代码质量也由好坏之分。在网上看到了这样一篇文字:上面说到了裸奔环境下的多任务模型 - stateMachine + timerTick + Queue,也提到具体怎么做。伪代码实现//消息类型enum MessageType { MSG_USART1, MSG_USART3, MSG_20MS = 20, MSG_100MS = 100,};typedef enum MessgeType enMsgTypestMsgQueue

2021-01-23 12:22:25 365 1

原创 内核模块编译错 - ERROR: Kernel configuration is invalid.include/generated/autoconf.h

由于虚拟机安装分配的磁盘空间太小,重新安装了虚拟机,编译环境都要重新搭建。1、根据文档安装了必要的工具:2、编译模块要先编译内核:直接执行make_deb.sh脚本进行编译,编译也没有出现啥错误:3、接着尝试编译内核模块:编译出错: ERROR: Kernel configuration is invalid. include/generated/autoconf.h or include/config/auto.conf are missing. R

2021-01-23 11:53:56 519

原创 OOP封装-隔离变化

封装 —— 保护程序的隐私, 不该让调用者知道的事,坚决不能暴露出来。为什么要封装隔离变化程序的隐私通常是程序最容易变化的部分,比如内部数据结构、内部使用的函数和全局变量等,需要把这些代码封装起来,从而让它们变化不会影响系统其他部分降低复杂度接口最小化是软件设计基本原则之一,最小化接口最容易被理解和使用,所以封装内部细节,只保留用户需要的最小接口。如何封装隐藏数据结构图方便直接访问数据结构的成员,容易造成模块之间紧密耦合,从而给以后的修改带来困难。内部使用的数据结构,外部

2021-01-14 12:07:11 67

原创 LCD & 触摸屏调试记录

1、LCD闪烁的问题通过搜索了解到,极大可能是驱动频率过低的情况,导致屏幕闪烁解决方法:调整LCD的时钟频率触摸屏GT911遇到问题1、触摸屏原点(0, 0)在右下角,LCD的原点(0, 0)在左上角查看触摸屏相关手册知道触摸屏原点有些芯片决定的,有些是代码决定的。经过和供应商确认,触摸屏原点默认在左上角(连接排线的那一边是下方)原点不重合问题解决办法:(1) 通过软件进行坐标转换,将触摸屏坐标转换成和LCD对应(2) 改变LCD的扫描显示方向,使LCD和触摸原点重合最终采用改

2020-12-28 12:03:29 106

原创 Linux内核模块

目录Linux内核模块Linux内核模块的程序组成1、模块加载函数2、模块卸载函数3、模块许可证声明4、模块参数(可选)5、模块导出符号(可选)6、模块作者等信息声明(可选)7、导出符号共享导出符号到内核符号表:8、模块使用计数Linux内核模块不编译进内核映像,控制内核大小。可动态加载到Linux内核中执行的程序模块,不加载不执行,加载执行便成为内核一部分。模块文件后缀名为.ko,如hello.ko就是一个模块目标文件。insmod ./hello.ko or modprobe ./

2020-11-24 07:40:11 79

原创 sqlite3笔记

本地安装sudo dpkg -i *.deb测试是否安装成功输入命令sqlite3若出现sqlite版本等信息就证明安装成功。在线安装必须能连接互联网sudo apt-get install sqlite3创建数据库创建一个名为student的数据库sqlite3 student.db数据库基本命令1、系统命令.help //帮助文档.quit //退出.exit //退出.table //查看数据库表.databases //查看打开的数据库2、sql命令2

2020-11-19 21:31:43 72

原创 使用CMake进行交叉编译

CMakeLists.txt:# CMake 最低版本号要求cmake_minimum_required (VERSION 2.8)# 项目信息project (DogeLog)#设置C的交叉编译工具set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) #设置C++的交叉编译工具set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)# 查找当前目录下的所有源文件# 并将名称保存到 DIR_SRCS 变量

2020-11-13 20:34:58 339

原创 NFS挂载失败: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.

更新镜像前是可以挂载的, 使用SD卡更新成最新的debian系统镜像后就出现下面错误mount: /home/debian/nfs_rootfs: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.之前挂载成功的命令是这样的:#!/bin/shmount -o nolock -t nfs 192.168.1.105:/hom

2020-10-20 19:43:48 3871

原创 Qt 线程QThread

线程线程中无法使用任何界面部件类,所以界面与线程之间的协作通过信号和槽或者其他通信机制。1、线程类QThread类2、相关信号[signal] void QThread::finished() //线程终止结束时发出的信号[signal] void QThread::started() //线程开始运行发出的信号3、相关槽[slot] void QThread::quit() //线程退出[slot] void QThread::start(Priority p

2020-10-02 23:53:25 104

原创 Qt 笔记 — 设置应用程序&窗口图标&系统托盘图标

1、设置应用程序图标可执行文件**.exe**的图标在**.pro**工程文件中添加 RC_ICONS = “xxxxx.ico” 即可,如:RC_ICONS = "file_logo.ico"如上所示这样做,图标文件需要和**.pro**工程文件在同一目录下2、设置窗口左上角图标从资源文件中调用下面API设置窗口图标 this->setWindowIcon(QIcon(":/res/res/file_logo.png"));3、设置系统托盘图标相关类:#include &

2020-10-02 23:35:47 167

原创 【note】简单的Qt + libvlc视频播放

刚开按这篇博客 https://blog.csdn.net/taoerit/article/details/76871116弄,编译通过了,然而调用vlc库的函数就报错,根本就不是他所说的那样,害惨人。。。VLC下载地址http://download.videolan.org/pub/videolan/vlc/http://download.videolan.org/pub/videolan/vlc/3.0.9.2/win32/VLC 库包含的内容:工程文件中添加库文件和头文件路径动态库和静

2020-09-30 20:18:02 893

原创 由一个链表引出的关于C语言指向空类型指针的问题

int main(void){ dlist_t *list = create_dlist(); //存放整数的链表 int arr[10]; for (int j = 0; j < 10; j++) { arr[j] = j; } d_elem_t node[10]; int i = 0; for (i = 0; i < 10; i++) { init_elem(&nod

2020-09-23 20:15:32 135

原创 数据结构回顾 —— 从双向链表中学设计

封装的好处1、隔离变化 : 将内部数据结构、内部使用函数以及全局变量等最容易变化部分封装起来,让变化的部分不影响系统其它部分。2、降低复杂度:接口最小化软件是软件设计的基本原则之一。封装内部实现细节,只暴露最小接口,让系统简单明了。—— 《系统程序员成长计划》链表数据结构链表的封装typedef struct double_link_list{ void *data; struct double_link_list *prev; struct double_link

2020-09-23 20:15:19 90

原创 设计模式 —— 观察者模式

以前看C语言的观察者模式看得一头雾水,如今学习这C++来写这观察者模式如顿悟,原来是这么回事,用C语言写的话自然也是可以了。接下来做一个有GUI的项目,观察者模式可以派上用场!!!what观察者是用于模式建立一种对象与对象之间依赖关系,一个对象发生改变时自动通知其他对象,其他对象做出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察者目标可以对应多个观察者观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源

2020-09-22 00:07:49 68

原创 QT学习笔记 — 移动无边框窗体

一般Qt窗体都是有边框的,通过按住上方的边框进行移动窗体位置。无边框的窗体没有边框无法移动,需要编程程序使其能移动,这就要用到那几个鼠标事件。程序class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget(); void closeWin();protected: void mousePressEvent(QMouseEvent *

2020-09-19 00:26:54 84

原创 关于嵌入式软件分层设计

从会写代码,到想要写好代码,这个过程是很难受的。由于做的嵌入式软件,主要是MCU方面,都是要跟硬件底层打交道的软件设计,接手的别人的软件给人影响最深刻的就是典型的面向过程式编程,高层模块大量依赖低层模块,特别是高层模块依赖底层硬件。缺点: 修改底层模块,将影响高层模块。在实际应用中,底层模块又是经常要被修改的。怎么解决?依赖反转,低层模块依赖高层。怎么实现依赖反转?面向对象编程中有一个很重要的概念 —— 面向抽象接口编程。在C++中使用虚函数实现多态、抽象接口,C语言没有虚函数,对于OOPC来说只能

2020-09-12 16:03:38 1941 2

原创 抽象接口 — OOPC

基于多态衍生出的两个概念:抽象接口,简称接口依赖反转抽象接口概念:只包含函数指针的类OOP中的一种概念,并不是C开发中头文件引出的API描述某一个功能或动作,不涉及任何底层实现细节函数指针表示抽象方法OOPC中多态实现的核心手段 函数指针抽象接口的好处:即使没有实现相应的类也可以基于抽象接口编写应用程序依赖注入概念:向某个对象提供它所需要的其他对象。示例:/* 定义抽象栈 */typedef struct _abstract_stack{ .

2020-09-12 16:02:52 99

原创 面向对象——OOPC

面向对象编程面向对象的三大特性封装所谓封装就是把一组关联的数据和函数圈起来,外部只能看见部分函数,数据则完全看不见将类型定义放到头文件,一定程序上破坏类的"封装性",换来的是内存的灵活分配这是OOPC一般的做法。出于封装的考虑,任何时候都不能直接访问对象中的数据——OOPC的必须严格的一条准则设计类时提供用户可能访问的数据的相应的访问接口使用别人的类时,除非特殊说明,都不能直接访问类中的数据#ifndef _STACK_H_#define _STACK_H_#define S

2020-09-12 16:01:52 194

原创 关于设计模式的学习

https://github.com/liu-jianhao/Cpp-Design-Patterns

2020-09-05 17:49:39 63

原创 设计模式学学习 — 策略模式

策略模式定义定义一系列算法,将每个算法封装起来,而且使它们可以互相替换。策略模式让算法独立于使用它的客户而独立变化详细理论参考:https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html简单案例实现假如现在你要去北京,有多种交通方式可以选择,汽车、飞机、高铁,当然牛逼的话也可以选择自行车或走路。这里不同的交通方式就是不同的策略//抽象的交通策略class AbstractTraf

2020-09-05 17:49:23 75

原创 设计模式学习 — 模板方法模式

模板方法模式定义定义一个操作中算法的框架,将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤从封装变化的角度去看,模板方法模式用于组件协作方面。简单案例在日常生活中,冲咖啡和冲茶叶的基本步骤是比较类似。冲咖啡大致步骤:1、煮水 2、冲泡咖啡 3、倒入杯中 4、加糖和牛奶冲茶大致步骤:1、煮水 2、冲泡茶叶 3、倒入杯中 4、加柠檬class DrinkMaker{protected: virtual void Boil

2020-09-05 16:07:25 53

原创 设计模式学习 — 适配器模式

适配器模式作用定义将一个类的接口转换成客户希望的另一种接口,使得原本由于接口不兼容不能一起工作的类一起工作适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。从封装变化角度对模式分类,适配器模式实现的是接口隔离适配器模式的优缺点适配器案例给手机充电要用配的电源适配器,对于220V直接给手机充电,那就要上天了,这里的给手机充电的电源适配就很类似适配器模式中的适配器;还有,比如在嵌入式开发中,一个单片机系统需要3.3v供电,现在只有5V的供电头,这时候就需要一个稳压电路/稳压模块来

2020-09-05 03:05:28 66

原创 设计模式学习 — 外观模式

外观模式定义Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用属于结构型设计模式菜鸟教程的介绍​简单的案例一在一个系统中,往往完成一个功能需要多个子系统一同执行才能完成,比如录制视频

2020-09-03 14:49:57 72

原创 设计模式学习 — 代理模式

代理模式定义为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端对象之间起到中介的作用。​ 代理类和被代理的类具有共同接口。代理模式的应用场景1、在不同机器上服务器上的应用​ A机器服务要和B服务器的通信,A服务器请求B服务器执行doXXX()方法,两个服务器都要进行开发,然而B服务器还没开发好,A机器服务已经做好,则A机器服务无法测试,此时A机器服务测试可以通过代理模式用代理类模拟一个真正B机器上的服务模块。

2020-09-03 11:29:20 48

Win32API函数参考手册.zip

很好的WindowsAPI函数参考手册参考手册,详细介绍了每一个win32 API的使用。要windwos编程?这本书你值得拥有

2019-06-27

Linux环境编程图文指南.rar

好书推荐,入门学习linux系统编程的好书,有书籍和书中例程代码

2019-06-12

STM32_BootLoader工程及APP工程.zip

STM32_BootLoader工程及APP工程,可以根据需要稍微修改即可使用。

2019-06-12

串口上位机波形.rar

好用的串口上位机波形,调试传感器数据利器。内有函数库,串口连接电脑,调用函数库函数发送电脑即可使用

2019-06-14

基于事件的单片机程序

简单易用,支持IAR、MDK 1、编写好事件函数 void event(void) { printf("500ms \r\n"); } 2、调用EVENT_EXPORT(event,ONCE_EVENT,event);注册事件 event 事件名字 ONCE_EVENT 事件类型 event 事件处理函数 3、main函数while循环中调用void event_handle_loop(void) 4、产生事件调用函数void post_event(event) event 事件名字

2020-03-01

空空如也

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

TA关注的人 TA的粉丝

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