自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式Linux-线程同步-自旋锁和读写锁

自旋锁与互斥锁很相似,从本质上说也是一把锁,在访问共享资源之前对自旋锁进行上锁,在访问完成后释放自旋锁(解锁);事实上,从实现方式上来说,互斥锁是基于自旋锁来实现的,所以自旋锁相较于互斥锁更加底层。如果在获取自旋锁时,自旋锁处于未锁定状态,那么将立即获得锁(对自旋锁上锁);如果在获取自旋锁时,自旋锁已经处于锁定状态了,那么获取锁操作将会在原地“自旋”,直到该自旋锁的持有者释放了锁。由此介绍可知,自旋锁与互斥锁相似,但是互斥锁在无法获取到锁时会让线程陷入阻塞等待状态;

2023-02-06 23:54:40 569 1

原创 嵌入式Linux-线程同步-条件变量

本节我们来拓展一下线程同步的第二种方法:条件变量。条件变量是线程可用的另一种同步机制。条件变量用于自动阻塞线程,知道某个特定事件发生或某个条件满足为止,通常情况下,条件变量是和互斥锁一起搭配使用的。一个线程等待某个条件满足而被阻塞;另一个线程中,条件满足时发出“信号”;对于这方面,我们举一个最常见的例子:生产者与消费者:生产者这边负责生产产品、而消费者负责消费产品,对于消费者来说,没有产品的时候只能等待产品出来,有产品就使用它。

2023-02-04 23:03:04 567

原创 嵌入式Linux-线程同步-互斥锁

线程同步是为了对共享资源的访问进行保护,这里说的共享资源指的是多个线程都会进行访问的资源,譬如定义了一个全局变量 a,线程 1 访问了变量 a、同样在线程 2 中也访问了变量 a,那么此时变量 a 就是多个线程间的共享资源,大家都要访问它。保护的目的是为了解决数据一致性的问题。这也是为什么我们学习完单片机的裸机基础,需要进一步学习RTOS的原因,除了有多个线程的优点,还有数据的一致性,那我们在Linux学习中再次学习这部分的内容,也充分说明了这部分内容的重要!

2023-02-03 23:25:22 707

原创 嵌入式Linux-线程安全

当我们编写的程序是一个多线程应用程序时,就不得不考虑到线程安全的问题,确保我们编写的程序是一个线程安全(thread-safe)的多线程应用程序,什么是线程安全以及如何保证线程安全?带着这些问题,本小节将讨论线程安全相关的话题。

2023-02-01 23:10:29 377

原创 嵌入式Linux-线程属性

如前所述,调用 pthread_create()创建线程,可对新建线程的各种属性进行设置。在 Linux 下,使用pthread_attr_t 数据类型定义线程的所有属性。调用。。当定义 pthread_attr_t 对象之后 ,需要 使用对该对象进行初始化操作 ,当对象不再使用时,需要使用,以及等。Linux 为 pthread_attr_t 对象的每种属性提供了设置属性的接口以及获取属性的接口。

2023-01-31 22:47:38 497

原创 嵌入式Linux-线程的回收/取消/分离

春节七天连假已经过完啦,也该回收一下我们放假的线程了!听过很多回收旧手机、旧冰箱和旧彩电…,那么回收线程又是什么呢?在父、子进程当中,父进程可通过 wait()函数(或其变体 waitpid())阻塞等待子进程退出并获取其终止状态,回收子进程资源;而在线程当中,也需要如此,通过调用 pthread_join()函数来阻塞等待线程的终止,并获取线程的退出码,回收线程资源;retval 所指向的内存区域;如果目标线程被 pthread_cancel()取消,则将 PTHREAD_CANCELED 放在。

2023-01-30 23:18:06 1074

原创 嵌入式Linux-线程创建与终止

