IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 实时操作系统 -> 正文阅读

[系统运维]实时操作系统

RTOS概念

实时响应(多任务系统)

平时的裸机相比: 裸机包括 轮询系统 (main函数一个while循环)和 前后台系统(在前面轮询系统的基础加了中断)

实时操作系统,又名多任务系统,事件放在任务进行执行,根据每一个人任务的优先级进行运行,相比前后台系统,有紧急事件时,如果事件执行的事情比较少,会在中断服务程序执行(前台),否则将在后台循环执行,还会出现一种问题,中断服务程序是可以嵌套的,如果中断服务程序比较复杂,很有可能出现中断栈溢出。所以多任务系统的实时性提高了。

有部分操作系统会出现线程的概念,其实和任务的概念一样,任务就是一个独立不断循环执行,没有返回值的函数。

引出一个知识点:Linux下的线程和进程是什么关系?

一个程序至少一个进程,一个进程至少一个线程。

进程在执行过程中拥有独立的内存单元,而多个线程共享进程所拥有的内存。

进程可以独立运行,但线程不能独立执行,必须依存在进程中,由使用该进程的应用程序提供多个线程执行控制。

内核应用开发

freertos内核部分:创建任务 启动流程 任务管理 消息队列 信号量 互斥量 事件 软件定时器 任务通知 内存管理中断管理 CPU使用率

rtthread内核部分:创建线程 启动流程 线程管理 消息队列 信号量 互斥量 事件 软件定时器 邮箱 内存管理 中断管理 双向链表

Rt-thread

移植过程:

方式一:1、在MDK官网下载,软件包,安装到MDK上,并会在package目录中找到rtt代码,就可以加入到工程文件。

????2、注释掉 部分中断服务程序 pendSV 滴答定时器

????3、新建board.h

????4、在board.c文件 初始化函数rt_hw_board_init中 初始化滴答定时器SystemClock_Config

方式二:在RTT官网下载 RT-thread软件包,自己手动移植到工程。

RTT官网文档

方式三:在RT-thread studio,新建工程。

线程控制块

系统为了顺利的调度线程,为每个线程都额外定义了一个线程控制块, 这个线程控制块就相当于线程的身份证,里面存有线程的所有信息,比如线程的栈指针,线程名称, 线程的形参等。

两个线程优先级一样时 ,采用时间片调度,同步执行。

防止被编译器优化 ,用 C 语言关键词 register 修饰。

临界段 用一句话概括就是一段在执行的时候不能被中断的代码段

控制台重映射到 rt_kprintf() (浮点数有问题)

通过 rt_kprintf 输出的内容则由

rt_hw_console_output 函数处理, 这个函数需要用户单独实现

void rt_hw_console_output(const char *str)
11 {
12 /* 进入临界段 */
13 rt_enter_critical();
14
15 /* 直到字符串结束 */
16 while (*str!='\0')
17 {
18 /* 换行 */
19 if (*str=='\n')
20 {
21 USART_SendData(DEBUG_USARTx, '\r');
22 while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
23 }
24
25 USART_SendData(DEBUG_USARTx, *str++);
26 while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
27 }
28
29 /* 退出临界段 */
30 rt_exit_critical();
31 }

消息队列

RT-Thread 中使用队列数据结构实现线程异步通信工作

堵塞机制:1、没有数据,直接返回2、没有数据,等待一段时间,超时直接返回3、一直等待

信号量(0没有信号量 1有信号量)

二值信号量(只有一个信号量 0和1)

属于同步进行,一个线程得到信号量,其他线程可以释放信号量

计数型信号量

可以想象成一个停车位,比如有8个停车位,8辆车占满车位,第九车就不能进入,要么等待改停车场有人把车开走,要么直接到其他地方。

互斥量

解决了 优先级反转问题

和信号量的区别,互斥量的获取和释放都在于同个线程

事件

信号量不同的是,它可以实现一对多,多对多的同步。即一个线程可以等待多个事件的发生: 可以是任意一个事件发生时唤醒线程进行事件处理; 也可以是几个事件都发生后才唤醒线程进行事件处理。

线程通过“逻辑与” 或“逻辑或” 与一个或多个事件建立关联,形成一个事件集。事件的“逻辑或”也称作是独立型同步,指的是线程感兴趣的所有事件任一件发生即可被唤醒;事件“逻辑与”也称为是关联型同步,指的是线程感兴趣的若干事件都发生时才被唤醒。

邮箱

是一种常见的IPC(不同进程间的传播和交换信息)通信方式。

邮箱相比信号量与消息队列来说,效率更高,所以常用来做线程与线程、中断与线程间的通信。邮箱中的每一封邮件只能容纳固 定的 4 字节内容(STM32 是 32 位处理系统, 一个指针的大小即为 4 个字节,所以一封邮 件恰好能够容纳一个指针) ,当需要在线程间传递比较大的消息时,可以把指向一个缓冲区的指针作为邮件发送到邮箱中。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:36:38  更:2021-08-03 11:39:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:56:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码