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 个字节,所以一封邮 件恰好能够容纳一个指针) ,当需要在线程间传递比较大的消息时,可以把指向一个缓冲区的指针作为邮件发送到邮箱中。
|