启动程序时,创建的进程只是一个单线程的进程,称之为初始线程或主线程,本小节我们讨论如何创建一个新的线程。注意pthread_create()在调用失败时通常会返回错误码,它并不像其它库函数或系统调用一样设置errno,每个线程都提供了全局变量errno的副本,这只是为了与使用errno到的函数进行兼容,在线程中,从函数中返回错误码更为清晰整洁,不需要依赖那些随着函数执行不断变化的全局变量,这样可以把错误的范围限制在引起出错的函数中。

2023-01-21 23:38:53 1622

原创 嵌入式Linux-线程的开始

计算机处理器运行速度是非常快的,在单个处理核心虽然以并发方式运行着系统中的线程(微观上交替/交叉方式运行不同的线程),但在宏观上所表现出来的效果是同时运行着系统中的所有线程,因为处理器的运算速度太快了,交替轮训一次所花费的时间在宏观上几乎是可以忽略不计的,所以表示出来的效果就是同时运行着所有线程。

2023-01-19 23:55:33 606

原创 嵌入式Linux-进程间通信

进程间通信(interprocess communication,简称 IPC)指两个进程之间的通信。系统中的每一个进程都有各自的地址空间,并且相互独立、隔离,每个进程都处于自己的地址空间中。所以同一个进程的不同模块(譬如不同的函数)之间进行通信都是很简单的,譬如使用全局变量等。但是,两个不同的进程之间要进行通信通常是比较难的,因为这两个进程处于不同的地址空间中;

2023-01-17 23:50:51 572

原创 嵌入式Linux-进程中常用的函数调用

execl()和execv()要求提供新程序的路径名,而 execlp()和 execvp()则允许只提供新程序文件名,系统会在由环境变量 PATH 所指定的目录列表中寻找相应的可执行文件,如果执行的新程序是一个 Linux 命令,这将很有用;系统调用 execve()可以将新程序加载到某一进程的内存空间,通过调用 execve()函数将一个外部的可执行文件加载到进程的内存空间运行,使用新的程序替换旧的程序,而进程的栈、数据、以及堆数据会被新程序的相应部件所替换,然后从新程序的 main()函数开始执行。

2023-01-16 23:14:55 881

原创 嵌入式linux-进程状态与进程关系

Linux 系统下进程通常存在 6 种不同的状态,分为:就绪态、运行态、僵尸态、可中断睡眠状态(浅度睡眠)、不可中断睡眠状态(深度睡眠)以及暂停态。一个新创建的进程会处于就绪态,只要得到 CPU 就能被执行。

2023-01-16 19:07:58 724

原创 嵌入式Linux-守护进程

守护进程是一种很有用的进程。Linux 中大多数服务器就是用守护进程实现的,。同时,守护进程完成许多系统任务,譬如作业规划进程 crond 等。守护进程 Daemon,通常简称为 d,一般进程名后面带有 d 就表示它是一个守护进程。守护进程与终端无任何关联,用户的登录与注销与守护进程无关、不受其影响,守护进程自成进程组、自成会话,即pid=gid=sid。

2023-01-15 00:18:25 646

原创 嵌入式linux-僵尸进程?

通常,子进程结束之后,需要父进程为子进程进行回收,俗称“收尸”,则回收子进程占用的一些内存资源,父进程通过调用wait()(或其变体 waitpid()、waitid()等)函数回收子进程资源,归还给系统。如果子进程先于父进程结束,此时父进程还未来得及给子进程“收尸”,那么此时子进程就变成了一个僵尸进程。当父进程调用 wait()(或其变体,下文不再强调)为子进程“收尸”后,僵尸进程就会被内核彻底删除。

2023-01-14 00:05:57 523

原创 嵌入式Linux-对子进程的监控

一个进程可以通过 fork()或 vfork()等系统调用创建一个子进程,一个新的进程就此诞生!事实上,Linux系统下的所有进程都是由其父进程创建而来,譬如在 shell 终端通过命令的方式执行一个程序./app,那么 app进程就是由 shell 终端进程创建出来的,shell 终端就是该进程的父进程。既然所有进程都是由其父进程创建出来的,那么总有一个最原始的父进程吧,否则其它进程是怎么创建出来的呢?确实如此,在 Ubuntu 系统下使用"ps -aux"命令可以查看到系统下所有进程信息,如下:上图

