赞
踩
实时响应(多任务系统)
平时的裸机相比: 裸机包括 轮询系统 (main函数一个while循环)和 前后台系统(在前面轮询系统的基础加了中断)
实时操作系统,又名多任务系统,事件放在任务进行执行,根据每一个人任务的优先级进行运行,相比前后台系统,有紧急事件时,如果事件执行的事情比较少,会在中断服务程序执行(前台),否则将在后台循环执行,还会出现一种问题,中断服务程序是可以嵌套的,如果中断服务程序比较复杂,很有可能出现中断栈溢出。所以多任务系统的实时性提高了。
有部分操作系统会出现线程的概念,其实和任务的概念一样,任务就是一个独立不断循环执行,没有返回值的函数。
引出一个知识点:Linux下的线程和进程是什么关系?
一个程序至少一个进程,一个进程至少一个线程。
进程在执行过程中拥有独立的内存单元,而多个线程共享进程所拥有的内存。
进程可以独立运行,但线程不能独立执行,必须依存在进程中,由使用该进程的应用程序提供多个线程执行控制。
freertos内核部分:创建任务 启动流程 任务管理 消息队列 信号量 互斥量 事件 软件定时器 任务通知 内存管理中断管理 CPU使用率
rtthread内核部分:创建线程 启动流程 线程管理 消息队列 信号量 互斥量 事件 软件定时器 邮箱 内存管理 中断管理 双向链表
移植过程:
方式一:1、在MDK官网下载,软件包,安装到MDK上,并会在package目录中找到rtt代码,就可以加入到工程文件。
2、注释掉 部分中断服务程序 pendSV 滴答定时器
3、新建board.h
4、在board.c文件 初始化函数rt_hw_board_init中 初始化滴答定时器SystemClock_Config
方式二:在RTT官网下载 RT-thread软件包,自己手动移植到工程。
方式三:在RT-thread studio,新建工程。
系统为了顺利的调度线程,为每个线程都额外定义了一个线程控制块, 这个线程控制块就相当于线程的身份证,里面存有线程的所有信息,比如线程的栈指针,线程名称, 线程的形参等。
两个线程优先级一样时 ,采用时间片调度,同步执行。
防止被编译器优化 ,用 C 语言关键词 register 修饰。
临界段 用一句话概括就是一段在执行的时候不能被中断的代码段
通过 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、一直等待
属于同步进行,一个线程得到信号量,其他线程可以释放信号量
可以想象成一个停车位,比如有8个停车位,8辆车占满车位,第九车就不能进入,要么等待改停车场有人把车开走,要么直接到其他地方。
和信号量的区别,互斥量的获取和释放都在于同个线程
线程通过“逻辑与” 或“逻辑或” 与一个或多个事件建立关联,形成一个事件集。事件的“逻辑或”也称作是独立型同步,指的是线程感兴趣的所有事件任一件发生即可被唤醒;事件“逻辑与”也称为是关联型同步,指的是线程感兴趣的若干事件都发生时才被唤醒。
邮箱相比信号量与消息队列来说,效率更高,所以常用来做线程与线程、中断与线程间的通信。邮箱中的每一封邮件只能容纳固 定的 4 字节内容(STM32 是 32 位处理系统, 一个指针的大小即为 4 个字节,所以一封邮 件恰好能够容纳一个指针) ,当需要在线程间传递比较大的消息时,可以把指向一个缓冲区的指针作为邮件发送到邮箱中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。