- 博客(31)
- 收藏
- 关注
原创 C++ 超详细知识点梳理+思维导图
本文为博主复习完C++基础知识后总结的知识点,重要知识点都有简单demo示例。欢迎,思维导图层级太多,页面上放不下,若有需要直接哦。
2023-03-30 23:14:44
4644
3
原创 C语言二级指针
这种二级指针的使用在链表中通常要用到,我们需要修改下一个节点中的内容,而传入的是当前节点的指针。本示例中使用二级指针修改一个子类结构体中基类的内容。
2023-03-25 12:37:41
199
原创 C语言中不透明指针和对象
在C语言中,如果我们想实现类似于面向对象的方法,把接口API暴露给使用者,而内部数据隐藏起来私有。该怎么办呐?本文介绍一种实用的设计模式,使用不透明指针(句柄)实现类似于面向对象的操作。
2022-11-26 23:44:59
979
原创 VScode环境下使用CMake构建工程
本文主要介绍vscode环境下使用CMake构建工程的详细用法,包含多文件工程的构建,静态链接库/动态链接库文件的生成,外部库文件的使用。
2022-11-20 20:32:27
5454
1
原创 QEP_FSM有限状态机框架
文介绍一种新的有限状态机的实现方法QEP, 是一种基于事件的状态处理方式,本文介绍该状态机框架的C语言实现方式。QEP是QP框架的一个组件,这里简单介绍一下QP框架。QP(Quantum Platform, 量子平台,简称QP,)是一个用于实时嵌入式系统的软件框架,QP是轻量级的、开源的、基于层次式状态机的、事件驱动的平台。
2022-10-23 23:16:50
2625
1
原创 一个好用的软件定时器模块MultiTimer
在嵌入式软件中,常常采用顺序式的编程结构。有一些需要定时执行的逻辑在主程序中不断的进行轮询时间,时间到了执行程序。这样程序中会存在大量的时间变量不方便统一处理,以一种比较分散的方式进行计时以及时间清零的操作。本文介绍一个好用的定时器模块,将计时服务进行统一管理,通过回调函数的方式执行定时的相关逻辑。原作者0x1abin,源代码https://github.com/0x1abin/MultiTimer致敬原作者!本文在arduino UNO开发板上试用了定时模块代码,进行了略微的修改,模块代码包含
2022-05-04 18:21:15
1240
原创 一个好用的按键驱动模块
MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。
2022-04-27 21:57:41
871
原创 通过脚本运行Simulink模型
通过脚本运行Simulink模型在MATLAB中,通过脚本启动simulink模型。将测试用例写入excel表格中,通过脚本读取测试用例的输入与期望输出,自动运行simulink模型,将模型输出结果与期望结果进行比较,输出测试结果,将测试结果写入excel,从而实现模型的功能测试。测试模型如下:测试用例如下:对模型进行一些设置,将模型输入与workspace中的数据关联起来:编写脚本如下:clcclear% model setting[num, txt] = xlsread('tes
2022-03-23 22:49:53
7298
原创 Simulink信号关联和数据对象的保存
在工作空间中定义了模型中需要使用的一些数据对象,如何保存呢。在matlab中通常直接保存数据需要保存为mat文件,不方便直接的阅读和修改。可以在数据字典中定义这些数据变量,保存数据字典,通过模型与数据字典关联起来,下次打开模型时会自动关联数据。如果不想在数据字典中定义数据对象,在workspace中定义了数据,如何保存呢。使用Simulink.saveVars将工作空间中所有数据对象保存为.m文件,运行.m文件即可载入数据到工作空间。同时,保存为m文件方便对于数据对象的阅读和修改。.
2022-03-20 10:48:13
3049
原创 Simulink代码生成——多速率任务调度
Simulink代码生成——多速率任务调度单任务统一采样时间生成代码通过如下简单模型测试,设定离散步长0.01,模型中有三个out输出信号,设置采样全部为-1(继承),那么模型中所有的采样速率均为0.01。为了方便代码阅读,对模型进行了一些简单的设置,定义了输入BUS,AliasType。直接生成代码如下:#include "Demo1.h"INPUT stInput; ExtY_Demo1_T Demo1_Y;RT_MODEL_Demo1_T
2022-03-19 23:22:30
3509
1
原创 C语言——链表的使用
C语言——链表的使用链表是一些包含数据的独立数据结构(通常称为节点)的集合。链表中的每个节点通过链或指针连接在一起。程序通过指针访问链表中的节点。通常节点是动态分配的。创建链表对于一个处理链表的程序而言,各节点在物理上是否相邻并没有什么区别,因为程序始终用链从一个节点移动到另一个节点。#include <stdio.h>#include <stdlib.h> #include <string.h> #define TSIZE 45 struct f
2021-10-27 23:42:44
1235
原创 C语言结构和联合——联合
C语言结构和联合——联合聚合数据类型能够同时存储超过一个的单独数据。c提供了两种类型的聚合数据类型,数组和结构。数组是相同类型的元素的集合,通过下标引用或者指针间接访问。结构是不同类型的成员的集合,由于结构的成员长度可能不同,通过成员名来访问。联合的声明和结构类似,但它的行为方式却和结构不同。联合的所有成员引用的是内存中相同位置。为什么会有类似这样的数据形式呢,以BASIC解释器为例,通过结构体存储变量的值: struct VARIABLE { enum { INT, FLOAT,
2021-10-17 17:01:06
379
原创 C语言结构和联合——结构的自引用
C语言结构和联合——结构的自引用在一个结构体内部包含一个类型为该结构本身的成员是否合法呢? struct SELF_REF1 { int a; struct SELF_REF1 b; int c; };这种类型的自引用是非法的,因为成员b是一个完整的结构。正确的方法: struct SELF_REF2 { int a; struct SELF_REF2* b; int c; };结构体中创建一个指向该结构本身的指针,事实上,这个指针指向的是同一类型下的不同结构。
2021-10-17 16:11:42
320
原创 Simulink生成代码——子系统生成函数
Simulink生成代码——子系统生成函数在simulink中生成代码时,实现子系统生成单独的函数。以下图中的模型为例:创建子系统:创建子系统时,设置为原子子系统,否则只是将系统进行简单的组合(group),在创建原子子系统之后,对代码生成项进行设置:设置为可重用函数,对函数进行命名。设置为不可重用函数的时候,可设置函数参数为void。生成代码如下:/* Output and update for atomic system: '<Root>/Subsystem' */30
2021-10-11 23:30:04
2596
原创 C语言面向对象编程
C语言面向对象编程面向对象的编程支持封装、继承和多态三种特性,通过这三种特性,来理解什么是面向对象。封装:通过采用封装特性,把一组相关联的函数和数据圈起来,使圈外面的代码只能看见部分函数,数据则完全不可见。在.h文件中定义数据结构以及函数,在程序文件中实现。本例中数据结构在.h文件中定义。typedef struct{ double x; double y;}ST_POINT_T;extern ST_POINT_T* creatPoint(double x, double y);ext
2021-10-10 20:01:44
215
原创 嵌入式C语言_环形存储(Ring/Circular Buffer)
嵌入式C语言_环形存储(Ring /Circular Buffer)基本原理在嵌入式开发的串口收发数据处理时,常常使用环形存储结构,将中断接收数据进行缓存,以防止在数据处理过程中可能产生的数据覆盖,造成数据丢失。环形存储是我们定义的一段首位相连的数据存储方式,通过头和尾索引数据,进行数据的写入和读取。因而,环形存储结构的关键要素包含:数据存储buffer,buffer的大小,头和尾。如下图所示,定义一个buffer,大小为12,初始化状态,头和尾的索引都在0号存储单元,当写入数据时,头指针进行偏移,读
2021-09-06 23:17:46
3300
1
原创 C语言_有限状态机(FSM)
C语言_有限状态机(FSM)基本介绍许多小型或复杂的应用程序都使用有限状态机 (FSM),C 语言中的有限状态机是嵌入式系统的流行设计模式之一,有限状态机使开发变得容易和顺利。有很多设备使用事件基态,如咖啡机、自动售货机、POS 设备、门锁系统等。一些 POS 设备使用事件表,在事件表中使用事件处理程序注册事件,通过相关条件触发事件的执行。本文中,使用C语言创建一个简易的ATM状态机。 ATM 机的状态可以通过即将发生的事件进行更改。ATM状态机包含以下几个状态:Idle StateCard
2021-09-04 22:28:00
7884
4
原创 sizeof的使用(指针和数组地址的区别)
sizeof并不是函数,是C语言中的关键字,使用sizeof可以得到变量的类型所占的空间大小。1、对数组使用sizeof int a[5] = { 1,2,3,4,5 }; printf("sizeof a = %d\n", sizeof(a)); sizeof a = 20sizeof数组名,返回数组所占大小。 printf("sizeof a[0] = %d\n", sizeof(a[0]));sizeof数组元素,返回数组元素所占大小,sizeof(a[0]) = 4。 prin
2021-08-31 23:36:23
1965
原创 PID调节的C语言及MATLAB实现方法
在模拟控制系统中,控制器最常用的控制规律就是PID控制,控制系统的原理框图如图所示:在实现PID控制的过程中,关键的部分除了PID三个参数之外,就是system和系统反馈了,需要能够拿到系统当前的输出,才能够形成一个闭环的反馈控制系统,而system就是系统本身的特性,表征系统自身的输入与输出之间的关系,从而能够将PID控制器的输出叠加到系统输出上。将连续系统进行离散化处理,就能得到PID在离散系统中的表达。C语言中构建PID控制器如下:typedef struct { /* Cont.
2021-08-29 15:56:20
2281
原创 memset和memcpy函数原型及使用
在日常的工作中,通常需要使用到memset和memcpy进行内存的拷贝或者初始化。函数的原型如下:void * memcpy(void *dest, const void *src, size_t len);void * memset(void * buffer, int c, size_t num);这样,任何类型的指针都可以传入 memcpy 和 memset 中,这也真实地体现了内存操作函数的意义, 因为它操作的对象仅仅是一片内存, 而不论这片内存是什么类型。这样来看,只要在使用的过程中,目标
2021-08-28 12:47:34
2492
原创 C代码单元测试(三)_Google cmockery阅读
执行测试程序_Test ExecutionCmockery 单元测试程序使用void function(void **state)函数,使用unit_test*()宏定义函数初始化带有测试用例的函数指针的表#define unit_test(f) { #f, f, UNIT_TEST_FUNCTION_TYPE_TEST }然后将表传给runtest执行#include <stdarg.h>#include <stddef.h>#include <set
2021-08-21 22:52:20
297
原创 C代码单元测试(二)
本文介绍google的C代码单元测试框架Cmockery ,根据官方介绍,Cmockery是一个用于简化C应用程序单元测试代码的轻量级库。A lightweight library to simplify and generalize the process of writing unit tests for C applications.源码连接Cmockery 测试与 Cmockery 库、标准 C 库和被测试的模块链接,被编译成独立的可执行文件。尽管代码的实际目标运行环境与测试环境有所差别
2021-08-15 23:47:35
572
原创 嵌入式C代码日志框架
在C代码的日常调试或者测试过程中,常常需要通过打印来输出代码运行过程中的一些状态,以便了解程序运行过程中到底进行了什么样的动作,因而在整个项目中将会存在大量日志输出的操作,而正式工程的输出并不需要这些。在发布正式程序时需要屏蔽这些操作,而在调试时又需要打开这些代码。通过宏定义能够快速注释和取消注释,但是会存在大量的判断语句。本文将通过可变参函数的方式实现这种日志管理,以printf打印输出为例:#include <stdio.h>#include <stdarg.h>#
2021-08-15 18:40:40
677
原创 C代码单元测试(一)
代码的单元测试是一个运行被测代码并且将实际输出与期望输出进行比较的过程,本文使用一个简单的例子记录代码测试的基本想法。typedef struct{ int output; int a; int b; int(*unit_test)();}ST_UNITTEST_T;创建一个单元测试,包含两个输入一个输出以及一个指向被测函数的函数指针// add a testST_UNITTEST_T *addTestFun(int(*TestFun)(int, int), int a, in
2021-08-15 14:42:38
1495
1
原创 C语言函数指针——回调函数的使用
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。#include <stdio.h>typedef struct{ int status; void (*fun1)();}ST_TEST_T;ST_TEST_T st_test;void add_callb
2021-08-11 17:24:06
303
原创 PUMA560_臂形机器人动力学与控制_torque feedforward control
本文讨论串联机械臂的动力学与控制问题,在加入力矩的情况下控制机器人以期望的位姿运动。考虑驱动串联机械臂的单个电机,其受力情况可以用一组矩阵形式的耦合微分方程表示。其中,q,qd,qdd 分别为广义的关节位置、速度和加速度的向量,H是关节空间惯性矩阵,C是科氏力和向心力耦合矩阵,G是重力负荷,F为摩擦力,Q是广义坐标,最后一项是施加在末端执行器上的力旋量所产生的关节力。在给定关节角度、关节速度和...
2019-12-19 20:42:33
6621
1
原创 三自由度机械臂运动学及动力学分析——MATLAB TOOLBOX
引言臂形机器人或机械臂是一种我们常见和熟知的机器人类型,机械臂与移动机器人不同,不能再环境中任意移动,有一个固定的基座,因此工作空间有限。非移动的机器人大大简化了诸如感知力和安全性的问题。机械手的工作对象是空间中的物体,需要机械手手爪按照要求的轨迹和位姿去接近目标物。工业机械臂一般为六自由度,前三个自由度构成的连杆称“主连杆”系统,又称“手臂”,其尺寸较大,用来实现手臂末端的空间位置;后三个...
2019-09-12 21:23:51
50119
22
原创 RRT路径规划算法
RRT路径规划算法地图RRT算法原理路径平滑处理总结RRT(Rapidly-Exploring Random Tree)算法是一种基于采样的路径规划算法,常用于移动机器人路径规划,适合解决高维空间和复杂约束下的路径规划问题。基本思想是以产生随机点的方式通过一个步长向目标点搜索前进,有效躲避障碍物,避免路径陷入局部极小值,收敛速度快。本文通过matlab实现RRT算法,解决二维平面的路径规划问题。...
2019-08-29 21:43:42
20219
8
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人