2023-01-07 22:44:06 838

原创 嵌入式Linux--进程

在 Linux 系统中,采用了虚拟内存管理技术,事实上大多数现在操作系统都是如此!这一点很好理解,就如文章中提到的,应用程序运行在一个虚拟地址空间中,所以程序中读写的内存地址对应也是虚拟地址,并不是真正的物理地址,譬如应用程序中读写 0x80800000 这个虚拟的地址,实际上并不对应于硬件的 0x80800000这个物理地址。在诸多的应用中,创建多个进程是任务分解时行之有效的方法。

2023-01-04 23:28:25 379

原创 浅谈Linux系统信息与资源

在正式介绍这些时间、日期相关的系统调用或 C 库函数之前,需要向大家介绍一些时间相关的基本概念,譬如 GMT 时间、UTC 时间以及时区等。地球总是自西向东自转,东边总比西边先看到太阳,东边的时间也总比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们的日常生活和工作都带来许多不便。GMT 时间。

2022-11-26 14:01:31 1016

原创 深入I/O挖矿

什么是文件共享?所谓文件共享指的是同一个文件(譬如磁盘上的同一个文件,对应同一个 inode)被多个独立的读写体同时进行 IO 操作。多个独立的读写体大家可以将其简单地理解为对应于同一个文件的多个不同的文件描述符,譬如多次打开同一个文件所得到的多个不同的 fd,或使用 dup()(或 dup2)函数复制得到的多个不同的 fd 等。文件共享的意义有很多,多用于多进程或多线程编程环境中,譬如我们可以通过文件共享的方式来实现多个线程同时操作同一个大文件,以减少文件读写时间、提升效率。

2022-11-25 15:57:52 775

原创 换个地方写helloworld

今天,我们重新学习C语言的基础,特别是I/O口的讲解。所谓标准 I/O 库则是标准 C 库中用于文件 I/O 操作(譬如读文件、写文件等)相关的一系列库函数的集合,通常标准 I/O 库函数相关的函数定义都在头文件中,所以我们需要在程序源码中包含头文件。

2022-11-23 13:59:22 5527 1

原创 Flask快速白嫖

你的网站,就搭好啦,世界的精彩源自你的想像,剩下得靠自己了!期待你们的作品早日上线!

2022-11-03 16:43:37 755 1

原创 HTML简单标签应用

本案例主要是html的简单标签,可快速上手和记忆

2022-10-09 15:32:42 115

原创 一、flask服务器简单搭建

的学习视频,大多数也仅供本人学习参考,因为是初学,文章暂时不做大多阐述,想学习flask搭建的可以到B站学习,这是前6集的代码,有需要的可以直接复制。本章学习主要参考B站。

2022-10-02 22:30:03 1368 2

原创 FreeRTOS的启动流程,编码风格与调试方法

RTOS主要有两种比较流行的启动方式,下面会通过伪代码讲解两种启动方式的区别,然后看看STM32cubeMX集成的FreeRTOS采用哪种启动方式。在main函数中将硬件初始化、RTOS系统初始化,同时创建所有任务,再启动RTOS调度器。方法二:在main函数中将硬件初始化、RTOS系统初始化,只创建一个启动任务,再启动RTOS调度器。 之后,在启动任务中创建各种应用任务,当所有任务创建完成,启动任务把自己删除。STM32cubeMX集成的FreeRTOS如下图,采用的是第一种启动方式。如下图,Fr

2022-07-11 20:40:42 1682

原创 FreeRTOS 学习(一)

