自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式学习day18

管道:速度慢,容量有限,只能进行父子进程间的通信FIFO:任何进程间都可以通讯,但是速度慢消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。信号量:不能传递复杂消息,只能用来同步。共享内存:能够很容易控制容量,速度快,但是要保持同步,比如一个进程在写的时候,另一个进程要注意读的问题,相当于线程中的线程安全。

2024-05-13 10:50:53 191

原创 进程间通信(三)

信号量与已经介绍过的IPC结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

2024-05-12 15:33:51 293

原创 嵌入式学习day17

FIFO也称命名管道,它是一种文件类型。

2024-05-12 10:48:54 225

原创 进程间通信(二)

共享内存+Linux信号概述

2024-05-11 21:16:51 804

原创 进程间通信(一)

在之前我们也有涉及到进程间通信的知识点,比如fork或exec或父进程读取子进程的退出码等,但是这种通信方式很有限,今天来学习进程间通信的其他技术——IPC(InterProcess Communication)。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。

2024-05-11 16:10:59 719

原创 嵌入式学习day16

在需要关闭管道时只需将这两个文件描述符close关闭即可。管道通常指无名管道,是unix系统IPC最古老的形式。fd[0]负责读fd[1]负责写。

2024-05-11 10:32:34 273

原创 system函数和popen函数

command);如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。调用完可执行程序后,还会运行之后的代码。

2024-05-10 21:11:34 339

原创 exec族函数

在使用fork函数创建新的进程后,我们经常会在新进程中调用exec函数取执行另一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的id并没有改变。

2024-05-10 18:28:21 1343

原创 linux中进程相关概念(二)

我们创建子进程的目的,说白了就是让子进程为我们干活,干完活后会正常退出(exit),也有可能没干完异常退出(abort,或ctrl+c)。因此我们需要等待子进程退出,并收集退出状态。子进程退出状态不被收集会编程僵尸进程。在这段代码中,我们只是调用exit(0)退出进程,而没有收集退出状态,因此这个进程会变为僵尸进程,我们可以通过查看进程状态来观察:33父进程id为14191 状态为S+说明正在运行,而子进程id为14192,状态为Z+说明是僵尸进程。

2024-05-10 15:12:50 960 1

原创 嵌入式学习day15

设置一个临时变量来存储最小值的下标。将第一位与后面的数字进行比较,如果小于第一位就将下标改为小的数的下标,一轮循环结束后将第一位与最小值的交换。两层for循环,第一层来确定比较的轮数,第二层用来负责每一轮中比较相邻的元素。

2024-05-10 10:25:50 229

原创 linux中进程相关概念(一)

每个进程都有一个非负整数表示唯一的id,叫做pid,类似身份证pid=0;称为交换进程,作用是进程调度pid=1;称为init进程,作用是系统初始化由fork创建的新进程被称为子进程。fork函数被调用一次,但返回两次。两个返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程pid。将子进程id返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的pid。fork使子进程得到返回值0的理由是。

2024-05-09 22:49:30 1070

原创 标准C库对文件的操作

由于是标准C库,因此头文件只需包含#include 即可fopen的api有三个常用的是第一个:**FILE *fopen(const charmode);

2024-05-09 15:59:43 1020

原创 嵌入式学习day14

思路:双指针,让一个指针先向前走k步,之后两个指针同步向前走,直到第一个指针走到NULL为止,此时第二个指针指向的节点几位倒数第k个节点。

2024-05-09 10:54:03 189

原创 将ESP工作为AP路由模式并当成服务器

