系统运行时,全局变量放在哪里?子函数调用时,局部变量放在哪里?中断发生时函数的返回地址放在哪里???
栈是单片机RAM中一段连续的内存空间 栈的大小一般在启动文件或者连接脚本中指定,最后由C库函数 __main进行初始化
在多任务中每个任务都是独立的互不干扰的,所以每个任务都分配独立的栈空间,这个栈空间通常是
一个预先定义好的全局数组,也可以是动态分配的一段内存空间 ,都存在与RAM .
vTaskStartScheduler创建空闲任务
空闲任务是系统在启动任务调度器时创建的优先级最低的任务 空闲任务的主题主要是做一些系统内存的清理 在实际应用中可以让空闲任务让单片机进入休眠或者低功耗操作
空闲任务的堆栈是一个定义好的数组 大小由FreeRTOSConfig.h中定义的宏connfigMINIMAL_STACK_SIZE控制
空闲任务的任务控制块,是一个全局变量
任务栈其实就是一个预先定义好的全局数据,数据类型wei StackType_t ,大小由TASK1_STACK_SIZE这个
宏来定义,默认为128,单位为字即512个字节 ·
任务是一个独立的函数,函数主题无限循环且不能返回
在裸机系统中,程序的主题是CPU按照顺序执行的,在多任务系统中任务的执行是靠系统调度的
系统为了顺利调度任务,为每个任务都额外定义了一个任务控制块,任务控制块相当于任务的身份证
里面存储任务的所有信息,任务的栈指针 任务的名称,任务形参,系统对任务的全部操作 都可以通过这个任务控制块来实现
typedef struct tskTaskControlBlock
{
}tskTCB
typedef tskTCB TCB_t;
xTaskCreateStatic()
任务的创建分为两种,一种是动态创建一种是静态创建。动态创建时,任务控制块和内存是创建任务时动态分配的,任务删除时
内存释放,静态创建时,任务控制块的栈和内存需要事先定义好,是静态的内存,任务删除时内存不能释放
configSUPPORT_STATIC_ALLOCATION在FreeRTOSConfig.h中定义
任务句柄用来指向任务的TCB任务句柄的数据类型为TaskHandle_t
就绪列表
任务创建好之后,我们需要把任务添加到就绪列表中,表示任务已经就绪,系统随时都可以调度。
就绪列表实际上就是一个LIST_t类型的数组,数组的大小由决定最大任务优先级的宏定义configMAX_PRIORITES确定,configMAX_PRIORITES在FreeRTOSConfig.h中默认为5最大支持256个优先级,数组的下标对应任务的优先级,同一优先级的任务统一插入到就绪列表的同意链表中
将任务插入到就绪列表中就是通过将任务控制块的xStatieListItem节点插入到就绪列表中来实现·
任务调度器是操作系统的核心,其主要任务是实现任务的切换,技术从就绪列表中找到优先级最高的任务,然后执行该任务
vTaskStartScheduler
调度器启动函数