在STM32有一定基础,在开始学习操作系统的小白,介绍使用STM32用操作系统点亮第一盏灯,这也是学习单片机最开始的地方;下面来图文配置,我这次主要介绍如何使用STM32CubeMX配置1.创建文件2.这里我是用的是STM32ZET6,其他单片机也是一样的,只要选中改型号即可:(1)、配置1这一步很重要,不配置调试接口,生成的代码将无法烧录和调试。在System Core中选择SYS,Debug根据需求选择,我使用的SW接口,选择Serial Wire完成配置(2)、延时时钟基准由SysTick改

2022-07-11 17:34:08 1039

转载 python qt 开发学习(二)

当用需要点击事件操作时,从界面控件QPlainTextEdit 里面获取,用户输入的字符串内容,进行处理。首先第一个问题: 用户点击了 统计 按钮,怎么通知程序? 因为只有程序被通知了这个点击,才能做出相应的处理。但在 Qt 系统中, 当界面上一个控件被操作时,比如 被点击、被输入文本、被鼠标拖拽等, 就会发出 信号 ,英文叫 signal 。就是表明一个事件(比如被点击、被输入文本)发生了。我们可以预先在代码中指定 处理这个 signal 的函数,这个处理 signal 的函数 叫做 slot 。比如

2022-07-07 22:04:13 313

原创 python qt开发学习(一)

运行结果:提供了整个图形界面程序的底层管理功能,比如:初始化、程序入口参数的处理,用户事件(对界面的点击、输入、拖拽)分发给各个对应的控件,等等。注意:既然QApplication要做如此重要的初始化操作,所以,我们必须在任何界面控件对象创建前,先创建它。QMainWindow、QPlainTextEdit、QPushButton 是3个控件类,分别对应界面的主窗口、文本框、按钮。他们都是控件基类对象QWidget的子类。要在界面上 创建一个控件 ,就需要在程序代码中 创建 这个 控件对应类 的一

2022-07-06 22:11:40 772

原创 基于RT_thread的分布式无线温度监控系统实战(一)

今天,教大家如何通过RT_thread studio移植代码来实现温度采集温度数据我使用的是STM32ZET6开发板(其实什么开发板都一样)只要支撑BSP开发即可实现;模式配置设置配置,并保存 “Ctrl+S”打开从RT_thread 中github下载的例程。如果找不到的,可以从这里下载基于RT_thread分布式温度采集系统下载后,找到这两个文件再将文件复制到刚刚创建的RT_thread studio 创建的Demo中这里注意了,将两个文件放在driver的文件夹中其他的目录的我没

2022-06-04 12:07:05 1143 3

原创 基于RT_thread的分布式无线温度监控系统之SENSOR框架

SENSOR 简介Sensor(传感器)是物联网重要的一部分,“Sensor 之于物联网”就相当于“眼睛之于人类”。人类如果没有了眼睛就看不到这大千的花花世界,对于物联网来说也是一样。如今随着物联网的发展,已经有大量的 Sensor 被开发出来供开发者选择了,如:加速度计(Accelerometer)、磁力计(Magnetometer)、陀螺仪(Gyroscope)、气压计(Barometer/pressure)、湿度计(Humidometer)等。这些传感器,世界上的各大半导体厂商都有生产,虽然增加了市

2022-06-02 21:30:01 690

原创 基于RT_thread的分布式无线温度监控系统

基于RT_thread的分布式无线温度监控系统是一个可实现远程监控的智能家居DIY项目,其可适用于家庭、办公室、教室等小场所得多节点温度监控,最大支持六个节点的温度数据。六个点负责温度数据采集,由一个接收结点并作为网关,通过WIFI上传至云端,手机电脑实现远程监控,实用且有趣;发送节点1.将 DS18B20 温度传感器对接 sensor 组件,正确读取 ds18b20 温度传感器数据;2.使用 nRF24L01 软件包,将温度数据以无线方式传输给接收节点,由 nRF24L01 特性决定了发送节点最多支持

2022-06-02 20:43:33 567

原创 RT_thread消息队列的使用

