自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux应用编程---15.并发服务器模型

​ 并发服务器模型,之前编写的基于TCP/UDP的服务器模型只支持一个客户端访问。但实际应用过程中可能同一时刻有很多的客户端进行访问。比如12360的网站、购物网站等等。对于这种需求,提出了并发服务器的模型。​ 这里提出常见的两种并发服务器模型,多进程式与多线程式。前者是提前创建一定数量的进程,等待客户端与之连接,优点是与客户端的响应快速,缺点是事先不知道有多少客户端,进程创建过多造成资源浪费,进程过少,导致客户端无法正常访问。后者在有客户端连接请求后,才创建线程,在线程中处理客户端相关程序。

2023-01-10 17:50:58 340 3

原创 Linux应用编程---14.UDP服务器、客户端编程

​ UDP是无连接、尽最大努力交付、面向报文的通讯协议。UDP编程时,相对TCP简单,少了几个步骤。UDP编程使用socket 数据报,在建立socket时需要将流socket—SOCK_STREAM改为数据报socket—SOCK_DGRAM。

2023-01-10 17:48:50 750

原创 Linux应用编程---13.网络编程

​ 网络编程要熟悉一些计算机网络有关的名词,可以先做了解,后续实际开发在深入研究,自上而下学习。与本次Linux应用编程有关的就是TCP与UDP协议。简明概念如下图1所示。​ 前面学习的进程间通讯的方法有:管道、共享内存、消息队列。进程间同步的方法有:信号量、互斥锁。socket也是一种进程间进行数据交互的方法,用于网络连接的不同主机上的应用层程序进行数据交互。

2023-01-10 17:45:06 1753 2

原创 Linux应用编程---12.信号

​ 信号用于内核层与应用层、应用层与应用层之间传递控制指令。Linux下有64种信号类型。使用signal()函数可以改写信号的作用,但有的信号不支持。kill()函数可以向一个进程发送某个信号。

2023-01-10 17:35:52 301

原创 Linux应用编程---11.互斥锁

​ 互斥锁是一种机制,用来保证共享资源在某一时刻只能被一个线程访问或修改,保证数据的一致性。互斥锁有两种状态,上锁和解锁。pthread_mutex_init()函数用来初始化互斥锁。​ 线程互斥锁有关的操作有初始化、上锁、尝试上锁、解锁、销毁互斥锁。使用相关函数时需要包含头文件pthread.h。参数mutex是一个指针,指向互斥锁的地址;参数mutexattr可以写入NULL,代表使用默认属性。

2023-01-10 17:32:41 387

原创 Linux应用编程---10.信号量

​ 信号量用于任务间的同步,它本质是是一个整数被内核管理。具有亲缘关系的进程之间可以使用匿名信号量进行任务同步,非亲缘关系的进程之间使用有名信号量进行同步。

2023-01-10 17:22:46 1002

原创 Linux应用编程---9.消息队列

​ 消息队列可以用于亲缘关系间的进程通讯,也可以用于具有非亲缘关系间的进程之间通讯。通讯过程分为大致4步骤:1 创建消息队列结构体,使用msgget()创建消息队列;2 使用msgsnd()发送填充过数据的消息队列结构体;3 使用msgrcv()函数接收;4 如果不在使用,则使用msgctl()函数删除创建的消息队列。

2023-01-08 17:08:22 953

原创 Linux应用编程---8.共享内存

​ 共享内存是进程之间通讯的方式之一,建立共享内存大概分为几步:(1)使用shmget()创建共享内存段;(2)使用shmat()将共享内存段与当前进程绑定;(3)使用shmdt()函数将共享内存与进程断开连接;(4)如需彻底销毁共享内存段,调用shmctl(),传入IPC_RMID。

2023-01-08 17:01:32 1536 2

原创 Linux应用编程---7.有名管道

​ 有名管道用于非亲缘关系的进程之间通讯,通过创建一种特殊的先入先出文件。用到的库函数是mkfifo(),函数原型为:int mkfifo(const char * pathname, mode_t mode);pathname是有名管道的文件路径名,mode是该有名管道的权限。返回值0:成功;-1:失败。

2023-01-08 16:58:05 1419

原创 Linux应用编程---6.无名管道

​ 管道用于进程之间通讯,管道又分为有名管道和无名管道。管道是单向的,创建管道用函数pipe(),需要传入一个数组int fd[2],有2个元素,元素类型是整形。其中,fd[0]是管道读取端, fd[1]是管道写入端。它两叫做文件通配符,可以使用函数close()与write()进行操作。

2023-01-08 16:55:21 639

原创 Linux应用编程---5.多线程的创建以及线程间数据共享

