自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 3.门锁_STM32_矩阵按键设备实现

需求来源:门锁肯定是要输入密码,这个门锁提供了两个输入密码的方式:一个是蓝牙输入,一个是按键输入。对于按键输入,采用矩阵按键来实现。矩阵按键是为了模拟触摸屏的按键输入,后续如果项目结束前还有时间就更新为触摸屏按键输入。由于矩阵按键就是GPIO的控制,所以不进行芯片和设备的分层编写,控制写在同一个文件中,最终向应用层提供一个接口。将按键的引脚与GPIO引脚以宏定义的方式进行声明,这方便后续改变矩阵按键的接线。//矩阵键盘接线。

2024-09-07 15:29:32 267

原创 1.C_数据结构_基本知识

数据即信息的载体,是能够输入到计算机中并且能够计算机识别、存储、处理的符号总称。这里的数据不一定是一个int型,也可能是一个语音、一个字符串或者其他的一些打包的内容。例如在数据库中有如下一条数据。对于整个一行的数据,我们称为这是一个数据元素。在代码中,数据元素以结构体形式存在。产品编号、名称、规格、出厂日期是字段。在代码中,这是结构体中的成员。

2024-09-07 11:40:16 111

原创 2.C_数据结构_线性表

线性表就是若干数据的一个线性序列。数学表达式:L:表名a0~an-1:数据元素n:表长,n>0是为非空表二元描述形式:D:数据元素D用 ai 表示,这个 i 范围是0~n-1R:关系用R表示,这个关系是,表示ai为ai+1的直接前驱,ai+1为ai的直接后继。:这符号称为有序对,xxx1是xxx2的直接前驱,xxx2是xxx1的直接后继。 xxx1和xxx2可以为一个或多个。

2024-09-07 11:35:14 725

原创 2.门锁_STM32_舵机设备实现

门锁的开启和关闭,就是电机来控制。这里不进行实际门锁机械结构的设计,选择用舵机或者电机转动一定的角度,就代表门锁开启。

2024-09-04 19:35:20 1322

原创 1.门锁_STM32_用户功能

一个用户具有用户名、密码、绑定的手机这三种属性,将其定义为一个结构体进行管理。定义如下char* name;//用户名//正确密码//绑定手机号}Usr,*pUsr;在这个结构体中,规定了密码为6位,绑定的电话号码为11位。这个用户定义的框架是链表形式,之后将以链表的增删改查为基础对其进行管理。

2024-09-02 15:59:53 463

原创 8.Linux_Makefile

(变量名)、${变量名}这两种方式的含义是一样的如果想输出$符号,应该输入$$变量赋值有4个符号:=、+=、?=、:=、1、" = ":是最基本的赋值方式,与在文中位置无关,系统自动推导将最终的赋值作为该变量的值。2、" += ":追加赋值,旧值保持不变,将新值黏贴到旧值后面3、"?= ":当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值4、" := ":是覆盖式赋值,假如某变量在前面已经定义赋值过,则将本次赋值作为最新的变量值格式:make <变量名>=<值>

2024-08-27 10:11:35 1061

原创 7.Linux_GCC与GDB

gcc可以不从-E开始执行,可以直接从汇编开始:gcc -c <.c文件> -o <.o文件>,之后再进行链接。分文件处理指令:gcc <多个.c文件> -o <可执行文件> -I <头文件路径>指令:gcc <.c文件> -o <可执行文件> -D <宏名>=<值>2、查看代码内容:list,简写l。指令:gcc - E <.c文件> -o <.i文件>指令:gcc -S <.i文件> -o <.s文件>指令:gcc -c <.s文件> -o <.o文件>指令:gcc <.o文件> -o <可执行文件>

2024-08-25 15:08:21 1016

原创 16.C基础_内存管理

内存分为代码区、全局区、栈区、堆区。代码区和全局区在代码编译完之后就已经确定,栈区和堆区是在程序运行时进行开辟和释放的。整体内存分区框图如下:对于一个进程,它一共有4G的空间,其中0~3G为上述的4个区(用户空间)、3G~4G为内核空间。2.1 代码区代码区存放的是函数体的二进制代码,由操作系统进行管理,具有共享、只读的特征。即:存放的是我们自己写的代码通过编译后生成的cpu执行的。2.2 全局区全局区又叫全局静态区,存放的是全局区的,这代表全局区的数据会一直占用空间,也代表变量随时可以访问。