消息队列是RT_thread中另一种常用的线程间通信方式,消息队列是对邮箱的扩展。消息队列能够接收来自线程或中断服务例程中发出的不固定长度的消息,并把消息缓存在自己的内存空间中,而其他线程能够从消息队列中读取消息的并进行对应的处理。通过消息队列的操作基本内容与邮箱差不多,就不详细介绍了!!!

2022-06-01 16:20:29 799

原创 RT_thread邮箱的使用

一、邮箱工作机制RT_thread操作系统中的邮箱用于线程间通信,特点是开销较小,效率比较高。邮箱中的每一封邮件只能容纳固定的4字节内容(针对32位处理系统。指针的大小即为4字节,所以一封邮件恰好能容纳一个指针)线程或中断服务例程把一封4字节长度的邮件发到邮箱中,而其他需要的线程可以通过邮箱中接收这些邮件并处理。邮箱控制块:RT-Thread中使用邮箱实现线程异步通信工作,具有如下特性:邮件支持先进先出方式排队与优先级排队方式,支持异步读写工作方式。发送与接收邮件均支持超时机制。一个线程能

2022-05-30 21:45:45 1444

原创 RT_thread 事件集的使用

一、事件集工作机制信号量主要用于“一对一”的线程同步;当需要“一对多”、“多对一”、“多对多”的同步时,就需要事件集来处理了;RT_thread 中的事件集用一个32无符号整型变量来表示,变量中一个位为代表一个事件,线程通过“逻辑与”或者“逻辑或”与一个或多个事件建立关联形成一个事件组合。事件的“逻辑或”也称为是独立型同步,指的是线程与任何事件之一发生同步,只要有一个事件发生,即满足条件;事件的“逻辑与”也称为是关联型的同步,指的是线程或若干事件同步发生,只有这些事件全部发生,才满足条件;...

2022-05-30 20:50:59 555

原创 RT_thread 线程优先级的翻转

这一节的内容主要是围绕上一节互斥量优先继承和优先级反转的问题进一步进行扩展探讨;一、线程优先级翻转优先级翻转:是使用信号量会导致的另一个潜在问题;所谓线程优先级翻转,即当一个高优先级线程试图通过某种互斥IPC对象机制访问共享资源时,如果该IPC对象已被一低优先级的线程所持有,这个低优先级线程在运行过程中,可能又被其他一些其他中优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞的情况。优先级翻转会造成高优先级线程的实时性得不到保证。二、优先级继承在RT_thread 中,通过互斥量

2022-05-25 11:02:36 638

原创 RT_thread互斥量的使用

一、互斥量前面学习了RT-Thread的信号量,但信号量在一些场合使用会存在优先级翻转问题,接下来我们学习互斥量,在 RT-Thread 操作系统中,互斥量可以解决优先级翻转问题,实现的是优先级继承算法。互斥量和信号量不同的是:拥有互斥量的线程拥有互斥量的所有权,互斥量支持递归访问且能防止线程优先级翻转;并且互斥量只能由持有线程释放,而信号量则可以由任何线程释放。二、互斥量工作机制1、在 RT-Thread 操作系统中,互斥量可以解决优先级翻转问题,实现的是优先级继承算法。优先级继承是通过在线程

2022-05-23 18:51:03 432

原创 RT_thread生产者与消费者问题

一、生产者与消费者模型生产者消费者问题是一个经典的、多线程同步问题。1.有两个线程:一个生产者线程和一个消费者线程。两个线程共享一个初始为空、固定大小为n的缓存区。2.生产者的工作是“生产”一段数据,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待,如此反复;3.同时,只有缓冲区非空时,消费者才能从中取出数据,一次消费- -段数据,否则必须等待,如此反复。问题的核心是:1.要保证不让生产者在缓存还是满的时候仍然要向内写数据;2.不让消费者试图从空的缓存中取出数据。二、生产者与消费

2022-05-19 08:51:38 609 5