会卡在服务器连入即while(!需要我们找到wifi连入,并将网络调试助手连接后即可收到心跳包的数据,此时单片机的两盏灯点亮,我们可以通过open和close指令开关灯。说明此时已经与ESP连接成功,打开网络调试助手,选择TCP Client,输入本地主机地址,以及远程主机地址(端口默认为333)。就像上篇博文一样采用白盒测试的方法,先进行调试,调试一切顺利后,黑盒测试,连接到单片机。通过wifi找到安信可的wifi信号并连接。

2024-05-08 20:41:55 469

原创 嵌入式学习day13

由编译器自带分配释放,存在函数的参数值,局部变量等。:程序员自己申请,并指明大小(malloc函数):只要栈剩余空间>所申请空间,都会提供:操作系统有记录空间空闲内存的链表:收到申请→遍历链表→寻找→申请空间的堆节点:向低地址扩展的数据结果,连续内存区域,栈获得的空间较小。:向高地址扩展的不连续内存区域;链表遍历方向为低地址向高地址,堆获得空间灵活,空间也大。:系统自由分配,速度快:速度慢,容易产生内存碎片:主函数的下一条指令的地址、函数的各个参数,参数由右往左进栈、函数的局部变量(静态变量不入栈)。

2024-05-08 11:38:05 353

原创 蓝牙模块HC-08+WIFI模块ESP-01S

又叫蓝牙串口模块。串口透传技术:透传即透明传送,是指在数据的传输过程中,通过无线的方式使这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地道了最终接收者手里。12打开手机app即可每隔一秒接收到一个hello world同时可以通过手机发送open或close开/关灯.同时可以通过AT指令进行快乐的玩耍。

2024-05-07 21:25:31 1726

原创 嵌入式学习day12

①:改变作用域,改变(限制)其使用范围。只初始化一次,防止在其他文件单元中被引用。全局变量的作用域是整个源程序,在各个源文件中都是有效的,而加了静态后的全局变量的作用域仅限于一个源文件中。②:普通的局部变量是在函数或方法执行完毕后释放存储空间,而静态局部变量在程序开始执行时分配存储空间,直到程序结束才释放。这意味着即使函数或方法执行完毕,静态局部变量的值仍然会保留,并在下一次函数调用时保持其值。③:作用域不同,仅在本文件。

2024-05-07 11:34:55 285 1

原创 嵌入式学习day11

可以,在不同的C文件中各自用static声明的全局变量,变量名可能相同,但是各自C文件中的全局变量的作用域为该文件,所以互不干扰。

2024-05-06 22:25:37 263

原创 Linux中对文件的操作(二)

不要陷入思维定势!!write和read的第二个参数,不一定非得是一个字符数组,只要求是一个指针即可,指针的本质就是地址,因此传入一个地址也是可以的,就像上面的两块代码一样,传入&data1也是可以的!

2024-05-05 22:22:47 1157

原创 嵌入式学习day10

①用extern关键字方法②用引用头文件方式,前提是其中只能有一个C文件对此变量赋初值,此时连接不会出错。// file1.c// 全局变量定义// file1.h#ifndef FILE1_H // 包含守卫,防止头文件被重复包含// 声明全局变量// file2.c#include "file1.h" // 包含声明了全局变量的头文件// 引用全局变量// ...

2024-05-05 10:53:21 293

原创 Linux中对文件的操作(一)

pathname:指的是文件名flags:权限 只读打开O_RDONLY 只写打开O_WRONLY 可读可写打开O_RDWR 以上三个参数中应当只指定一个。若文件不存在则创建它,使用这个选项时,需要同时说明第三个参数mode,用其说明该文件的存取许可权限。如果同时指定了O_CREAT,而文件已经存在,则出错使fd=-1;运行结果:因为当前目录中已经存在file1这个文件了。如果此时不存在,则运行这段代码不会报错,因此运行结果不会有任何反应。每次写都加到文件的尾端。

2024-05-04 15:58:46 1029

原创 嵌入式学习day09

①,函数递归调用时,系统要在栈中不断保存函数调用时的线程和产生的变量,递归调用太深,会造成栈溢出,这时递归无法返还。②。由于C语言中没有垃圾资源自动回收机制,因此需要程序员主动释放已经不再使用的动态地址空间。③,C语言中没有提供数组下标越界检查,如果在程序中出现数组下标访问超出数组范围,运行过程中可能会存在内存访问错误。④,指针保存了一个非法地址,通过这样的指针访问所指向的地址时会产生内存访问错误。

2024-05-04 11:14:02 222

原创 su03t语音模块烧录识别不出问题解决方法

su03t语音sdk烧录无法识别问题

2024-05-02 19:10:09 2163 2

原创 嵌入式学习day08

①前者从编译器自带的库函数中寻找文件,从标准库路径开始搜索文件。②后者是从自定义的文件中寻找文件,寻找不到再到库函数中寻找文件。

2024-05-02 10:47:27 423 2

原创 PC通过串口发送指令控制LED+串口中断

首先要打开SCON中的串行接收控制位REN。当REN=1时为允许接收状态,可以接收信息。因此令SCON = 0x50;

2024-05-01 20:03:03 962

原创 嵌入式学习day07

①引用必须初始化,指针不必初始化②引用初始化后不能改变,但是指针可以改变所指的对象③不存在空值的引用,但是存在空值的指针。

2024-05-01 13:16:26 365

原创 串口相关知识点

RXD:数据输入引脚,数据接受,STC89系列对应P3.0口TXD:数据发送引脚,数据发送,STC89系列对应P3.1口两块芯片的RX TX要交叉接线。

2024-04-30 21:21:33 1003 1

原创 嵌入式学习day06

面试题+算法

2024-04-30 10:37:29 430 1

原创 感应开关盖垃圾桶项目(三)

PWM可以对一系列脉冲的宽度进行调制,等效出所需要的波形占空比为一个周期内,高电平占据时长的百分比。上图中一个周期为4ms,而高电平占据1ms因此占空比为25%

2024-04-29 15:53:44 1242

原创 嵌入式学习day05

结构体位域是一种数据类型,它允许在一个字节中存储多个不同长度的字段。给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。①并不需要完整的字节,节省存储空间,处理简单。

2024-04-29 10:41:01 422

原创 感应开关盖垃圾桶项目(二)

观察中断结构图可以发现只有当EA闭合的时候,才会接受中断信号,之后可以按照我们的需求对其他的中断允许控制寄存器进行赋值。之前我们采用软件的方法实现,对爆表的次数进行统计,以达到我们的延时要求。我们也可以采取中断的方法,让硬件直接实现中断。如果像之前将两个代码都写在while1中会互相干扰,现在就实现了两盏灯的同时亮灭操作。此时不需要再判定是否爆表,也不需要将TF0即爆表标志位软件清0硬件会自动清零。1.ET0中断允许要置一 ET0=1。2.EA总中断要置一 EA=1。

2024-04-28 22:42:25 409

原创 嵌入式学习day04

注意在编译时可以使用gcc来将两个文件链接编译,以实现我们需要的效果。另外若使用C++调用C语言代码时,需要在C++文件的头文件中extern “C”。

2024-04-28 11:09:32 234

原创 感应开关盖垃圾桶项目(一)

定时器的原理和入门

2024-04-27 15:07:38 1008

原创 C51电动车报警器项目开发(二)

在检测到是警报模式下,如果不加延迟4s会导致报警并不是特别丝滑,但是加上了延迟4s后又会导致在蜂鸣器报警的4s中如果按下B按键,会没有反应,原因是代码还处于循环之中,不会对新的电平进行响应,如果需要优化该块代码,则需要借助后续的中断知识进行解决。大概原理就是不断的检测哪个按键被按下,我们定义A按键为警报模式,此时如果有震动发生,就会触发蜂鸣器报警。对于软件开发来说,不需要了解太多的硬件知识,因此对于433M模块我们只需要了解按下遥控后芯片输出的高低电平,根据高低电平写代码控制其他硬件。

2024-04-27 12:44:11 262

原创 嵌入式学习day03

const用于定义常量。可与指针进行搭配使用,用于定于指针本身或指针指向的内容是常量。通常来说,变量的值会被缓存在寄存器中以提高访问速度,但对于使用volatile来修饰的变量来说,会直接读取内存中的值,而不是读取缓存中的旧值,这样做可以使得程序能够获取到变量的最新值。通常来说编译器会进行各种优化以提高代码的执行效率,但有时这些优化会忽略变量的实际变化。使用volatile修饰可以确保每次对于变量的访问都是基于实际的内存读取和写入操作。在多线程或并发编程环境中,多个线程可能同时访问和修改同一个变量的值。

2024-04-27 10:16:31 183

原创 C51电动车报警器项目开发(一)

也可以按照自己的想法,增加延迟增强可视化效果。

2024-04-26 21:05:31 236 1

原创 C51学习

当SW1被按下时,KEY1接通GND表现为低电平,值为0当SW1未被按下时,KEY1接5V表现为高电平,值为1查询电路图发现KEY1接在P2.1口通过上述代码实现,按下SW1两盏灯亮松开后两盏灯灭的效果。

2024-04-26 16:37:22 190 1

原创 嵌入式学习day02

1. 如何避免头文件被重复包含?利用条件编译来避免头文件被重复包含。条件编译由#ifndef #define #endif组成,例如:2. static关键字的作用?①定义全局静态变量:在全局变量前加上static,这个全局变量就变成了全局静态变量。这样的变量只能在定义它的源文件中可见,不能在其他源文件中通过extern关键字访问。此外,如果没有显式地初始化,其默认值为0②定义局部静态变量:保持变量持久,存储在静态存储区,会一直存在于程序执行期间,普通局部变量会在函数返回时消失。③定义静态函数:s

2024-04-26 10:10:06 274 1

原创 嵌入式学习day01

会首先编译#字开头的指令,比如拷贝#include包含的头文件代码,#define宏定义的替换,以及条件编译。完成预编译后,会进入编译阶段,将源代码转换为汇编语言,编译器会进行词法和语法分析,如果语法正确会生成汇编代码。①:程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项,将所有包含文件预编译为一个“预编译头”。②③:在数据库操作中,预编译的SQL语句可以有效防止SQL注入攻击。

2024-04-25 20:25:20 517 2

原创 编译时碰到的关于链接库的问题

此时出现了新的报错,提示没有定义接口,应该是无法识别curl库,需要-L定位curl库的位置。在编译时遇到了这个问题,无法识别头文件,因此需要-I 来连接头文件所在位置。因此正确编译方法应该是。

2024-03-04 22:14:33 451

空空如也

空空如也

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

TA关注的人

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