FreeRTOS 学习记录2

1 FreeRTOS配置文件详解

作用:裁剪系统的功能。FreeRTOS 提供丰富的组件和功能,为了适应资源内存不同的处理器,所以要裁剪一些系统功能。

1.1  FreeRTOS与内核配置相关

通过宏的方式来操作,类似寄存器的操作。

 uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */


#define configUSE_PREEMPTION					1                       //1使用抢占式内核,0使用协程
#define configUSE_TIME_SLICING					1						//1使能时间片调度(默认式使能的)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION	1                       //1启用特殊方法来选择下一个要运行的任务
                                                                        //一般是硬件计算前导零指令,如果所使用的
                                                                        //MCU没有这些硬件指令的话此宏应该设置为0!
#define configUSE_TICKLESS_IDLE					0                       //1启用低功耗tickless模式
#define configUSE_QUEUE_SETS					1                       //为1时启用队列
#define configCPU_CLOCK_HZ						(SystemCoreClock)       //CPU频率,单位Hz
#define configTICK_RATE_HZ						(1000)                  //系统时钟节拍频率(系统调度的周期),这里设置为1000,周期就是1ms
#define configMAX_PRIORITIES					(32)                    //可使用的最大优先级,用于抢占式任务来排个优先级
#define configMINIMAL_STACK_SIZE				((unsigned short)130)   //空闲任务使用的堆栈大小
#define configMAX_TASK_NAME_LEN					(16)                    //任务名字字符串长度,太大的话关系到内存使用利用率

#define configUSE_16_BIT_TICKS					0                       //系统节拍计数器变量数据类型,
                                                                        //1表示为16位无符号整形,0表示为32位无符号整形
#define configIDLE_SHOULD_YIELD					1                       //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务
#define configUSE_TASK_NOTIFICATIONS            1                       //为1时开启任务通知功能,包括信号量,事件标志组和消息邮箱,默认开启
#define configUSE_MUTEXES						1                       //为1时使用互斥信号量
#define configQUEUE_REGISTRY_SIZE				8                       //不为0时表示启用队列记录,具体的值是可以
                                                                        //记录的队列和信号量最大数目。
#define configCHECK_FOR_STACK_OVERFLOW			0                       //大于0时启用堆栈溢出检测功能,如果使用此功能
                                                                        //用户必须提供一个栈溢出钩子函数,如果使用的话
                                                                        //此值可以为1或者2,因为有两种栈溢出检测方法。
#define configUSE_RECURSIVE_MUTEXES				1                       //为1时使用递归互斥信号量
#define configUSE_MALLOC_FAILED_HOOK			0                       //1使用内存申请失败钩子函数
#define configUSE_APPLICATION_TASK_TAG			0                       
#define configUSE_COUNTING_SEMAPHORES			1                       //为1时使用计数信号量

1.2  FreeRTOS与内存申请有关配置选项 

嵌入式系统玩的就是内存,我们定义一个大数组,长度为configTOTAL_HEAP_size,FreeRTOS 通过算法对大数组管理分配使用回收。根据处理器内存大小分配合理的内存给操作系统。

#define configSUPPORT_DYNAMIC_ALLOCATION        1                       //支持动态内存申请模式
#define configSUPPORT_STATIC_ALLOCATION			1						//支持静态内存模式
#define configTOTAL_HEAP_SIZE					((size_t)(20*1024))     //系统所有总的堆大小

1.3 FreeRTOS与中断有关的配置选项 

这个中断配置是操作系统任务调度的核心,操作系统的入口是中断。

#ifdef __NVIC_PRIO_BITS
	#define configPRIO_BITS       		__NVIC_PRIO_BITS
#else
	#define configPRIO_BITS       		4                  
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15                      //中断最低优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5                       //受Free RTOS系统可管理的最高中断优先级
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

:此宏定义是用来配置FreeRTOS用到的SysTick中断和PendSV中断的优先级。在NVIC分组设置为4的情况下,此宏定义的范围就是0-15, 即专门配置抢占优先级。这里配置为了0x0f,即SysTick和PendsV都是配置为了最低优先级,实际项目中也建议大家配置最低优先级即可。

1.4  FreeRTOS可选函数配置选项

注意使用相关函数时要使能,宏配置为1.

#define INCLUDE_xTaskGetSchedulerState          1   //获取调度器状态                    
#define INCLUDE_vTaskPrioritySet                1   //设置任务优先级
#define INCLUDE_uxTaskPriorityGet               1   //获取任务优先级
#define INCLUDE_vTaskDelete                     1   //任务删除
#define INCLUDE_vTaskCleanUpResources           1   //清理任务资源
#define INCLUDE_vTaskSuspend                    1   //任务挂起
#define INCLUDE_vTaskDelayUntil                 1   //任务绝对延时
#define INCLUDE_vTaskDelay                      1   //任务延时
#define INCLUDE_eTaskGetState                   1   //获取调度器状态
#define INCLUDE_xTimerPendFunctionCall          1   //

             FreeRTOS 学习记录2_第1张图片

2操作系统多任务基础

2.1 多任务基础知识

了解多任务特性,多任务实现,任务堆栈详解

任务调度机制有时间片轮询和抢占模式。抢占模式中优先级数量的多的话,抢占逻辑就会多,上下文保存所占用的内存就多,内存是有限的。

任务特性:使用简单,编程简单。任务创建数量没有限制(内存够大)。高优先级可以抢占低优先级。任务支持优先级排序。任务切换时,需要保存CPU运行环境(每个任务有独立的堆栈)。

                                              FreeRTOS 学习记录2_第2张图片

任务状态:

任何时刻只有一个任务抢占CPU的使用权,即处于运行态。

挂起态:任务挂起,无法参加抢占式和时间片任务调度,完全脱离我们的调度器,不会参与调度的。

                                               FreeRTOS 学习记录2_第3张图片

就绪态:任务等待被执行,等待抢占CPU的使用权。

阻塞态:一些资源没有获得,阻塞在那里。系统中的任务大部分时间处于阻塞态,像任务中调用系统延时函数,等待资源等。

任务优先级

在Free RTOS中优先级编号越大优先级越高。

                                                  FreeRTOS 学习记录2_第4张图片

空闲任务优先级最低为0,低优先级任务用时间片调度(像定时点灯任务,定时采集数据);高优先级任务必须是阻塞程序(像按键检测,输入要立马去执行的任务),若高优先级任务不加阻塞,低任务就没有机会去执行。

任务的实现

void StartDefaulTask(void const * argument)
{
    for(;;)
    {
        osDelay(10);
    }

}
函数的参数作用,参数可以让任务执行在不同的工作模式,比如命令行解释,通过传参数方式实现。

                                      FreeRTOS 学习记录2_第5张图片

                                                                                  任务的实现

任务控制块:描述任务属性的结构体,包括任务堆栈信息、任务调度信息、任务创建信息、任务通知信息、任务互斥信息、任务调试信息。

任务堆栈:保存现场(CPU寄存器、局部变量),堆栈单位分配以四个字节为单位。堆栈大小(每个任务都需要自己的空间,应用不同,每个任务需要的栈大小也不同)。

堆栈大小的确定:函数嵌套(函数局部变量、函数形参、函数返回地址、函数内部状态值),任务切换(所有的寄存器都需要入任务栈,进入中断以后寄存器入栈和嵌入式嵌套都是用的系统栈)

 

2.2 任务创建应用

2.3 任务挂起和恢复应用

2.4 任务创建和删除实现原理

2.5 任务挂起和恢复实现原理

 

你可能感兴趣的:(Free,RTOS)