原创 RT_thread信号量的使用

一、IPC使用在嵌入式系统中运行的代码主要包括线程和ISR,在它们的运行步骤有时需要同步(按照预定的先后次序运行),他们访问的资源有时需要互斥(一个时刻只允许一个线程访问资源),他们之间有时也要彼此交换数据。这些需求,有的时候因为应用需求,有的是多线程编程模型带来的需求。操作系统...

2022-05-18 17:32:34 650

原创 RT_thread 临界区保护

一、临界资源临界区资源是指一次仅允许一次线程的访问的共享资源。它可以是一个具体的硬件设备,也可以是一个变量、一个缓冲区。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对他们进行访问。临界区每个线程中访问(操作)临界区资源的那段代码称为临界区(Critical Section), 我们每次只允许一个线程进入临界区。二、关闭系统调度1.禁止调度禁止调度,既是把调度器锁住,不让其他进行线程切换。这样就能保证当前能保证当前运行的任务不被换出,直到调度器解锁,所以禁止调度是常用的临界区保护

2022-05-18 09:16:24 1013

原创 openMV实现颜色追踪

一、驱动代码from pyb import Pin, Timerinverse_left=False #change it to True to inverse left wheelinverse_right=False #change it to True to inverse right wheel#四个引脚分别控制两个引脚的电机运动的方向ain1 = Pin('P0', Pin.OUT_PP)ain2 = Pin('P1', Pin.OUT_PP)bin1 = Pin('P2'

2022-05-16 09:27:02 2546 2

原创 RT_thread空闲线程及两个常用的钩子函数

一、空闲线程空闲线程是一个比较特殊的系统线程,它具备最低的优先级。当系统中无其他就绪线程可运行,调度器将调度到空闲线程。空闲线程还负责一些系统资源回收以及将一些处于关闭台的线程从线程调度列表中移除的动作;空闲线程在形式上是一个无限循环结构,且永远不被挂起;在RT_thread实时操作系统中空闲线程向用户提供了钩子函数,空闲线程钩子函数可以让系统在空闲的时候执行一些非紧急事务,例如系统运行指示灯闪烁,CPU使用率统计等等。二、空闲线程钩子函数1.钩子函数API设置钩子函数rt_err_t rt

2022-05-15 21:45:37 739

原创 简单线程实例-跑马灯-栈空间分配技巧

一、线程的切换线程从创建并启动到消亡共经历了5种状态:新建、就绪、运行、阻塞和死亡所以,一下流程图可观察为:二、系统的滴答时钟每个操作系统中都会存在一个系统心跳的时钟,是操作系统中最小的时钟单位。这个时钟负责系统和时间相关的一些操作。作为操作系统运行的时间尺度,心跳时钟是由硬件定时器的定时中断产生。系统的心跳时钟我们也常称为系统滴答或时钟节拍,系统抵达的频率需要我们根据cpu的处理能力来决定。时钟节拍使得内核可以将线程延时若干个整数时钟节拍,以及线程等待事件发生,提供等待超时的依据,频率

2022-05-13 23:09:39 237

原创 RTthread-线程的创建

RT-Thread名为实时线程RTOS, 那么什么叫线程?人们在生活中处理复杂问题时,惯用的方法就是“分而治之”,即把一个大问题分解成多个相对简单、比较容易解决的小问题,小问题逐个被解决了,大问题也就随之解决了。同样,在设计一个较为复杂的应用程序时,也通常把一个大型任务分解成多个小任务,然后通过运行这些小任务,最终达到完成大任务的目的。在RT-Thread中,与上述小任务对应的程序实体就叫做“线程”(或任务),RT-Thread就是一个能对这些小“线程”进行管理和调度的多“线程”操作系统。线程是实现任

2022-05-12 22:15:36 3955

RT_thread nano F103C8T6移植版,测试有效

RT_thread nano F103C8T6移植版,测试有效

2022-10-04

空空如也

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

TA关注的人

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