嵌入式系统原理及应用-基于STM32和RT-Thread 课件 第7、8章 RTT嵌入式操作系统基础、线程管理_第1页
嵌入式系统原理及应用-基于STM32和RT-Thread 课件 第7、8章 RTT嵌入式操作系统基础、线程管理_第2页
嵌入式系统原理及应用-基于STM32和RT-Thread 课件 第7、8章 RTT嵌入式操作系统基础、线程管理_第3页
嵌入式系统原理及应用-基于STM32和RT-Thread 课件 第7、8章 RTT嵌入式操作系统基础、线程管理_第4页
嵌入式系统原理及应用-基于STM32和RT-Thread 课件 第7、8章 RTT嵌入式操作系统基础、线程管理_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统原理及应用第7章RTT操作系统基础1RTT架构2RTT开发环境搭建3RTT内核基础45课后作业本章总结RTT简介RTT系统架构7.1RTT架构本节小结7.1.1RTT简介一、操作系统操作系统是管理和控制计算机硬件和软件的计算机程序,是直接运行在计算机上的最基本的系统软件。嵌入式操作系统(EmbeddedOperatingSystem,简称:EOS)是用于嵌入式系统的操作系统,负责嵌入式系统的软、硬件资源分配、任务调度、同步通信等,通常包括底层驱动程序、系统内核、设备驱动接口、通信协议、图形界面等。7.1.1RTT简介操作系统桌面操作系统服务器操作系统移动操作系统嵌入式操作系统Windows,Linux,MacOSLinux,WindowsAndroid,iOSRT-Thread,AliOSThings,HuaweiLiteOS,TencentOStiny,嵌入式Linux,uC/OS,FreeRTOS7.1.1RTT简介7.1.1RTT简介二、RTT操作系统RT-Thread,全称是RealTime-Thread,是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行,但并不意味着处理器在同一时刻真地执行了多个任务。RT-Thread是一个物联网操作系统。物联网操作系统是指以操作系统内核(可以是RTOS、Linux等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台。7.1.2RTT系统架构不仅仅是一个实时内核,还具备丰富的中间层组件。1.内核层内核层包括RT-Thread内核和libcpu/BSP两部分,其中RT-Thread内核是RTT的核心部分,用于实现多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等,libcpu/BSP是芯片移植相关文件和板级支持包,由外设驱动和CPU移植构成,与底层硬件密切相关。7.1.2RTT系统架构2.组件服务层组件服务层采用模块化设计,包括设备框架、低功耗管理、FinSH控制台、Wifi管理器、USB协议栈、DFS虚拟文件系统、网络架构、异常处理、键值数据库等组件模块,各组件模块高内聚、低耦合,是RT-Thread内核之上的上层软件模块。7.1.2RTT系统架构3.软件包软件包是运行于RTT物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码、库文件组成。RTT提供了开放的软件包平台,存放了大量官方提供或开发者提供的软件包,这些软件包具有很强的可重用性,极大地方便了开发者在最短时间内,完成应用开发,是RTT生态的重要组成部分。截止目前,RTT提供的软件包已超多400个,软件包下载量将近800万,RTT对软件包进行了分类管理。7.1.2RTT系统架构本节小结了解嵌入式操作系统;理解物联网操作系统及RTT系统架构;查阅相关资料,了解国产操作系统发展历史,面临的困局。下载安装软件测试7.2RTT开发环境搭建本节小结7.2.1下载安装RTT支持RT-ThreadStudio、ARM-MDK、IAR等主流开发工具开发,其中RT-ThreadStudio是睿赛德为RTT量身定做的免费集成开发环境,目前已支持STM32全系列芯片。本书采用RT-ThreadStudio进行RTT开发。RT-ThreadStudio可从RTT官网下载(/page/download.html),下载完成后双击安装程序即可开始安装,注意安装路径不能包含中文。安装完成后可双击打卡软件,首次打开需要联网注册或登录(已注册过)。7.2.2软件测试1.创建工程2.编译工程3.下载程序4.观察运行结果本节小结熟练搭建RTT开发环境内核简介RTT启动流程7.3RTT内核基础内核对象模型程序内存分布自动初始化机制本节小结7.3.1内核简介内核位于内核层,是操作系统最基础最重要的部分,RTT内核架构如图所示,内核包括内核库和实时内核。7.3.1内核简介1.内核库内核库是为了保证内核能够独立运行的一套小型的类似C库的函数实现子集。C库也叫C运行库(CRuntimeLibrary),提供了“strcpy”、“memcpy”、“printf”、“scanf”等函数。根据编译器的不同自带C库的情况也会有些不同,当使用GNUGCC编译器时,会携带更多的标准C库函数。RTT内核库仅提供内核用到的一小部分C库函数,为了避免与标准C库函数重名,在这些函数都会加上rt_前缀,如rt_kprintf。7.3.1内核简介2.实时内核实时内核主要实现对象管理、线程管理及调度器、线程间通信管理、时钟管理及内存管理等。(1)线程调度线程是RTT操作系统中最小的调度单位,RTT不限制线程数量的多少,线程数量只和硬件平台的内存相关。RTT线程调度算法是基于优先级的全抢占式多线程调度算法,即在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的,其它部分都是可以抢占的,包括线程调度器自身。7.3.1内核简介2.实时内核(1)线程调度与中断一样,线程也具有优先级,RTT支持256个线程优先级,也可通过配置文件更改为最大支持32个或8个线程优先级。对于STM32,RTT默认配置是32个线程优先级,0代表最高优先级,31代表最低优先级,最低优先级留给空闲线程使用。RTT支持创建多个具有相同优先级的线程,采用时间片轮转调度算法调度优先级相同的线程,使得优先级相同的线程运行相应的时间。7.3.1内核简介2.实时内核(2)线程间同步与线程间通信线程间同步用于控制线程的执行顺序,RTT提供了信号量、互斥量和事件集三种方式用于实现线程间同步。线程间通信用于实现不同线程间的信息传递,RTT提供了邮箱、消息队列和事件三种方式用于实现线程间通信。7.3.1内核简介2.实时内核(3)时钟管理操作系统通过时间规范任务的执行,操作系统中时间的最小单位是时钟节拍,时钟节拍是特定的周期性中断(系统心跳),中断之间的时间间隔取决于不同的应用,一般是1ms~100ms,时钟节拍越快,系统的实时响应越快,系统的额外开销也越大。7.3.1内核简介2.实时内核(3)时钟管理时钟节拍由配置为中断触发模式的硬件定时器产生,定时器中断发生时将调用一次超时函数(定时器回调函数),通知操作系统已经过去一个系统时钟。RTT提供两类定时器:一类是单次触发定时器,在启动后只会触发一次定时器事件,然后定时器自动停止;另一类是周期触发定时器,启动后会周期性的触发定时器事件,直到用户手动的停止定时器。RTT默认采用SysTick定时器产生时钟节拍,用户也可根据实时性要求选择合适类型的定时器。7.3.1内核简介2.实时内核(4)内存管理在计算系统中,存储空间一般分为内部存储空间和外部存储空间。内部存储空间即RAM(随机存储器),访问速度较快,能够按照变量地址随机访问,可以把内部存储空间理解为电脑的内存。外部存储空间即ROM(只读存储器),其保存的内容相对比较固定,即使掉电后数据也不会丢失,可以把它理解为电脑的硬盘。7.3.1内核简介2.实时内核(4)内存管理变量、中间数据一般存放在RAM中,只有在实际使用时才将它们从RAM调入到CPU中进行运算。有些数据需要的内存大小需要在程序运行过程中根据实际情况确定,这就要求系统具有对内存空间进行动态管理的能力,在需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用。7.3.1内核简介2.实时内核(4)内存管理RTT内存管理支持静态内存池管理及动态内存堆管理。静态内存池管理是有可用空间时,系统对内存块分配的时间将是恒定的,当静态内存池无空间时,系统将申请内存块的线程挂起或阻塞掉,当其他线程释放内存块到内存池时,如果有挂起的线程等待待分配内存块,则系统将唤醒该线程进行内存分配。7.3.1内核简介2.实时内核(4)内存管理RTT内存管理支持静态内存池管理及动态内存堆管理。动态内存堆管理在系统资源不同的情况下,分别提供了面向小内存系统的内存管理算法和面向大内存系统的内存管理算法,还提供了memheap动态内存堆管理方法,可以将含有多个地址且不连续的内存堆“粘贴”在一起,让用户操作起来像是在操作一个内存堆。7.3.1内核简介2.实时内核(5)IO设备管理RTT将PIN、I2C、SPI、USB、UART等作为外设设备,统一通过设备注册完成。实现了按名称访问的设备管理子系统,可按照统一的API界面访问硬件设备。在设备驱动接口上,根据嵌入式系统的特点,对不同的设备可以挂接相应的事件。当设备事件触发时,由驱动程序通知给上层的应用程序。7.3.2RTT启动流程启动流程是了解一个系统的开始,RTT支持多种平台和多种编译器,而rtthread_startup函数是RTT规定的统一启动入口,其执行顺序是:系统先从启动文件开始运行,然后进入RTT启动函数rtthread_startup,最后进入用户入口函数main。7.3.2RTT启动流程7.3.2RTT启动流程以RT-ThreadStudio为例,用户程序入口为位于main.c文件中的main函数。系统启动后先运行startup_stm32f103xe.s文件中的汇编代码,运行“blentry”指令后跳转到components.c文件中调用entry函数,进而调用rtthread_startup函数,进行RT-Thread系统启动。在运行rtthread_startup函数时调用rt_application_init函数,创建并启动main线程,等调度器工作后进入mian.c文件中运行main函数,完成系统启动。7.3.2RTT启动流程7.3.2RTT启动流程7.3.2RTT启动流程7.3.2RTT启动流程7.3.3程序内存分布MCU包含FLASH和RAM两类存储空间。RT-ThreadStudio将程序编译后分为text、data和bss三个程序段,分别存储在MCU不同的存储区。程序段存储内容所在存储区备注text代码、中断向量表、初始化的局部变量、局部常量FlashFlash=text+dataRAM=data+bssdata初始化的全局变量、全局或局部静态变量RAMbss所有未初始化的数据RAM7.3.3程序内存分布7.3.4自动初始化机制自动初始化机制是指初始化函数在系统启动过程中被自动调用,需要在函数定义处通过宏定义的方式进行自动初始化申明,无需显式调用。代码最后的INIT_BOARD_EXPORT(xxx_init)表示使用自动初始化功能,xxx_init函数在系统初始化时会被自动调用。intxxx_init(void){......return0;}INIT_BOARD_EXPORT(xxx_init);7.3.4自动初始化机制RTT的自动初始化机制使用了自定义实时接口符号段,将需要在启动时进行初始化的函数指针放到了该段中,形成一张初始化函数表,在系统启动过程中遍历该表,并调用表中的函数,达到自动初始化的目的。初始化顺序宏接口描述1INIT_BOARD_EXPORT(fn)非常早期的初始化,此时调度器还未启动2INIT_PREV_EXPORT(fn)主要是用于纯软件的初始化、没有太多依赖的函数3INIT_DEVICE_EXPORT(fn)外设驱动初始化相关,比如网卡设备4INIT_COMPONENT_EXPORT(fn)组件初始化,比如文件系统或者LWIP5INIT_ENV_EXPORT(fn)系统环境初始化,比如挂载文件系统6INIT_APP_EXPORT(fn)应用初始化,比如GUI应用7.3.5内核对象模型1.静态对象和动态对象RT-Thread内核采用面向对象的设计思想进行设计,系统级的基础设施都是一种内核对象,例如线程,信号量,互斥量,定时器等。内核对象分为两类:静态内核对象和动态内核对象,静态内核对象,在程序中初始化;动态内核对象则是从内存堆中创建的。静态对象会占用RAM空间,不依赖于内存堆管理器,内存分配时间确定,运行效率高。动态对象不占用额外的RAM空间,依赖于内存堆管理器,运行时申请RAM空间,当对象被删除后,占用的RAM空间被释放,运行效率较低。7.3.5内核对象模型2.内核对象管理架构RT-Thread采用内核对象管理系统来访问/管理所有内核对象,内核对象包含了内核中绝大部分设施,这些内核对象可以是静态分配的静态对象,也可以是从系统内存堆中分配的动态对象。通过这种内核对象的设计方式,RT-Thread做到了不依赖于具体的内存分配方式,系统的灵活性得到极大的提高。RT-Thread内核对象包括:线程,信号量,互斥量,事件,邮箱,消息队列和定时器,内存池,设备驱动等。对象容器中包含了每类内核对象的信息,包括对象类型,大小等。对象容器给每类内核对象分配了一个链表,所有的内核对象都被链接到该链表上。7.3.5内核对象模型2.内核对象管理架构7.3.5内核对象模型2.内核对象管理架构structrt_object{/*内核对象名称*/charname[RT_NAME_MAX];/*内核对象类型*/rt_uint8_ttype;/*内核对象的参数*/rt_uint8_tflag;/*内核对象管理链表*/rt_list_tlist;};7.3.5内核对象模型3.内核对象管理方式一类对象由一个rt_object_information结构体来管理,每一个这类对象的具体实例都通过链表的形式挂接在object_list上。而这一类对象的内存块尺寸由object_size标识出来(每一类对象的具体实例,他们占有的内存块大小都是相同的)。structrt_object_information{/*对象类型*/enumrt_object_class_typetype;/*对象链表*/rt_list_tobject_list;/*对象大小*/rt_size_tobject_size;};7.3.5内核对象模型4.内核对象操作初始化对象:rt_object_init脱离对象:rt_object_detach分配对象:rt_object_allocate删除对象:rt_object_delete辨别对象:rt_object_is_systemobject本节小结1.了解RTT内核;2.掌握RTT启动流程;3.了解程序内存分布和自动初始化机制;4.理解内核对象模型。7.4本章总结7.5课后作业1.绘制本章内容思维导图。2.搭建RTT开发环境,并分析RTT启动流程。谢谢欣赏THEEND嵌入式系统原理及应用第8章线程管理1线程基本概念2线程工作机制3线程应用方法及实例45课后作业本章总结线程概念线程管理方式及特点8.1线程基本概念本节小结8.1.1线程概念模块化编程是嵌入式系统设计的基本思想之一,通常将一个大的任务分解为多个简单易解决的小任务。线程是任务的实现载体,是RTT操作系统中最基本的调度单位。8.1.2线程管理方式及特点线程管理的主要功能是对线程进行管理和调度,以实现不同线程的快速切换,达到多线程同时运行的目的,实际上同一时刻MCU只能运行一个线程。8.1.2线程管理方式及特点线程调度由线程调度器完成,RT-Thread的线程调度器是抢占式:保证最高优先级的线程优先运行。(1)无线程运行时,从就绪线程列表中查找最高优先级线程运行。(2)低优先级线程使高优先级的线程满足运行条件,当前线程停止运行,高优先级的线程运行。(3)中断服务程序使高优先级的线程满足运行条件,中断完成时,被中断的线程挂起,高优先级线程运行。线程切换时,调度器先将当前线程上下文信息保存,当再切回到这个线程时,调度器将该线程的上下文信息恢复。本节小结理解线程的概念;理解线程管理方式及特点。线程控制块线程重要属性8.2线程工作机制系统线程本节小结8.2.1线程控制块线程控制块是操作系统用于管理线程的一个数据结构,存放了线程的优先级、线程名称、线程状态、链表结构、线程等待事件集合等信息,在RT-Thread中,线程控制块由结构体structrt_thread表示,指向线程控制块的指针称为线程句柄,用rt_thread_t表示。8.2.1线程控制块structrt_thread{/*rtobject*/charname[RT_NAME_MAX];/*线程名称*/

rt_uint8_ttype;/*对象类型*/

rt_uint8_tflags;/*标志位*/

rt_list_tlist;/*对象链表*/

rt_list_ttlist;/*线程链表*/

/*stackpointandentry*/void*sp;/*栈指针*/

void*entry;/*线程入口函数指针*/

void*parameter;/*线程参数*/

void*stack_addr;/*栈地址*/

rt_uint32_tstack_size;/*栈大小*/

/*errorcode*/rt_err_terror;/*错误代码*/

rt_uint8_tstat;/*线程状态*/

/*priority*/rt_uint8_tcurrent_priority;/*线程当先优先级*/

rt_uint8_tinit_priority;/*线程初始化优先级*/

rt_ubase_tinit_tick;/*线程初始化计数值*/

rt_ubase_tremaining_tick;/*剩余计数值*/

structrt_timerthread_timer;/*内置定时器*/

void(*cleanup)(structrt_thread*tid);/*线程退出清除函数*/

rt_ubase_tuser_data;/*用户数据*/};typedefstructrt_thread*rt_thread_t;线程控制块线程句柄结构体:structrt_threadtid1;=“tid1”结构体指针:rt_thread_ttid2;tid2->name=“tid2”;8.2.2线程重要属性1.线程名称线程名称即线程的名字,由用户命名,命名规则遵循C语言变量命名规则,通常以字母开头,线程名称的最大长度由rtconfig.h中的宏RT_NAME_MAX指定,多余部分会被自动截掉,默认长度为8位。2.线程入口函数线程入口函数是线程实现预期功能的函数,线程的入口函数由用户设计实现,有无限循环和顺序执行或有限次循环两种模式,在创建线程或初始化线程时可以传入参数。8.2.2线程重要属性2.线程入口函数无限循环模式voidthread_entry(void*paramenter){while(1){/*等待事件的发生*//*对事件进行服务、进行处理*/}}顺序执行或有限次循环模式staticvoidthread_entry(void*parameter){/*处理事务#1*/…/*处理事务#2*/…/*处理事务#3*/}注意:调用延时函数或者主动挂起。注意:简单的顺序语句、dowhlie()或for()循环8.2.2线程重要属性3.线程栈RT-Thread线程具有独立的栈,当进行线程切换时,会将当前线程的上下文信息保存在栈中,当线程恢复运行时,再从栈中读取上下文信息,进行恢复。线程栈大小可根据实际情况设定,对于资源相对较大的MCU,可以适当设计较大的线程栈,对于资源较小的MUC可以在初始时设置较大的栈,如1K或2K字节,然后在FinSH中用list_thread命令查看线程运行过程中使用栈的大小,加上适当的余量形成最终的线程栈大小。8.2.2线程重要属性4.线程优先级线程的优先级表示线程被调度的优先程度,每个线程都具有优先级,应给重要的线程赋予较高的优先级,增大其被调度的可能。对于ARMCortex-M系列,普遍采用32个优先级。最低优先级默认分配给空闲线程(31),用户一般不使用。在系统中,当有比当前线程优先级更高的线程就绪时,当前线程将立刻被换出,高优先级线程抢占处理器运行。8.2.2线程重要属性5.时间片当线程优先级相同时,时间片才起作用,系统对优先级相同的就绪态线程采用时间片轮转算法进行调度,即线程轮转执行相应个系统节拍(1ms)。8.2.2线程重要属性6.线程状态对于单核MCU,同一时刻只允许运行一个线程,操作系统会自动根据线程运行的情况动态地调整线程状态。RT-Thread中线程共有五种状态。8.2.2线程重要属性6.线程状态对于单核MCU,同一时刻只允许运行一个线程,操作系统会自动根据线程运行的情况动态地调整线程状态。RT-Thread中线程共有五种状态。初始状态关闭状态就绪状态运行状态挂起状态创建启动获取资源得不到或者延时获取到资源,或者延时时间到自然结束强制结束(一般不用)8.2.2线程重要属性6.线程状态调用函数rt_thread_create/init创建/初始化的线程处于初始态;初始态线程调用函rt_thread_startup进入就绪态;就绪态线程被调度器调度后进入运行态;处于运行状态的线程调用rt_thread_delay,rt_sem_take,rt_mutex_take,rt_mb_recv等函数或者获取不到资源时,将进入挂起态;处于挂起态的线程等待超时依然未能获得资源或由于其它线程释放了资源,将返回就绪态。挂起态的线程调用rt_thread_delete/detach函数,将转换为关闭态;运行态的线程运行结束时,会在线程的最后部分执行函数rt_thread_exit,将状态改为关闭态。8.2.2线程重要属性7.错误代码/*线程错误代码*/#defineRT_EOK0/*无错误*/#defineRT_ERROR1/*普通错误*/#defineRT_ETIMEOUT2/*超时*/#defineRT_EFULL3/*资源已满*/#defineRT_EEMPTY4/*无资源*/#defineRT_ENOMEM5/*无内存*/#defineRT_ENOSYS6/*系统不支持*/#defineRT_EBUSY7/*系统忙*/#defineRT_EIO8/*IO错误*/#defineRT_EINTR9/*中断系统调用*/#defineRT_EINVAL10/*非法参数*/8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论