FreeRTOS基础认识
第一章
1.1任务函数
任务的函数原型必须返回void,而且带有一个void指针参数。原型:
void ATaskFunction(void *pvParrameters);
FreeRTOS任务不允许以任何方式从实现函数中返回——它们绝不能有“return”语句,也不能执行到函数末尾。如果一个任务不再需要,可以vTaskDeltete()显式地将其删除。
1.2 xTaskCreate() API函数
pvTaskCode:一个指向任务的实现函数的指针(效果上仅仅是函数名)
pcName:具有描述性的任务名。
定义常量config_MAX_TASK_NAME_LEN来定义任务明的最大长度——包括”\0”结束符。
usStackDepth:任务分配多大的栈空间,指定的是栈空间可以保存多少个字(32位:1word = 4bytes)。栈的深度不能超过一个size_t类型变量所能表达的最大值。
定义常量configMINIMAL_STACK_SIZE来决定空闲任务人用的栈空间大小。
pvParameter:任务函数接收一个指向void的指针(void*),pvParaneters的值即是传递到任务中的值。
uxPriority:指定任务执行的优先级。优先级的取值范围可以从最低优先级0级到最高优先级(configMAX_PRIORITIES - 1)。
pxCreatedTask:用于传出任务的句柄。
pdTRUE:表示任务创建成功。
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:表示内存堆空间不足,FreeRTOS无法分配足够的空火箭来保存任务结构数据和任务堆栈。
1.3任务优先级
低优先级号表示任务的优先级低,优先级号0表示最低优先级。有效的优先级号范围从0到(configMAX_PRIORITIES - 1)
调度器保证总是在所有可运行的任务中选择具有最高优先级的任务,并使其进入运行态。
两个测试任务被创建在同一个优先级上,并且一直是可运行的。所以每个人物都执行一个”时间片”,任务在时间片起始时刻进入运行态,在时间片结束时刻又退出运行态。
左图t1与t2之间的时段就等于一个时间片。
时间片的长度通过心跳中断的频率进行设定,心跳中断频率由FreeRTOSConfig.h中的编译时配置常量configTICK_RATE_HZ进行配置。FreeRTOS API函数调用中指定的时间总是以心跳中断为单位。
1.4扩充“非运行态”
调度器总是选择所有能够进入运行态的任务中具有最高优先级的任务。
阻塞任务:如果一个任务正在等待某个事件,则称这个任务处于“阻塞态。”
任务可以进入阻塞态以等待一下两种不同类型的事件:
1.定时(时间相关)事件
2.同步事件——源于其它任务或中断的事件
挂起状态:一个任务进入挂起状态的唯一办法就是调用vTaskSuspend() API函数,把一个挂起状态的任务唤醒的唯一途径就是调用vTaskResume()或VTaskResumeFromISR() API函数
就绪状态:如果任务处于非运行状态,但既没有阻塞也没有挂起,则这个任务处于就绪状态。
void vTaskDelay(portTickType xTicksToDelay);
xTicksToDelay:延迟多少个心跳周期。调用该延迟函数的任务将进入阻塞态,经延迟指定的心跳周期数后,在转移到就绪态。
void vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement );
vTaskDelayUntil()的参数就是用来指定任务离开阻塞态进入就绪态那一刻的精确心跳计数值。
pxPreviousWakeTime:保存了任务上一次离开阻塞态的时刻,这个时刻被用作一个参考点来计算该任务下一次离开阻塞态的时刻。pxPreviousWakeTime指向的变量会在API函数vTaskDelayUntil()调用过程中自动更新。
xTimeIncrement:实现某个任务以固定频率周期性执行
1.5空闲任务与空闲任务钩子函数
空闲任务拥有最低优先级(优先级0)以保证其不会妨碍具有更高优先级的应用任务进入运行态。
空闲钩子函数:通过空闲任务钩子函数,可以直接在空闲任务中添加应用程序相关的功能,
通常空闲任务钩子函数被用于:
·执行低优先级,后台或需要不停处理的功能代码
·测试系统处理裕量
·将处理器配置到低功耗模式
空闲任务钩子函数的实现限制:
绝不能阻或挂起
如果应用程序用到了vTaskDelete() API函数,则空闲钩子函数必须尽快返回。
定义一个空闲任务钩子函数:
void vApplicationIdleHook( void );
FreeRTOSConfig.h中的配置常量configUSE_IDLE_HOOK必须定义为1,这样空闲任务钩子函数才会被调用。
1.6改变任务优先级
vTaskPrioritySet() API函数:用于在调度器启动后改变人和任务的优先级
void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority );
pxTask:被修改优先级的任务句柄
uxNewPriority:目标任务将被设置到那个优先级上。如果设置的值超过了最大可用优先级(configMAX_PRIORITIES - 1),则会被自动封顶为最大值
uxTaskPriorityGet() API函数:用于查询一个任务的优先级
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
1.7删除任务
vTaskDelete() API函数
void vTaskDelete( xTaskHandle pxTaskToDelete );
pxTaskToDelete:被删除任务的句柄
1.8调度算法
优先级抢占式调度
所谓“固定优先级”是指每个任务都被赋予了一个优先级,这个优先级不能被内核本身改变。“抢占式”是指当人物进就绪态被改变时,如果处于运行态的任务优先级更低,则该任务总是抢占当前任务的任务。
选择任务优先级
单调速率优先级,根据任务周期性执行的速率来分配一个唯一的优先级。具有最高执行频率的任务赋予高最优先级;具有最低周期执行频率的任务赋予最低优先级。
协作调度
只可能在运行态任务进入阻塞态或是运行任务显式taskYIELD()时,才会进行上下文切换。任务永远不会被抢占,而具有相同优先级的任务也不会自动共享处理器时间。
FreeRTOS基础认识相关推荐
- FreeRTOS基础以及UIP之协程--C语言剑走偏锋
在FreeRTOS中和UIP中,都使用到了一种C语言实现的多任务计数,专业的定义叫做协程(coroutine),顾名思义,这是一种协作的例程, 跟具有操作系统概念的线程不一样,协程是在用户空间利用程序 ...
- FreeRTOS基础(二):STM32G4系列运行FreeRTOS驱动8路PWM波控制多个路舵机
一.TIM2和TIM3配置,基于STM32CubeMX HCLK主时钟配置成72MHz 二.8路PWM初始化配置,50Hz PWM输出 注意:添加启动命令 /* TIM2 init function ...
- FreeRTOS及其应用,万字长文,基础入门
嵌入式系统不只是ARM+Linux,不是只有安卓,凡是电子产品都可称为嵌入式系统.物联网行业的兴起,也提升了FreeRTOS市场占有率.本文就是介绍FreeRTOS基础及其应用,只是个人整理,可能存在 ...
- freeRTOSConfig.h文件对FreeRTOS进行系统配置
FreeRTOS内核是高度可定制的,使用配置文件FreeRTOSConfig.h进行定制.每个FreeRTOS应用都必须包含这个头文件,用户根据实际应用来裁剪定制FreeRTOS内核.这个配置文件是针 ...
- 【STM32】FreeRTOS系统配置
00. 目录 文章目录 00. 目录 01. 概述 02. FreeRTOS配置文件 03. INCLUDE开始的宏 04. config开始的宏 05. 其它 06. 附录 07. 参考 01. 概 ...
- 2.STM32F407ZGT6 学习笔记-移植 FreeRTOS
程序移植的代码: https://gitee.com/chejia12/free-rtos_-f407.git 1. 在工程下建议FreeRTOS文件夹 2. 在FreeRTOS文件夹下建立 src ...
- FM33LC02X FreeRTOS MDK 移植记录总结
文章目录 Demo下载 1.获取FreeRTOS源码 2.代码移植 3.工程配置 4.修错改错 5.中断链接 6.运行代码 7.使用案例 8.后续调试 8.1 OS vTaskDelay延时函数不准问 ...
- FreeRTOS——静态与动态内存分配
FreeRTOS 基础系列文章 基本对象 FreeRTOS--任务 FreeRTOS--队列 FreeRTOS--信号量 FreeRTOS--互斥量 FreeRTOS--任务通知 ...
- FreeRTOS之freeconfig.c(S32k144)
#ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H#include "sys.h" #include "usart.h ...
- FreeRTOS——软件计时器
FreeRTOS 基础系列文章 基本对象 FreeRTOS--任务 FreeRTOS--队列 FreeRTOS--信号量 FreeRTOS--互斥量 FreeRTOS--任务通知 ...
最新文章
- java中hashcode_浅谈Java中的Hash值
- 从搞笑到高效,构建敏捷团队的基础原则
- 消息确认机制---confirm异步
- iis worker process内存占用大_安卓模拟器磁盘空间占用大/内存空间不足
- 基于Kubernetes 构建.NET Core 的技术体系
- java学习(121):treeset排序集合
- 怎样设置 vmware 开放一个网络端口,使网络上的电脑能访问这个端口
- Error: EBUSY: resource busy or locked, lstat ‘D:\DumpStack.log.---基于Vue的uniapp手机端_前端UI_uview工作笔记004
- 深度学习 检测异常_深度学习用于异常检测:全面调查
- 如何在Linux上安装Oracle客户端连接工具sqlplus
- python写群管机器人_python使用群机器人发送群消息
- STM32自学笔记-8-红外遥控
- rsync简介及部署
- vue中当图片地址无效的时候,显示默认图片
- 住房公积金约定提取业务问答
- Chrome下载危险文件拦截手动绕过
- lightroom 闪退_微信QQ一碰就闪退,别人永远看不了你的隐私~
- Criteria使用指南
- 关于如何在idea中设置文档注释模板
- Chatbot是什么?chatbot平台有哪些?有什么AI chatbots推荐?SaleSmartly chatbot助力独立站运营