登录发现更多内容
首页
分类
发帖
账号
自动登录
找回密码
密码
登录
立即注册
立即登录
立即注册
其他登录
QQ
微信
首页
Portal
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
产品教程
BBS
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
开发资料
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
样品购买
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
IoT云平台
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
GitHub
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
技术博客
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
搜索
搜索
热搜:
LoRa
ESP8266
安信可
本版
帖子
用户
请
登录
后使用快捷导航
没有账号?
立即注册
每日签到
任务
广播
导读
排行榜
设置
我的收藏
退出
6
1
1
首页
技术杂谈
›
Ai-M61-32S AP 配网学习 之 FreeRTOS任务
返回列表
Ai-M61-32S AP 配网学习 之 FreeRTOS任务
[ 复制链接 ]
发布帖子
WT_0213
论坛元老
132
主题
1969
回帖
1万
积分
论坛元老
勤劳的打工人
论坛元老, 积分 19001, 距离下一级还需 9980998 积分
论坛元老, 积分 19001, 距离下一级还需 9980998 积分
积分
19001
私信
6人留言
楼主
技术杂谈
2104
6
2023-11-30 17:16:17
[i=s] 本帖最后由 WT_0213 于 2023-11-30 17:16 编辑 [/i]
FreeRTOS任务控制API函数主要实现任务延时、任务挂起、解除任务挂起、任务优先级获取和设置等功能。 #### 1.任务创建 ##### 1.1函数描述 ``` BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t * pvCreatedTask ); ``` 创建新的任务并加入任务就绪列表。 如果使用FreeRTOS-MPU(在官方下载包中,为Cortex-M3内核写了两个移植方案,一个是普通的FreeRTOS移植层,还有一个是FreeRTOS-MPU移植层。后者包含完整的内存保护),那么推荐使用函数xTaskCreateRestricted()来代替xTaskCreate()。在使用FreeRTOS-MPU的情况下,使用xTaskCreate()函数可以创建运行在特权模式或用户模式(见下面对函数参数uxPriority的描述)的任务。当运行在特权模式下,任务可以访问整个内存映射;当处于用户模式下,任务仅能访问自己的堆栈。无论在何种模式下,MPU都不会自动捕获堆栈溢出,因此标准的FreeRTOS堆栈溢出检测机制仍然会被用到。xTaskCreateRestricted()函数具有更大的灵活性。 ##### 1.2参数描述 pvTaskCode:指针,指向任务函数的入口。任务永远不会返回(位于死循环内)。该参数类型TaskFunction_t定义在文件projdefs.h中,定义为:typedefvoid (*TaskFunction_t)( void * )。 pcName:任务描述。主要用于调试。字符串的最大长度由宏configMAX_TASK_NAME_LEN指定,该宏位于FreeRTOSConfig.h文件中。 usStackDepth:指定任务堆栈大小,能够支持的堆栈变量数量,而不是字节数。比如,在16位宽度的堆栈下,usStackDepth定义为100,则实际使用200字节堆栈存储空间。堆栈的宽度乘以深度必须不超过size_t类型所能表示的最大值。比如,size_t为16位,则可以表示的最大值是65535。 pvParameters:指针,当任务创建时,作为一个参数传递给任务。 uxPriority:任务的优先级。具有MPU支持的系统,可以通过置位优先级参数的portPRIVILEGE_BIT位,随意的在特权(系统)模式下创建任务。比如,创建一个优先级为2的特权任务,参数uxPriority可以设置为( 2 | portPRIVILEGE_BIT )。 pvCreatedTask:用于回传一个句柄(ID),创建任务后可以使用这个句柄引用任务。 ##### 1.3返回值 如果任务成功创建并加入就绪列表函数返回pdPASS,否则函数返回错误码。 ##### 1.4用法举例 ``` /* 创建任务. */ void vTaskCode( void * pvParameters ) { for( ;; ) { /* 任务代码放在这里 */ } } /* 创建任务函数 */ void vOtherFunction( void ) { static unsigned char ucParameterToPass; xTaskHandle xHandle; /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期, 因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为 中断和高优先级任务可能会用到它。 */ xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); /* 使用句柄删除任务. */ if( xHandle !=NULL ) { vTaskDelete( xHandle ); } } ``` #### 2.任务删除 ##### 2.1 任务描述 voidvTaskDelete( TaskHandle_t xTask ); 从RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。 注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。 ##### 2.2参数描述 xTask:被删除任务的句柄。为NULL表示删除当前任务。 #### 3.相对延时 ##### 3.1函数描述 void vTaskDelay( portTickTypexTicksToDelay ) 调用vTaskDelay()函数后,任务会进入阻塞状态,持续时间由vTaskDelay()函数的参数xTicksToDelay指定,单位是系统节拍时钟周期。常量portTICK_RATE_MS 用来辅助计算真实时间,此值是系统节拍时钟中断的周期,单位是毫秒。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelay 必须设置成1,此函数才能有效。 vTaskDelay()指定的延时时间是从调用vTaskDelay()后开始计算的相对时间。比如vTaskDelay(100),那么从调用vTaskDelay()后,任务进入阻塞状态,经过100个系统时钟节拍周期,任务解除阻塞。因此,vTaskDelay()并不适用与周期性执行任务的场合。此外,其它任务和中断活动,会影响到vTaskDelay()的调用(比如调用前高优先级任务抢占了当前任务),因此会影响任务下一次执行的时间。API函数vTaskDelayUntil()可用于固定频率的延时,它用来延时一个绝对时间。 ##### 3.2参数描述 xTicksToDelay:延时时间总数,单位是系统时钟节拍周期。 ##### 3.3用法举例 ``` voidvTaskFunction( void * pvParameters ) { /* 阻塞500ms. */ constportTickType xDelay = 500 / portTICK_RATE_MS; for( ;; ) { /* 每隔500ms触发一次LED, 触发后进入阻塞状态 */ vToggleLED(); vTaskDelay( xDelay ); } } ``` #### 4.绝对延时 ##### 4.1函数描述 void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_txTimeIncrement ); 任务延时一个指定的时间。周期性任务可以使用此函数,以确保一个恒定的频率执行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelayUntil 必须设置成1,此函数才有效。 这个函数不同于vTaskDelay()函数的一个重要之处在于:vTaskDelay()指定的延时时间是从调用vTaskDelay()之后(执行完该函数)开始算起的,但是vTaskDelayUntil()指定的延时时间是一个绝对时间。 调用vTaskDelay()函数后,任务会进入阻塞状态,持续时间由vTaskDelay()函数的参数指定,单位是系统节拍时钟周期。因此vTaskDelay()并不适用于周期性执行任务的场合。因为调用vTaskDelay()到任务解除阻塞的时间不总是固定的并且该任务下一次调用vTaskDelay()函数的时间也不总是固定的(两次执行同一任务的时间间隔本身就不固定,中断或高优先级任务抢占也可能会改变每一次执行时间)。 vTaskDelay()指定一个从调用vTaskDelay()函数后开始计时,到任务解除阻塞为止的相对时间,而vTaskDelayUntil()指定一个绝对时间,每当时间到达,则解除任务阻塞。 应当指出的是,如果指定的唤醒时间已经达到,vTaskDelayUntil()立刻返回(不会有阻塞)。因此,使用vTaskDelayUntil()周期性执行的任务,无论任何原因(比如,任务临时进入挂起状态)停止了周期性执行,使得任务少运行了一个或多个执行周期,那么需要重新计算所需要的唤醒时间。这可以通过传递给函数的指针参数pxPreviousWake指向的值与当前系统时钟计数值比较来检测,在大多数情况下,这并不是必须的。 常量portTICK_RATE_MS 用来辅助计算真实时间,此值是系统节拍时钟中断的周期,单位是毫秒。 当调用vTaskSuspendAll()函数挂起RTOS调度器时,不可以使用此函数。 ##### 4.2参数描述 pxPreviousWakeTime:指针,指向一个变量,该变量保存任务最后一次解除阻塞的时间。第一次使用前,该变量必须初始化为当前时间。之后这个变量会在vTaskDelayUntil()函数内自动更新。 xTimeIncrement:周期循环时间。当时间等于(*pxPreviousWakeTime + xTimeIncrement)时,任务解除阻塞。如果不改变参数xTimeIncrement的值,调用该函数的任务会按照固定频率执行。 ##### 4.3用法举例 ``` //每10次系统节拍执行一次 void vTaskFunction( void * pvParameters ) { static portTickType xLastWakeTime; const portTickType xFrequency = 10; // 使用当前时间初始化变量xLastWakeTime xLastWakeTime = xTaskGetTickCount(); for( ;; ) { //等待下一个周期 vTaskDelayUntil( &xLastWakeTime,xFrequency ); // 需要周期性执行代码放在这里 } } ``` #### 5.获取任务优先级 ##### 5.1函数描述 UBaseType\_t uxTaskPriorityGet(TaskHandle\_t xTask ); 获取指定任务的优先级。在文件FreeRTOSConfig.h中,宏INCLUDE\_vTaskPriorityGet必须设置成1,此函数才有效。 ##### 5.2参数描述 xTask:任务句柄。NULL表示获取当前任务的优先级。 ##### 5.3返回值 返回指定任务的优先级。 ##### 5.4用法举例 ``` voidvAFunction( void ) { xTaskHandlexHandle; // 创建任务,保存任务句柄 xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用句柄获取创建的任务的优先级 if( uxTaskPriorityGet( xHandle ) !=tskIDLE_PRIORITY ) { // 任务可以改变自己的优先级 } // ... // 当前任务优先级比创建的任务优先级高? if( uxTaskPriorityGet( xHandle )
点赞
1
收藏
1
淘帖
0
────
1
人觉得很赞
────
回复
使用道具
举报
6 回复
电梯直达
正序浏览
倒序浏览
正序浏览
沙发
bzhou830
回复
使用道具
举报
2023-12-1 08:42:48
回复
评论
使用道具
举报
选择去发光,而不是被照亮
板凳
san
回复
使用道具
举报
2023-12-1 23:27:09
学习
回复
评论
使用道具
举报
地板
爱玩开发板的湖
回复
使用道具
举报
2023-12-7 13:40:03
不错的贴子,学习了
回复
评论
使用道具
举报
5
#
1084504793
回复
使用道具
举报
2023-12-7 16:49:59
学习了
回复
评论
使用道具
举报
6
#
lazy
回复
使用道具
举报
2023-12-9 12:58:59
学习了
回复
评论
使用道具
举报
7
#
心云
回复
使用道具
举报
2023-12-10 11:01:54
学习
回复
评论
使用道具
举报
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
立即登录
手机登录
点评
高级模式
本版积分规则
回帖并转播
回帖后跳转到最后一页
返回
今日推荐
AiPi-PalChatV1_“湾湾小何”提示音测试固件V2.9_UART-MCP
[WB2] 实现自动发现局域网下的设备
热帖排行
ra-01sc-p发射功率大小的使用问题
[AiPi-PalchatV1] [Windows] 克隆仓库和在线烧录遇到的一些小问
AT+MQTTPUBRAW指令所支持的最大数据传输量是多少
AiPi-PalChatV1_UART-MCP_v2.8 UART-MCP 协议配置 问题
Ai-WB2蓝牙怎么连接打印机
AI-WB2-12F电脑蓝牙连接秒断,手机搜索不到
AiPi-PalChatV1_“湾湾小何”提示音测试固件V2.9_UART-MCP
从零搭建 Ai-WB2 开发板的 Linux 开发环境—— 基于 VMware 虚拟
统计信息
会员数: 30474 个
话题数: 44643 篇
首页
分类
我的