FreeRTOS 学习记录2

    技术2022-07-12  67

    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 //

                 

    2操作系统多任务基础

    2.1 多任务基础知识

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

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

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

                                                  

    任务状态:

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

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

                                                   

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

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

    任务优先级

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

                                                      

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

    任务的实现

    void StartDefaulTask(void const * argument) { for(;;) { osDelay(10); } } 函数的参数作用,参数可以让任务执行在不同的工作模式,比如命令行解释,通过传参数方式实现。

                                          

                                                                                      任务的实现

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

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

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

     

    2.2 任务创建应用

    2.3 任务挂起和恢复应用

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

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

     

    Processed: 0.011, SQL: 10