一、基础概念
任务是基本概念熟能生巧 采用问答式复习 1、什么是多任务系统?
同时创建几个任务,分配堆栈空间,设置抢占优先级,优先级越高在单核系统下,CPU使用执行优先
2、任务执行状态
运行态、阻塞态、就绪态、挂起态
3、任务优先级
优先级数字越低表示任务的优先级越低,0 的优先级最低,configMAX_PRIORITIES-1 的优先级最高。空闲任务的优先级最低,为0。
4、任务实现 函数命名,循环体,需要任务切换API,不能中途下车
(1)、任务函数本质也是函数,所以肯定有任务名什么的,不过这里我们要注意:任务函数的返回类型一定要为 void 类型,也就是无返回值,而且任务的参数也是 void 指针类型的!任务 函数名可以根据实际情况定义。 (2)、任务的具体执行过程是一个大循环,for(; ; )就代表一个循环,作用和 while(1)一样,笔者习惯用 while(1)。 (3)、循环里面就是真正的任务代码了,此任务具体要干的活就在这里实现! (4)、FreeRTOS 的延时函数,此处不一定要用延时函数,其他只要能让 FreeRTOS 发生任务切换的 API 函数都可以,比如请求信号量、队列等,甚至直接调用任务调度器。只不过最常用的就是 FreeRTOS 的延时函数。 (5)、任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用函数 vTaskDelete(NULL)删除此任务!FreeRTOS 的任务函数和 UCOS 的任务函数模式基本同的,不止 FreeRTOS,其他 RTOS的任务函数基本也是这种方式的。
5、任务挂起或者就绪
只是暂停或者继续执行任务
6、任务延时函数使用的重要性 交出CPU使用的控制权、达到阻塞的效果,不然低优先级任务无法使用
vTaskDelay()在我们任务中用得非常之多,每个任务都必须是死循环,并且是必须要有阻塞的情况,否则低优先级的任务就无法被运行了。要想使用 FreeRTOS 中的 vTaskDelay() 函数必须在 FreeRTOSConfig.h 中把 INCLUDE_vTaskDelay 定义为 1 来使能。
二、运行机制
创建开始任务–进入临界区–创建任务1、创建任务2····–删除开始任务–退出临界区–然后在mian中开启任务调度。
然后就开始来回切换任务了
简单的总结分析一下此例程的流程,因为这是我们使用 FreeRTOS 写的第一个程序,很多习惯是我们后面要用到的。比如使用任务宏定义任务优先级,堆栈大小等,一般有关一个任务的东西我们的放到一起,比如任务堆栈、任务句柄、任务函数声明等,这样方便修改。这些东西可以放到一个.h 头文件里面去,只是例程里面任务数比较少,所以就直接放到 main.c 文件里面了,要是工程比较大的话最好做一个专用的头文件来管理。 在 main 函数中一开始肯定是初始化各种硬件外设,初始化完外设以后调用函数xTaskCreate()创建一个开始任务,注意创建开始任务是在调用函数 vTaskStartScheduler()开启任务调度器之前,这样当后面开启任务调度器以后就会直接运行开始任务了。其他任务的创建就放到开始任务的任务函数中,由于开始任务的职责就是创建其他应用任务和信号量、队列等这些内核对象的,所以它只需要执行一次,当这些东西创建完成以后就可以删除掉开始任务了。看过我们的 UCOS 教程的话就会发现这个过程和 UCOS 里面一样的。
三、任务设计要点
作为一个嵌入式开发人员,要对自己设计的嵌入式系统要了如指掌,任务的优先级信息,任务与中断的处理,任务的运行时间、逻辑、状态等都要知道,才能设计出好的系统,所以,在设计的时候需要根据需求制定框架。在设计之初就应该考虑下面几点因素:任务运行的上下文环境、任务的执行时间合理设计。 FreeRTOS 中程序运行的上下文包括: ? 中断服务函数。 ? 普通任务。 ? 空闲任务。
- 中断服务函数:
不能出现阻塞 - 任务:
优先级,堆栈的设置 - 空闲任务:
调度器自动创建,一般处理系统的运行指示、低功耗 - 任务的执行时间:
注意实际任务的运行时间与响应时间 这些东西得靠实战经验进行积累学习
四、实验代码分析
|