FreeRTOS解析:List_freertos list.c vlistinitialise 崩溃-CSDN博客
写的很好!
内容有:
1.链表list_t/链表项listItem结构体分析,包括演示图解析,一目了然。还有一些细节补充。
链表初始化,插入,删除,遍历
2.任务tcb_t
任务tcb_t结构体(状态链表),任务创建,任务删除,任务切换,任务调度器的启动与结束
3.应用程序内存管理(heap_x.c)
内存管理包括:内核内存管理,应用程序内存管理
内核内存管理:每次在创建任务、队列或其他 RTOS 对象时,RTOS 内核都需要 RAM
应用程序内存管理:当应用程序需要内存时,可以从 FreeRTOS 堆进行分配
Freertos启动流程:
1.初始化中断向量表,初始化C语言环境(初始化堆栈),进main函数。
初始化堆栈指针 SP=_initial_sp,初始化 PC 指针=Reset_Handler
初始化中断向量表
配置系统时钟
初始化C语言环境(初始化堆栈)
调用 C 库函数__main
2.main()中初始化硬件设备和系统。创建所有任务。
我们自己在 main()函数中直接初始化我们的硬件外设,然后进行任务的创建即xTaskCreate(),在任务创建中,FreeRTOS 会帮我们进行一系列的系统初始化,在创建任务的时候,会帮我们初始化堆内存
3.开启任务调度器vTaskStartScheduler()函数
创建空闲任务,创建定时器服务任务,关闭中断,设置调度器运行为pdTRUE,表示调度器正在运行
- vTaskStartScheduler()?在创建完任务的时候,我们需要开启调度器,因为创建仅仅是把任务添加到系统中,还没真正调度,并且空闲任务也没实现,定时器任务也没实现,这些都是在开启调度函vTaskStartScheduler()中实现的。
- 为什么要空闲任务?因为 FreeRTOS 一旦启动,就必须要保证系统中每时每刻都有一个任务处于运行态(Runing),并且空闲任务不可以被挂起与删除。空闲任务的优先级是最低的,以便系统中其他任务能随时抢占空闲任务的 CPU 使用权。空闲任务还具有删除任务资源的功能。