​ 本次了解了多线程的创建方式,本质还是通过多次调用线程创建函数实现的。线程之间资源贡献,所以对于一个全局变量在多线程之间是可见的,通过这个特点,多线程也更好实现线程之间的通讯。

2023-01-08 16:51:59 858

原创 Linux应用编程---4.pthread_create函数

​ 线程创建函数:pthread_create,以及它的入参的含义。线程是从属于进程的,进程结束线程也随之结束。阻塞式等待线程结束可以调用pthread_join()函数。运行结果​ 我们定义了int型变量count,然后在pthread_create(&thread, NULL, thread_function, &count);中将其地址传入,在线程函数内,这个值被取出,并参与了循环终止条件的判断。根据结果来看,运行是正确的。​ 线程创建函数:pthread_create,以及它的入参的含义。

2023-01-08 16:46:33 2850

原创 Linux应用编程---3.wait()函数

​ wait()函数用来等待进程结束,或者说是进程状态改变,属于阻塞式等待。如果等待到子进程终止,返回该进程的id,如果函数调用失败,则返回-1。linux终端下可以向main函数传参,也就是声明main函数时,入口写为这样:int main(int * argc, char *argv[])。其中,argc代表入参的个数,argv代表入参。

2023-01-08 16:42:22 1433

原创 Linux应用编程---2.fork()函数

​ fork()函数用来创建子进程,函数具体功能与使用方法一起看编程手册。Linux终端命令下输入:man fork,敲击回车键即可打开fork函数详情页。首先看SYNOPSIS:​ 我们可以知道调用fork函数所需的头文件,以及fork函数的函数原型。pid_t fork(void).这个函数不需要传参,返回值是一个pid_t类型的。​ 其次看具体描述:​ 大意试讲,fork()函数通过拷贝调用进程创建了一个新的进程。这个新的进程被称作子进程,这个调用进程被称作父进程。子进程和父进程运行在独立的

2023-01-08 16:37:47 681

原创 Linux应用编程---1.线程与进程

​ Linux应用编程中线程与进程是两个非常重要的概念,本次我们先熟悉了如何查看进程id号以及父进程id号两个函数。

2023-01-08 16:31:58 414

原创 Linux应用编程---0.写在开头与致谢

​ 学习嵌入式Linux应用编程,具有的基础是熟练掌握C语言编程,熟悉Ubuntu系统下的简单操作命令以及gcc编译、vim编辑器的使用。学习重点在于认识linux应用编程、体会在linux系统下的应用编程。​ 学习过程是基于该教程的授课体系,听完老师的视频讲解后,独立进行API函数查阅、编程、debug…

2023-01-08 16:27:15 198

原创 数据结构---5.队列的应用

数据结构—5.队列的应用一、双端队列什么是双端队列呢?首先,它还是一个循环队列(环形队列),但是它的特点就是队列头head也可以入队列,队列尾tail也可以出队列。所以它就有了新的应用,我们先画图研究下上述情况下它的区别在哪儿?第一种情况下:head - 1,但是如图所示,下标为0的存储空间的上一个是SIZE,而不是0 - 1 = -1,如何表示呢?head =(head - 1 + SIZE)% SIZE;然后,将要存储的元素入队列。第二种情况下:先执行出队列,然后更新head =(h

2021-11-27 21:36:14 1170

原创 数据结构---4.队列的应用

数据结构—4.队列的应用一、应用1解码,对于一串数字,将第一个数字删除,第二个数字排至这串数字的末尾,将第三个数字删除,将第四个数字排至末尾,循环下去直到这串数字都删除了。删除的数字就是真正的密码。举个例子:2. 代码实现/* * @name 队列的应用 * @Date 2021年11月23日 * @Author 机器人工程师sgk*/#include <stdio.h>#include <string.h>#define SIZE 512char

2021-11-27 21:35:19 914

原创 数据结构---3.队列

数据结构—3.队列一、队列的理解队列的特点:生活中都有过排队取快递的经历,当我们去排队的时候,往往我们是最后一个,但我们的后面一定会有人来,成为最后一个。前面排队的也肯定是比我先离开的,最前面的离开后,他后面的又变成了队列的头,业务都是最前面的人先办理的。抽象出来的话,队列一定是有一个头和尾的,而且一开始头和尾是同一个,其次就是先进入队列的人先出去,这里与栈不同。图示函数实现1、入队列:队列的尾自增,依次往后。2、出队列:队列的头自增,依次往后。3、判断队列是否为空:头 == 尾

2021-11-22 19:20:20 513

原创 数据结构---2.栈的应用

数据结构—2.栈的应用一、应用举例1继续上一次的内容。上一次举的例子是,用栈来实现逆波兰表示法,但是,当时我们是自己将中缀表示法(通常用的数学表示法)转换为了后缀表示法,这次,我们尝试用栈的知识,写程序实现将一个___中缀表示法的表达式转换为后缀表示法___。首先,我们是如何将一个中缀表达式转换为后缀表达式的呢?如上次的例子:(1 + 2)* (3 - 4),首先:从左往右看,遇到第一个左括号,忽略。遇到数字1,直接打印输出,遇到运算符+,入栈保存,遇到数字2,也直接打印输出。遇到右括号),将

