FreeRTOS+CubeMX编程实践
一.关于FreeRTOS
1.什么是FreeRTOS?
FreeRTOS是一个轻量级的操作系统。FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。 FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率FreeRTOS对系统任务的数量没有限制。
2.FreeRTOS有哪些优点?
(1)FreeRTOS和裸机程序的比较
采用中断和查询结合的方式可以解决大部分裸机应用,但随着工程的复杂,裸机方式的缺点就暴露出来了。
必须在中断 (ISR) 内处理时间关键运算 内处理时间关键运算 ,并且需要很长执行时间 。
FreeRTOS相对于裸机程序多了一个调度器,是一个多线程的系统,可以提高程序执行的实时性。
(2)FreeRTOS免费,开源。
(3)比较容易上手。
二.通过CubeMX配置RTOS
其它的不用配置,直接生成就可以。
在调试程序的时候,可以在NVIC里面调整各个任务的优先级。
三.写FreeRTOS代码
在编写任务代码之前,先找到头文件task.h中是怎样定义函数的。
下面的这个是FreeRTOS的任务函数,也是我们编写程序中最常用的,最重要的。(大概只用这一个函数程序就可以正常的跑起来了)
1 portBASE_TYPE xTaskCreate( 2 pdTASK_CODE pvTaskCode, //指向任务的实现函数的指针。效果上仅仅是函数名 3 const portCHAR * const pcNane,// 具有描述性的任务名。FreeRTOS不会使用它。 4 unsigned portSHORT usStackDepth,// 指定任务堆栈的大小 5 void *pvParameters, // 指针用于作为一个参数传向创建的任务 6 unsigned portBASE_TYPE uxPriority,//任务运行时的优先级 7 xTaskHandle *pvCreatedTask//用于传递任务的句柄,可以引用从而对任务进行其他操作。 8 )
说明:1.这里的任务是指一个永远不会退出的C函数,通常是一个死循环。
2.pcNane其 只 是 单 纯 地 用 于 辅 助 调 试 。 应 用 程 序 可 以 通 过 定 义 常 量config_MAX_TASK_NAME_LEN 来定义任务名的最大长度—— 包括’\0’结束符。如果传入的字符串长度超过了这个最大值,字符串将会自动被截断。
3.usStackDepth这个值指定的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。栈空间大小为usStackDepth*4(bytes)。
4.uxPriority优先级的取值范围可以从最低优先级0到最高优先级(configMAX_PRIORITIES–1)。
返回: 1.pdPASS 表明任务创建成功,准备运行。
2.errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 由于内存堆空间不足,FreeRTOS 无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。
然后将这个函数应用在keil的多文件编程之中。
在任务文件的末尾定义一个要实现的task函数,将FreeRTOS函数的调用在这个函数里面封装起来。
然后将自己定义的这个函数在freertos.c里面调用。