当前位置:   article > 正文

实时操作系统_rtthtrad实施操作系统

rtthtrad实施操作系统

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 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

消息队列

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

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

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

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

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

计数型信号量

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

互斥量

解决了 优先级反转问题

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

事件

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

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

邮箱

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/67424
推荐阅读
相关标签
  

闽ICP备14008679号