完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
相关推荐
|
|
|
7.1 单任务系统
学习多任务系统之前,我们先来回顾下单任务系统的编程框架,即裸机时的编程框架。裸机编程主要是采用超级循环(super-loops)系统,又称前后台系统。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看做后台行为,中断服务程序处理异步事件,这部分可以看做是前台行为。后台也可以叫做任务级,前台也叫作中断级。 图7.1 单任务系统 对于前后台系统的编程思路主要有以下两种方式: |
|
|
|
|
|
|
|
|
7.1.1 查询方式
对于一些简单的应用,处理器可以查询数据或者消息是否就绪,就绪后进行处理,然后再等待,如此循环下去。对于简单的任务,这种方式简单易处理。但大多数情况下,需要处理多个接口数据或者消息,那就需要多次处理,如下面的流程图所示: 用查询方式处理简单的应用,效果比较好,但是随着工程的复杂,采用查询方式实现的工程就变的很难维护,同时,由于无法定义查询任务的优先级,这种查询方式会使得重要的接口消息得不到及时响应。比如程序一直在等待一个非紧急消息就绪,如果这个消息后面还有一个紧急的消息需要处理,那么就会使得紧急消息长时间得不到执行。 |
|
|
|
|
|
|
|
|
7.1.2 中断方式
对于查询方式无法有效执行紧急任务的情况,采用中断方式就有效的解决了这个问题,下面是中断方式简单的流程图: 采用中断和查询结合的方式可以解决大部分裸机应用,但随着工程的复杂,裸机方式的缺点就暴露出来了 |
|
|
|
|
|
|
|
|
必须在中断(ISR)内处理时间关键运算:
l ISR 函数变得非常复杂,并且需要很长执行时间。 l ISR 嵌套可能产生不可预测的执行时间和堆栈需求。 u 超级循环和ISR之间的数据交换是通过全局共享变量进行的: l 应用程序的程序员必须确保数据一致性。 u 超级循环可以与系统计时器轻松同步,但: l 如果系统需要多种不同的周期时间,则会很难实现。 l 超过超级循环周期的耗时函数需要做拆分。 l 增加软件开销,应用程序难以理解。 u 超级循环使得应用程序变得非常复杂,因此难以扩展: l 一个简单的更改就可能产生不可预测的副作用,对这种副作用进行分析非常耗时。 l 超级循环 概念的这些缺点可以通过使用实时操作系统 (RTOS) 来解决。 |
|
|
|
|
|
|
|
|
多任务系统或者说RTOS的实现,重点就在这个调度器上,而调度器的作用就是使用相关的调度算法来决定当前需要执行的任务。如上图所画的那样,创建了任务并完成OS初始化后,就可以通过调度器来决定任务A,任务B和任务C的运行,从而实现多任务系统。另外需要初学者注意的是,这里所说的多任务系统同一时刻只能有一个任务可以运行,只是通过调度器的决策,看起来像所有任务同时运行一样。为了更好的说明这个问题,再举一个详细的运行例子,运行条件如下:
u 使用抢占式调度器。 u 1个空闲任务,优先级最低。 u 2个应用任务,一个高优先级和一个低优先级,优先级都比空闲任务优先级高。 u 中断服务程序,含USB中断,串口中断和系统滴答定时器中断。 下图7.2所示是任务的运行过程,其中横坐标是任务优先级由低到高排列,纵坐标是运行时间,时间刻度有小到大。 图7.2 多任务系统运行过程 |
|
|
|
|
|
|
|
|
(1) 启动RTOS,首先执行高优先级任务。
(2) 高优先级任务等待事件标志(os_evt_wait_and)被挂起,低优先级任务得到执行。 (3) 低优先级任务执行的过程中产生USB中断,进入USB中断服务程序。 (4) 退出USB中断复位程序,回到低优先级任务继续执行。 (5) 低优先级任务执行过程中产生串口接收中断,进入串口接收中断服务程序。 (6) 退出串口接收中断复位程序,并发送事件标志设置消息(isr_evt_set),被挂起的高优先级任务就会重新进入就绪状态,这个时候高优先级任务和低优先级任务都在就绪态,基于优先级的调度器就会让高优先级的任务先执行,所有此时就会进入高优先级任务。 (7) 高优先级任务由于等待事件标志(os_evt_wait_and)会再次被挂起,低优先级任务开始继续执行。 (8) 低优先级任务调用函数os_dly_wait,低优先级任务被挂起,从而空闲任务得到执行。 (9) 空闲任务执行期间发生滴答定时器中断,进入滴答定时器中断服务程序。 (10) 退出滴答定时器中断,由于低优先级任务延时时间到,低优先级任务继续执行。 (11) 低优先级任务再次调用延迟函数os_dly_wait,低优先级任务被挂起,从而切换到空闲任务。空闲任务得到执行。 通过上面实例的讲解,大家应该对多任务系统完整的运行过程有了一个全面的认识。随着教程后面对调度器,任务切换等知识点的讲解,大家会对这个运行过程有更深刻的理解。 |
|
|
|
|
|
|
|
|
RTX就是一款支持多任务运行的实时操作系统,具有时间片,抢占式和合作式三种调度方法。通过RTX实时操作系统可以将程序函数分成独立的任务,并为其提供合理的调度方式。同时RTX实时操作系统为多任务的执行提供了以下重要优势:
u 任务调度 - 任务在需要时进行调用,从而确保了更好的程序执行和事件响应。 u 多任务 - 任务调度会产生同时执行多个任务的效果。 u 确定性的行为 - 在定义的时间内处理事件和中断。 u 更短的 ISR - 实现更加确定的中断行为。 u 任务间通信 - 管理多个任务之间的数据、内存和硬件资源共享。 u 定义的堆栈使用 - 每个任务分配一个堆栈空间,从而实现可预测的内存使用。 u 系统管理 - 可以专注于应用程序开发而不是资源管理。 图7.3RTX中任务通信 |
|
|
|
|
|
|
|
|
7.3 任务设置
RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图7.4所示的工程配置向导: 图7.4RTX配置向导 |
|
|
|
|
|
|
|
|
用于任务配置的主要是如下两个参数:
l Number of concurrent running tasks 参数范围0 – 250 表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。 l Number of tasks with user-providedstack 参数范围0 – 250 表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task statck size大小。比如: Numberof concurrent running tasks = 6 Numberof tasks with user-provided stack = 0 表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task statck size大小的任务堆栈空间。 Numberof concurrent running tasks = 6 Numberof tasks with user-provided stack = 3 表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task statck size大小的任务堆栈空间。 |
|
|
|
|
|
|
|
|
7.4 任务栈设置
不管是裸机编程还是RTOS编程,栈的分配大小都非常重要。局部变量,函数调时现场保护和返回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃。 裸机的情况下,用户可以在这里配置栈大小: u STM32F103工程中栈大小的配置文件 |
|
|
|
|
|
|
|
|
不同于裸机编程,在RTOS下,每个任务都有自己的栈空间。任务的栈大小可以在配置向导中通过如下参数进行配置:
需要大家注意的是,默认情况下用户创建的任务栈大小是由参数Task stack size决定的。如果觉得每个任务都分配同样大小的栈空间不方便的话,可以采用自定义任务栈的方式创建任务。采用自定义方式更灵活些。 实际应用中给任务开辟多大的堆栈空间合适呢,这时可以事先给任务开辟一个稍大些的堆栈空间,然后通过第三章3.4小节中介绍的RTX调试方法可以显示任务栈的使用情况,从而调试实际给任务开辟多大的栈空间比较合适。 RTX的任务切换和中断嵌套对栈空间的影响,待我们讲解RTX的任务切换和双堆栈指针章节(此章节在后期RTX教程升级版本时再配套)时再细说。这部分知识点也非常重要,对于初学者,先搞懂这里讲解的知识点即可。 |
|
|
|
|
|
|
|
|
7.5 系统栈设置
上面跟大家讲解了什么是任务栈,这里的系统栈又是什么呢?裸机的情况下,凡是用到栈空间的地方都是用的这里配置的栈空间: u STM32F103工程中栈大小的配置文件 |
|
|
|
|
|
|
|
112 浏览 0 评论
219 浏览 0 评论
721 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
702 浏览 0 评论
有人有STM8H1K08T连接TM1650的源码吗,可以直接使用的那种,我的代码在烧录之后数码管一直处于熄灭状态
1036 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16965 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-9 23:53 , Processed in 1.260799 second(s), Total 101, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