2024-08-24 16:25:27 445

原创 15.C基础_共用体、枚举

枚举类型的定义与结构体一样。成员需要用" , "隔开enum 枚举名{枚举成员列表在定义时,新的枚举的成员名不能与其他枚举的成员名有重复。

2024-08-24 14:14:18 672

原创 14.C基础_结构体

定义结构体时,需要注意最后的。

2024-08-22 21:43:16 729

原创 6.Linux_服务器搭建

nfs(Network File System)即网络文件系统,其基于UDP/IP使用nfs能够在不同计算机之间通过网络进行文件共享,能使使用者访问网络上其它计算机中的文件就像在访问自己的计算机一样。网络文件系统:文件系统不像/home那样存在于本机,而是存在于网络中像自己的文件系统一样访问:访问文件的指令、方法完全一样提供透明文件访问以及文件传输;容易扩充新的资源或软件,不需要改变现有的工作环境;高性能,可灵活配置。

2024-08-22 11:42:49 858

原创 5.Linux_Shell编程

传参:bash (参数用空格隔开)第一个参数:$0,值为shell脚本名第n个参数:$n,$(n)。n为多位数时用()。如:$1,$(10)总参数个数:$#。$0不进行总参数个数的统计全部传入的参数值:$@(全部参数当作一个整体)或者$*(每个参数分开是一个值)上一条指令执行的结果:$?(常用作test指令返回值的判断,$?值:test真返回0)当前进程的id号:$$补充:$@与$*的区别验证。

2024-08-21 17:42:43 1461

原创 4.Linux_Shell命令

重定向就是改变默认的标准输入/输出目标,重新定向到新的目标。

2024-08-20 11:12:17 1119

原创 1.Linux_常识

二进制软件包(deb):直接拿来用的可执行文件源码包(deb-src):功能实现的源码,需要编译生成可执行文件后才能使用使用 " file + 文件名 " 查看文件类型:命名规则:软件包名称_软件版本-修订版本_体系架构.deb如:sogoupinyin_4.0.1.2800_x86_64.debsogoupinyin:软件包名称4.0.1.2800:软件版本x86_64:体系架构.deb:软件包后缀。

2024-08-17 22:08:17 2973 1

原创 13.C基础_预处理

宏定义的本质就是原样替换,写什么值就替换成什么。形式:#define 名字 值1.1 定义不同宏用 " #define " 声明,const 常量用 " const + 数据类型 " 声明宏最后没用分号,const 常量声明需要用分号表示语句结束宏不需要用等号赋值,cosnt 常量需要用等号赋值1.2 处理阶段不同宏定义在预处理阶段进行文本替换,const 常量在程序运行时使用。1.3 存储方式不同宏定义是直接替换,不会分配内存,存储于程序的代码段中。const 常量需要进行内存分配。

2024-08-13 17:59:42 805

原创 12.C基础_字符串相关函数

返回值:dest的首地址dest:拷贝到的目标地址src:需要拷贝的原数据。

2024-08-11 19:44:20 573

原创 10.C基础_函数

含义:指针函数就是返回指针的函数定义:* (形参)注意点:返回的指针,指向的位置不能为栈空间,即:不能指向函数退出后被释放的空间位置。

2024-08-11 18:28:57 177

原创 11.C基础_调试语句

assert可以通过传入的布尔值判断正误,但它只用于调试Debug中,而不用于真正的错误处理。因为assert会终止程序运行。assert是一个宏,后面跟一个布尔值,如果为假,assert会终止程序,并打印断言失败的消息。2、使用#define NDEBUG禁用断言。

2024-08-11 18:28:39 162

原创 7.C_Demo_格式化打印当前时间

time函数是标准 C 库中的一个函数,用来获取自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数,这个时间点也被称为 Unix 时间戳或 Epoch 时间。返回值:time_t 通常为long型,可用 sizeof 查看内存大小。返回值单位为s,错误时返回-1result:用于存储时间值,单位为s。存储的值与返回值是同一个值,可以写NULL。

2024-08-11 18:12:19 235

原创 6.C_Demo 数组练习:删除字符串的空格

删除字符串的空格,需要一个指针point来遍历字符串,一个指针LinkPoint来指向需要添加值的地方。当第一次找到空格时,将该位置point赋值给LinkPoint。然后每找到一次非空格的值就赋给LinkPoint位置,之后LinkPoint向后移动一位,指向下一次非空格值的赋值位置。现在有一个字符串,编写一个函数能够删除字符串中的空格字符。

2024-08-10 15:02:43 195

原创 9.C基础_指针与数组

数组指针就是" 数组的指针 ",它是一个指向数组首地址的指针变量。

2024-08-07 15:05:46 914

原创 8.C基础_指针基础

形式:* = ;

2024-08-06 11:36:08 1313

原创 7.C基础_数组

形式: [行个数][列个数],如:int a[3][4];行可以省略、列不可以省略元素的个数 = 行数*列数。

2024-08-04 17:09:21 1223

原创 5.C_Demo_排序

依次比较相邻的两个元素,如果顺序错误就交换。这种方法,显然需要很多轮才能完成,每一轮只能排序一个最大值或最小值(第一层for),将全部的数据排序完成,需要很多轮(第二层for)。对于第一层for,就是遍历数组,然后比较大小,进行交换。对于第二层for,就是考虑需要比较多少次。功能:使用冒泡排序法进行排序array:数组首地址size:数组大小mode:排序模式,' U '代表升序排序,' D '代表降序排序打印调试代码。

2024-08-03 16:41:36 514 2

原创 4.C_Demo_数组正逆序交换

功能:将数组元素位置翻转,例如a[]={1,2,3},最终a[]={3,2,1}array:数组首地址。

2024-08-03 15:02:33 217

原创 3.C_Demo_最大公约数、最小公倍数

假设两个数字a和b,求两个数字相除的余数c=a%b,如果余数为0,则b为最大公约数。如果b不为零,a=b,b=c,继续循环计算。两个数的最小公倍数数等于两个数的乘积除以两个数的最大公约数。即:x,y的最小公倍数 min(公倍数)=x*y÷max(公约数)参数a,b:传入的两个数值,两个数都不能为0。参数a,b:传入的两个数值,不能全为0。返回值:0代表错误,正常返回最大公约数。返回值:0代表错误,正常返回最小公倍数。功能:求a,b最大公约数。功能:求a,b最小公倍数。

2024-08-03 11:47:07 323

原创 2.C_Demo_实现多位数分离

数据存储:将3存入buf[0],将2存入buf[1],将1存入buf[2],' \0 '存buf[3],即:低位存低位。传入所需要分离的多位数,比如说123。返回值:返回动态开辟数组的指针。调试代码,用于打印字符串数据。

2024-08-03 11:08:23 214

原创 1.C_Demo_ ^ 实现两数原地交换

(原a^原b)^原b。=原a^(原b^原b)=(原a^原a)^原b。a =原a^原b。

2024-08-03 11:01:00 225

原创 6.C基础_输入输出函数

功能:输出一个字符返回值:参数c的ASCLL码值c:要输出的字符,可以为字符常量、字符变量或表达式。

2024-08-02 19:07:05 818

原创 3.Linux_vi编辑器

指令:vi 文件名若文件不存在,则新建一个文件;若文件存在,则打开这个文件。

2024-08-01 17:56:11 826

原创 5.C基础_运算符

相关名词对于" a=b+c "这个式子被称为表达式" = "和" + "被称为运算符参与运算的b、c被称为操作数" + "操作数的个数为2,所以" + "的运算符分类为双目运算符。

2024-07-31 10:28:53 1091

原创 3.C基础_数据类型

字符型实质是整型,对应的是ASCII码。

2024-07-29 18:50:23 1188

原创 4.C基础_变量

每一个变量都有一个对应的内存空间。当定义了一个int a = 0x58时,CPU为a分配了一个4字节的内存空间,并将0x58存入了该空间。其中:4字节是由类型决定的,因为int的空间大小为4字节。

2024-07-29 11:09:49 174

原创 2.C基础_数据的表示

数码就是表示数的符号,对于十进制就是0~9这10个数码,八进制就是0~7这8个数码。基就是数码的个数,对于十进制有0~9这10个数码,那么基就是10对于x进制的第n位,位权就是x^n。比如十进制的123,3为第0位,位权就是10^0数制就是计数方法,比如十进制、八进制。

2024-07-28 15:53:50 282

原创 2.Linux_基础

Linux的文件结构是一个倒的树状图,具体结构如下:bin:存放二进制文件boot:存放系统启动文件dev:存放设备文件etc:存放系统管理时要用到的各种配置文件和子目录lib:存放系统动态连接共享库home:存放普通用户的主目录root:存放超级用户的主目录。

2024-07-28 12:01:27 922

原创 1.C基础_计算机基础知识

输入设备:将其他信号转换为计算机能识别的电信号的设备,如传感器。输出设备:将电信号转换为其他信号,如显示器。存储器:存储器分为内存、外存、寄存器。CPU:CPU分为运算器和控制器。

2024-07-27 08:41:58 192

原创 15.FreeRTOS_资源管理

在FreeRTOS中,中断优先级为0~190的中断不调用syscall,191~255的中断调用syscall。屏蔽中断实际上是屏蔽的中断优先级191~255的全部中断。因为屏蔽中断函数不能够屏蔽优先级为0~190的中断,因此编写优先级为0~190的中断的中断处理函数时,不能够使用临界资源。本文描述的是FreeRTOS如何处理任务与任务之间争夺临界资源,以及任务与中断之间争夺临界资源的方法。

2024-07-18 11:15:08 328

原创 14.FreeRTOS_中断管理

注意:portYIELD_FROM_ISR是触发调度,而不是即刻产生调度。它实际是设置了一个优先级最低的中断,当现在运行的中断执行结束后,立刻去执行这个优先级最低的中断。在这个中断中才是实际的产生任务调度。本文主要描述如何在中断中使用队列、信号量等操作。根据传入的超时时间,

2024-07-18 10:23:28 177

原创 13.FreeRTOS_定时器

定时器就像一个闹钟,它有超时时间、函数、是否为周期性这三个部分。

2024-07-15 16:08:57 1044

原创 12.FreeRTOS任务通知

任务通知并不像队列、信号量、互斥量这些方法需要在使用之前先进行创建队列、创建信号量、创建互斥量。任务通知的相关存储空间,在创建任务时就已经分配。可以看到,对于任务通知的空间,只有一个通知值和一个通知状态,并没有任何像队列结构体那些定义了等待读入任务链表、等待写入任务链表。状态转变的过程如下(假设任务A向任务B发送任务通知):当任务B调用接收任务通知的函数时,通知状态被设置成 “ 任务在等待通知 ”。当任务A调用发送任务通知的函数时,任务B的通知值val被改变,通知状态被设置成 “ 任务接收到了通知 ”

2024-07-15 11:25:51 1008

3.门锁-STM32-矩阵按键设备实现

3.门锁-STM32-矩阵按键设备实现

2024-09-07

2.C-数据结构-线性表-线性表源码

2.C-数据结构-线性表-线性表源码

2024-09-07

2.C-数据结构-线性表-链表源码

2.C-数据结构-线性表-顺序表源码

2024-09-07

2.门锁-STM32-舵机设备实现

2.门锁-STM32-舵机设备实现

2024-09-04

1.门锁-STM32-用户功能

1.门锁-STM32-用户功能

2024-09-04

2.C-数据结构-线性表-顺序表源码

2.C-数据结构-线性表-顺序表源码

2024-08-30

分文件管理makefile文件

分文件管理makefile文件

2024-08-27

5.C基础-运算符-取余-实现多位数分离

5.C基础-运算符-取余-实现多位数分离

2024-07-30

空空如也

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

TA关注的人

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