2021-11-21 17:42:00 939

原创 # 数据结构---1.栈的实现

数据结构—1.栈的实现注:虽然学完了一遍栈的应用,但我还是不能给出关于栈的定义。我能理解它作为一种记录数据或者删除数据的一种操作。但是,栈解决了什么问题,有什么注意事项,还有什么高阶操作,我暂时也不会,只等后期的不断应用与思考在做总结。一、栈的理解栈是一种对数据进行存取或删除的操作,所以它的基本操作有3个:入栈或者压栈(push)、出栈(pop)、判断栈是否为空。栈由于特殊的结构,类似于手枪子弹夹。入栈操作即:将子弹一颗颗压入弹夹。此时有个特点,最先压入的(第一颗子弹)是最后出来的。出栈操作即:将

2021-11-21 01:18:29 249 3

原创 基于Stm32CubeMX下Mpu6050模拟IIC的Dmp的移植

基于Stm32CubeMX下Mpu6050模拟IIC的Dmp的移植一、问题背景以前熟悉的是在标准库下移植Mpu6050的DMP,获取航向角等等。现在要HAL库下移植MPU6050的DMP库。先分析一下,如果要移植Mpu6050的DMP,从底层到应用层大概分为这几个步骤:1. 底层IIC驱动编写。2. Mpu6050初始化及配置函数层。 3. 硬件驱动程序通过I2C与传感器通信。4. Dmp应用层。首先要熟悉在标准库下的移植,那么下面的问题只是一些避免入坑的注意事项。二、面临的问题及解决方法HA

2021-09-23 01:34:08 1218 1

原创 c++Study_3 cin的学习

一、cin的使用示例#include <iostream>int main(void){ using namespace std; int carrots; cout << "How many carrots do you have?" << endl; cin >> carrots;// 输入流cin 中读取carrots并存储进carrots。 cout <<

2021-08-13 17:14:12 150

原创 C++学习_2 C++基础框架及cout

学习前遇到的小问题:后续学习在Linux下进行的,linux系统是挂载在基于Oracle VM VirtualBox下,遇到虚拟机剪切板的内容无法复制粘贴进主机。随后,在虚拟机软件下,设置—存储—控制器SATA—选择使用主机输入输出(I/O缓存),选择固态驱动器选项,安装增强命令,选择双向共享剪切板。重启就欧克!一、最基本的C++框架#include <iostream>//c++不同于c程序,头文件没有.hint main(void) //同C程序,main()作为入口,且一个

2021-08-12 16:06:17 320

原创 C++学习1_绪论

一、C++用途(for me):QT的使用、OpenCV、ROS系统等。学习视频教程:邴老师课程(嵌入式技术公开课邴哲松老师)。二、简介:C++是一门面向对象语言(OPP),对象、类、封装、多态和继承等,支持泛型编程。也可以理解为C的超集,C的补充。特点:提出了类的概念:首先,程序是由数据和算法构成的,可以理解为:数据 + 算法 = 程序。数据是程序操作的对象,或者理解为程序使用和处理的信息,算法就是程序使用的方法。这里,类就是一种抽象,规定了类里面有哪些数据,以及对这些数据可以进行哪些操作

2021-08-11 14:43:26 1876 4

原创 基于STM32单片机的压力变送器的使用

基于STM32单片机的压力变送器的使用1、使用原因在一次项目中需要获取压力罐中的压力,在淘宝挑选了一款压力变送器。在没有学习《过程控制》这门课之前,我也分不清楚“传感器”与“变送器”的区别。后来才清楚,传感器是把非电量信号转换为电信号,而变送器是将电信号转换为标准电信号。根据课本上所写的,目前广泛使用的是4~20mA DC模拟电流与1~5V DC模拟电压信号是国际标准。那这就好办了,对接这款压力变送器,我只需要使用单片机的ADC采集去采集电压,再根据输出电压与实际压力之间的数学关系式计算出测得的压力即可

2021-05-23 23:29:02 5811 17

原创 STM32F103控制舵机

STM32控制舵机(多个舵机、附代码)1、基本介绍2、代码#include "bsp_servo.h"void Servo_PWM_Init(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;//定义定时器结构体变量 TIM_OCInitTypeDef TIM_OCInitStructure;//定义输出比较结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量 RCC_A

2020-11-21 14:07:12 14198 20

空空如也

空空如也

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

TA关注的人

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