这个FreeRTOS的学习其实只有任务的定义与任务切换的实现这一张真正认真的看了,虽然没看懂,但是整体流程知道了,了解了哪些函数都是什么功能。在后面的章节都是对这一章节的优化,具体的优化细节其实我也不是太清楚是怎么实现的,大概的过了一遍,知道了FreeRTOS这个实时操作系统是什么和其相关的一些概念。然后就是昨天开始学习第二部分内核应用开发的第一章移植FreeRTOS到STM32。本来昨天就应该很快的把前三章过一遍的,但是我太容易分心了,在小红书上看到嵌入式开发的编程环境除了Keil还有可以使用VScode使用一些插件进行编程感觉VScode界面特别好看就去看VScode相关的东西,安装交叉编译链、GDB、Openocd,弄了一上午只可以进行编译还没法调试,这些东西现在还用不到,等以后有时间再重新弄一下写个博客。现在我的主要目标是学完FreeRTOS,实现相关项目。
目录
前言
本节内容是学习FreeRTOS的启动流程
1、FreeRTOS的两种启动方式
1.1、万事俱备,只欠东风
在main函数中将硬件初始化,RTOS系统初始化,所有的任务创建都弄好,只差最后一步启动RTOS调度器开始多任务的调度
1.2、小心翼翼,十分谨慎
在main函数中将硬件和RTOS系统先初始化好,然后创建一个启动任务后就启动调度器,然后在启动任务 里面创建各种应用任务,当所有任务都创建成功后,启动任务把自己删除
2、FreeRTOS的启动流程
在系统上电的时候第一个执行的是启动文件里面由汇编编写的复位函数Reset
_Handler。复位函数的最后会调用C库函数__main。__main函数的主要工作是初始化系统的堆和栈,最后调用C中的main函数。
2.1、创建任务xTaskCreate()函数
在main()函数中,可以直接对FreeRTOS进行创建任务操作,因为FreeRTOS会自动帮我们做初始化的事情,如初始化堆内存。
我们自己在main()函数中直接初始化板级外设——BSP_Init(),然后进行任务的创建——xTaskCreate(),在任务创建中,FreeRTOS会帮我们进行一系列的系统初始化,在创建任务的时候,会帮我们初始化堆内存。
2.2、vTaskStartScheduler()函数
在创建完任务的时候需要开启调度器,因为创建仅仅是把任务添加到系统中,还没真正调度,并且空闲任务也没有实现,定时器任务也没有实现,这些都是在开启调度函数中实现的。
3、main函数
在main函数中只是创建并启动一些任务和硬件初始化,而系统初始化这些工作不需要我们实现,因为FreeRTOS在我们使用创建与开启调度的时候就已经偷偷帮我们做完了,如果只是使用FreeRTOS的话无需关注FreeRTOS的API函数里面的实现过程 。
当创建的应用任务的优先级比 AppTaskCreate 任务的优先级高、低或者相等时候,程
序是如何执行的?假如像我们代码一样在临界区创建任务,任务只能在退出临界区的时候
才执行最高优先级任务。假如没使用临界区的话,就会分三种情况: 1、应用任务的优先级
比初始任务的优先级高,那创建完后立马去执行刚刚创建的应用任务,当应用任务被阻塞
时,继续回到初始任务被打断的地方继续往下执行,直到所有应用任务创建完成,最后初
始任务把自己删除,完成自己的使命; 2、应用任务的优先级与初始任务的优先级一样,那
创建完后根据任务的时间片来执行,直到所有应用任务创建完成,最后初始任务把自己删
除,完成自己的使命; 3、应用任务的优先级比初始任务的优先级低,那创建完后任务不会
被执行,如果还有应用任务紧接着创建应用任务,如果应用任务的优先级出现了比初始任
务高或者相等的情况,请参考 1 和 2 的处理方式,直到所有应用任务创建完成,最后初始
任务把自己删除,完成自己的使命。