freertos是一个可裁剪的小型rtos系统,特点:
- 支持抢占式,合作式和时间片调度
- saferos衍生自freertos,更完整
- 提供了一个用于低功耗的tickless模式
- 系统的组件在创建时可以选择动态或者静态的ram,例如任务,消息队列,信号量等等
- 支持Corex-M系列MPU单元
- 小巧简单,通常其内核占用4k-9k字节的空间
- 高可移植性,主要由C语言编写
- 支持实时任务和协程
- 堆栈溢出检测
- 创新时间组
- 高效软件定时器
freertos编程风格(学习操作系统前了解风格有助于阅读源码)
新定义的数据类型:
变量名命名:
如char型变量前缀是c,short型变量前缀是s,long型变量前缀是l,portBASE_TYPE类型变量前缀是x。其他例如数据结构,任务句柄,队列句柄等定义的变量名前缀也是x。
无符号型变量前缀加u,指针变量前缀加p,例如定义一个无符号char类型变量前缀会加uc,定义一个char类型指针变量时加前缀pc
函数名命名:
如果是私有的函数会加prv(private)前缀,从函数名可以看出他的返回值,定义文件名,和函数功能,例如vTaskPrioritySet()函数的返回值为v,在task.c这个文件中定义。
宏定义命名:
在宏定义名加小写字母前缀表明此定义所在的文件,例如port前缀在portable的h文件中,task前缀在task的h文件中,pd前缀在projdefs的h文件中,config前缀在FreeRTOSConfig的h文件中。
此外注意一些固定的宏:pdTRUE值为1,pdFALSE值为0,pdPASS值为1,pdFAIL值为0。
源码文件介绍:
FreeRTOS:Demo里是官方为各大芯片厂商写好的移植系统文件,极具参考价值。License里面是各种许可信息。Source里面源文件头文件include都是适用的,需要移植的C文件在portable文件里面,这里有不同的环境,内核该用的文件。Keil,GCC,IAR等等环境,RVDS是不同内核文件,主要是连接软硬件的接口文件。Memmarg是内存管理方式,推荐用heap4。
移植过程:
基础工程-》建文件夹freertos放系统文件源码,全部拷贝进来-》删掉portable中不需要的文件,例如keil里移植到stm32就只需要Keil,Memmarg,RVDS-》单击三色块,工程组添加freeRTOS_port和freeRTOS_core,前者添加内存管理文件Memmarg和接口文件RVDS(port文件),后者添加Source里面除了文件夹的所有源文件-》指定头文件路径:单击魔术棒选择c/c++,添加inclue和RVDS中的头文件-》编译检查错误-》将Demo里的或者已有的FreeRTOSconfig文件复制到工程头文件中-》编译检查错误:与中断相关的俩函数重复了,需要注释掉上面的空函数108和120行左右(图一)-》替换延时函数systick文件(->需要编写systick_Handler函数中的心跳函数先判断系统状态(图二))
图1(在stm32f10x_it.c文件里面)
图2
操作系统的时钟源是滴答定时器,在systick_init里根据芯片时钟初始化操作系统的时钟。基础实验里滴答定时器是APBH的八分频,也就是9MHz,这里要改为72MHz。一个微妙延时函数,两个毫秒延时函数其中ms要引发任务调度,xms不引发任务调度。(普中嗨小易P11)
移植过程常见错误:
- 直接复制工程,芯片型号错误
- 中断函数重定义
- SysTick_Handler函数未实现
- 在option里面未勾选use microlib选项
- 未添加头文件路径
任务延时
上:使用了freertos的延时,会引发任务调度
下:不会引起任务调度