- 博客(71)
- 资源 (2)
- 收藏
- 关注
原创 使用Virtio Driver实现一个计算阶乘的小程序——QEMU平台
本篇文章的主要内容是使用Virtio前后端数据传输的机制实现一个计算阶乘的小程序,主要功能是在Virtio driver中传递一个整数到Virtio device,在Virtio device中计算这个整数的阶乘,计算完成后再将计算结果传递给Virtio driver。
2024-08-19 21:00:00
1899
原创 基于MMIO的Virtio流程分析——QEMU平台
本篇文章主要是对QEMU中基于MMIO 的Virtio 相关的代码进行了分析,包括 Virtio driver 和Virtio device的初始化流程,MMIO的相关初始化、QEMU中 Virtio MMIO设备树节点的创建、以及前后端通知的流程等。
2024-08-15 21:00:00
828
原创 设计模式 —— 简单工厂模式(C语言)
一般在面向对象语言中用得较多,但C语言也可以实现,在做项目的时候可以加入到工程中去,但工程小的话就没必要用,工程稍微大点使用该设计模式就会很方便,比如我们在使用树莓派或者其它板子做项目时会涉及很多的传感器或者其它电子器件,器件多,代码长,还要考虑代码的稳定性,后期的维护等,像这种情况就可以用这种设计模式来进行写代码。led.h文件主要是声明了Devices 结构体,结构体里面定义了非常多的。文件主要是实现相关的功能,将每个功能都用函数指针进行封装,
2022-12-23 16:21:49
745
3
原创 常用算法———P I D控制算法(P I D三个参数的作用和两种P I D算法的代码实现)
文章主要讲解了P I D三个参数的具体作用,用实际例子来说明,比较好理解,由理论公式再到代码实现,适合刚学习P I D的同学。
2022-10-27 16:28:36
3940
6
原创 Linux树莓派开发——配置树莓派内核源码,内核编译,更换树莓派Linux内核
树莓派Linux内核源码的下载,编译,以及更换Linux树莓派的内核方法
2022-03-13 14:39:26
6326
原创 Linux树莓派开发——交叉编译概述和工具链的使用,文件的软/硬链接,以及带wiringPi库的交叉编译
Linux交叉编译的概述,教程工具链的安装和使用,以及带有wiringPi库的交叉编译。
2022-03-12 00:13:26
3417
转载 E: Could not open lock file /var/lib/dpkg/lock-frontend - open (2: 没有那个文件或目录)E: Unable to acqui
错误总结
2022-03-10 03:08:40
987
原创 Filezilla出现“Network error: Connection refused”和“尝试连接“ECONNREFUSED - 连接被服务器拒绝”失败”等错误
Filezilla的一些连接问题。这个问题是因为Ubuntu才安装好的新系统,系统中缺乏openssh-server这个包,只需要在Ubuntu中输入安装命令:sudo apt-get install openssh-server,下载好就可以了。如果上面下载了openssh-server这个包还是显示无法连接到服务器,总是报错:尝试连接“ECON...
2022-03-10 02:47:24
6682
4
原创 Ubuntu中 invalid operation updata问题
sudo apt-get updata和sudo apt-get updateupdata 和 update最近装了一个Ubuntu 18.4的系统,在下载Vim的时候遇到了一些问题,刚开始错误原因是没有更新APT的源更新APT源的命令sudo apt-get updatesudo apt-get upgrade这个是我输入的又找到了invalid operation updata 错误的解决办法,将sudo apt-g...
2022-03-07 15:11:43
6498
原创 Linux树莓派开发——gettimeofday函数,以及用超声波模块测量距离
gettimeofday函数的使用,timeval和timezone结构体的简介,以及树莓派通过超声波测量距离。
2022-03-05 21:48:57
735
原创 Linux树莓派开发——分文件编程,静/动态函数库,以及函数库的制作
分文件编程、Linux的静态函数库和动态函数库,以及制作静态函数库和动态函数库。
2022-03-04 02:15:01
844
原创 通过STM32单片机计算并控制小车速度,通过控制速度的思想扩展到控制其它变化量
说明:如果有哪里说错了或者说得不好的话还请大家指出来,及时纠正错误,或者哪里有更好的解决方法也可以提出来,我们一起学习交流。目录一、编码电机二、单片机相关定时器的作用以及配置1、TIM2的配置2、TIM3的配置3、TIM4的配置4、PID函数5、读定时器的计数值6、calc_motor_rotate_speed()函数三、2020电赛C题四、扩展一、编码电机如果想要控制小车的速度就需要得到小车的速度,想要得到小车的速度就需要用到编码电机,下面先来大概看一下
2021-12-31 01:08:04
11728
2
原创 教你做一个属于自己的平衡小车,用STM32F103单片机实现(软件篇)
这里是平衡小车代码篇这里是平衡小车硬件篇我使用的是keilMDK编程,还是挺好用的,就是有时候输入中文会乱码keilMDK就长这个样子,应该都用过的。这个是keilMDK的工作页面,上面是工具和调试区,左边是工程区,中间的编写代码区。下载代码我用的串口下载,下载软件用的FlyMCU长这个样子这个是这个软件下载代码的区域。...
2021-12-25 19:11:55
1981
1
原创 教你做一个属于自己的平衡小车,用STM32F103单片机实现(代码篇)
目录一、定时器相关代码1、TIM22、TIM3和TIM4二、中断相关代码三、电机相关代码四、OLED屏幕和MUP6050相关代码五、PID函数1、直立环2、速度环3、转向环六、控制函数七、扩展篇说明:本篇文章适用于有点STM32单片机基础,和有相关的硬件基础,并且想做一个小项目的人,可以作为一个参考,当然了没有基础的也可以下面就进行我们的代码部分一、定时器相关代码我这里使用了三个定时器,分别是TIM2,TIM3,TIM4,定时器2用于产生...
2021-12-25 18:35:41
29447
251
原创 教你做一个属于自己的平衡小车,用STM32F103单片机实现(硬件篇)
说明:本篇文章适用于有点STM32单片机基础,和有相关的硬件基础,并且想做一个小项目的人,可以作为一个参考,当然了没有基础的也可以一、电机如果要做平衡小车不仅需要电机输出PWM来控制小车的行走,还应该适用带编码器的电机,因为要得到小车的速度,这样才能实现闭环控制,如下图(编码电机) ...
2021-12-25 15:55:26
10342
18
原创 C语言能干什么?手把手教你写一个简单的聊天软件
一、服务端代码因为端口号容易被占用的原因,所以IP地址和端口号采用参数传递的方法,即int main(int argc,char **argv)1、头文件#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdlib.h>#incl
2021-06-24 16:44:17
3661
26
原创 利用52单片机制作的超声波避障小车(包含所有源码)
做这个超声波避障小车的原因是因为单片机课程设计一、硬件部分1、电机驱动电机驱动四个输入端IN1、IN2、IN3和IN4,四个输出端OUT1、OUT2、OUT3和OUT4,一个接地端GND,单片机的P2.1~P2.4端口分别与 引脚IN1、IN2、IN3、IN4相连通过电平变化控制电机在持续高速状态下的转向,L298N的四个输出端直接与两个电机相连驱动电机,采用电池供电。2、超声波超声波模块采用的HC–SR04超声波模块,该模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3
2021-06-22 23:17:31
9771
21
原创 Linux系统编程——网络编程(二)Socket编程步骤 和 Linux提供的API解析
一、Socket编程步骤TCP服务器编程步骤:1、创建Socket套接字,用Socket ()函数2、设置Socket属性,用setsockopt()也可以不用3、为套接字添加信息(IP地址和端口号)用bind()函数4、开启监听,用listen()函数5、监听到有客户端接入,接受一个连接,用accept()函数6、交换数据,用函数send()和recv(),或者用read(),write()7、关闭套接字,断开连接TCP客户端编程步骤:1、创建一个Socket,用Socket函数2、
2021-06-14 20:54:58
274
2
原创 Linux系统编程——网络编程(一)网络编程概述、Socket(套接字),TCP/UDP以及字节序
1、 网络编程概述进程间通信学习了:管道、消息队列、共享内存、信号、信号量这5种通信方式,但是都是依靠Liunx内核进行的。这也造成了他们的一个缺点就是只能在单机运行。如果要实现多机通信就需要引入网络编程。那么如何准确地定位网络上一台或多台主机以及定位主机呢?即通过通信双方的地址。地址由IP地址和端口号组成。IP地址:负责定位主机。端口号:负责定位主机上的特定应用。端口号的作用:一台拥有IP地址的主机可以提供许多服务,比如Web服务、 FTP服务、SMTP服务等。这些服务完全可以通过1个IP地
2021-06-14 16:00:32
207
原创 Linux系统编程——线程(四)条件相关API
条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。条件变量使用之前必须首先初始化pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化,可以把常量PTHREAD_COND_INITIALIZER赋给静态分配的条件变量静态初始化:pthread
2021-06-14 00:00:14
119
原创 Linux系统编程——线程(三)互斥量相关API 和线程死锁
互斥量(mutex) 从本质上就是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,其他线程试图再次对互斥量加锁,则将会被阻塞,直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。互斥变量用pthread_mutex_t数据类型表示。在使用互斥变量前必须对它进行初
2021-06-13 18:58:12
336
原创 Linux系统编程——线程(二)线程自身相关API 和 线程共享内存的验证
头文件#include<pthread.h>线程操作包括3 种线程的创建,退出,等待。1、创建函数原型int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);// 返回:若成功返回0,否则返回错误编号当pthread_create成功返回时tidp:指向的内存单元被设置为新创
2021-06-13 04:05:06
145
原创 Linux系统编程——线程(一)进程和线程的区别、线程的优点、以及线程开发的API
进程和线程进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一
2021-06-13 01:58:08
215
原创 Linux系统编程——进程间的通信(六)信号量
信号量信号量(Semaphore),是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量。它是一个计数器。信号量用于实现进程或者线程间的互斥与同步,而不是用于存储进程间通信数据。特点(1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。(2)信号量基于操作系统的P
2021-06-12 20:31:37
332
原创 C语言不使用中间变量交换两个变量的数据
在一般情况下,我们交换两个变量的数据都需要第三个变量作为中间变量,如下#include <stdio.h>int main(){ int a = 10; int b = 20; int c; printf("交换前a = %d,b = %d\n",a,b); c = b; b = a; a = c; printf("交换后a = %d,b = %d\n",a,b); return 0;}那么怎样才能不使用第三个
2021-06-12 11:01:17
2300
原创 Linux系统编程——进程间的通信(五)信号
对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号为 Linux 提供了一种处理异步事件的方法。比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序 。信号概述...
2021-06-12 02:34:36
720
原创 Linux系统编程——进程间的通信(四)共享内存
什么是共享内存和共享内存的特点?所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。原理进程A将信息放入共享内存中进程B从共享内存中读取编程步骤1、创建或者打开共享内存2、进程A连接(映射)共享内存,写入数据3、进程A断开4、进程B连接(映射)共享内存,读取数据5、进程B断开6、释放共享内存常用API1 #include <sys/shm.h>
2021-05-12 23:10:11
273
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人