当前位置: 首页 > news >正文

STM32——FreeRTOS - 任务创建和删除 ~ 动态方法

STM32——FreeRTOS - 任务创建和删除*

二、任务创建和删除(动态方法)

第10讲,还有52讲

这个就是上面的应用 初始任务删除自己 而自己处于运行态 不能立马释放自己内存 只能空闲任务执行删除 进行内存释放 但是有个问题 空闲任务什么时候到他执行?

 - 在 vTaskDelete 中介绍到

动态创建任务 简介:

1.4

1.5

动态任务创建 简易调用关系:

xTaskCreate -》

-> prvInitialiseNewTask -> pxPortInitialiseStack 

->prvAddNewTaskToReadyList -> prvInitialiseTaskLists -> prvAddTaskToReadyList

动态任务创建 源码细节(看中文注释):


xTaskCreate:

#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ const configSTACK_DEPTH_TYPE usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ) { TCB_t * pxNewTCB; /* 任务控制块 */ BaseType_t xReturn; /* If the stack grows down then allocate the stack then the TCB so the stack * does not grow into the TCB. Likewise if the stack grows up then allocate * the TCB then the stack. */ /* 如果栈向下增长,那么先分配栈,再分配 TCB,这样栈就不会增长到 TCB 中; * 同样,如果栈向上增长,那么先分配 TCB,再分配栈. */ #if ( portSTACK_GROWTH > 0 ) /* 栈向上生长: 低地址 -> 低高地址 [STM32是向下生长] */ { /* Allocate space for the TCB. Where the memory comes from depends on * the implementation of the port malloc function and whether or not static * allocation is being used. */ pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); if( pxNewTCB != NULL ) { /* Allocate space for the stack used by the task being created. * The base of the stack memory stored in the TCB so the task can * be deleted later if required. */ pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ if( pxNewTCB->pxStack == NULL ) { /* Could not allocate the stack. Delete the allocated TCB. */ vPortFree( pxNewTCB ); pxNewTCB = NULL; } } } #else /* portSTACK_GROWTH */ /* 栈向下生长: 高地址 -> 低地址 [STM32就是向下生长] */ { StackType_t * pxStack; //任务堆栈,用来存放首地址 /* 为正在创建的任务所使用的栈分配空间。调用malloc函数由系统自动分配堆空间:长度*字节*/ pxStack = pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ if( pxStack != NULL ) { /* 为任务控制块分配空间 (TCB). */ pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ if( pxNewTCB != NULL ) { /* 将任务控制块首地址存储. */ pxNewTCB->pxStack = pxStack; } else { /* 该栈无法使用,因为TCB组件尚未创建。再把它释放掉。 */ vPortFreeStack( pxStack ); } } else { pxNewTCB = NULL; } } #endif /* portSTACK_GROWTH */ if( pxNewTCB != NULL ) { // 条件编译不管 #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ { /* Tasks can be created statically or dynamically, so note this * task was created dynamically in case it is later deleted. */ pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; } #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ /* 初始化任务控制块 TCB 中的其余成员 (除了pxNewTCB->pxStack) */ prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); /* 添加新创建的任务到 就绪列表 中 */ prvAddNewTaskToReadyList( pxNewTCB ); xReturn = pdPASS; } else { xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; } return xReturn; } #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ /*-----------------------------------------------------------*/
prvInitialiseNewTask
static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask, TCB_t * pxNewTCB, const MemoryRegion_t * const xRegions ) { StackType_t * pxTopOfStack; UBaseType_t x; /* MPU 内存保护功能 是否开启的判断宏. */ #if ( portUSING_MPU_WRAPPERS == 1 ) /* Should the task be created in privileged mode? */ BaseType_t xRunPrivileged
http://www.jsqmd.com/news/523093/

相关文章:

  • solidworks插件 执行回调这个参数是string是怎么变成方法的
  • 2026年云南型钢生产厂家TOP5实力解析:以品质筑牢根基赋能工程全场景 - 深度智识库
  • 把 AI 当效率武器,用实战练真本事!
  • PHP-Resque部署指南:生产环境配置与监控方案
  • IJPay证书管理完全手册:从申请到部署的全流程指南
  • Go语言错误处理革命:从29934号提案看Go 2的错误值设计
  • ELF文件格式解析:嵌入式ARM固件的链接、加载与执行机制
  • Coding Plan技术解析:AI编程时代的成本优化与效率革命
  • 文脉定序系统内网穿透方案:安全访问本地部署的排序服务
  • 分析深圳太阳能曝气机口碑,哪家比较靠谱 - 工业品网
  • 2026年 角钢/槽钢/工字钢/H型钢/扁钢厂家实力推荐榜:冷镀锌、热轧、Q235B等全品类钢材源头工厂深度解析 - 品牌企业推荐师(官方)
  • 2026年钢塑土工格栅厂家推荐:山东联铭工程材料,双向土工格栅/玻纤土工格栅/PET土工格栅厂家精选 - 品牌推荐官
  • 306. 累加数(dfs回溯)
  • 从二本逆袭985:我的科软考研实战攻略
  • Windows10下SVN小绿勾消失?5分钟教你用注册表编辑器搞定(附详细截图)
  • Win11下VMware配置Ubuntu虚拟机的完整指南
  • 大数据领域分布式存储的分布式NFT数据管理
  • 62:AI多语言神谕生成:文本生成模型与TTS语音合成基础
  • 拼多多卖家必看:用webcrawl监控竞品销量的3种高阶玩法(最新版教程)
  • 51单片机土壤湿度检测及自动浇花系统
  • 厄瓜多尔空运专线服务商盘点:连接中国与南美的空中桥梁 - 时事观察官
  • pbrt-v4体积渲染技术深度解析:从零实现物理精确的烟雾和云彩效果
  • Ace Admin 模板:10个常见问题终极解决方案指南
  • 【MySQL】SQL 优化:关联查询优化
  • CD32.【C++ Dev】类和对象(22) 内存管理(下)
  • 一天一个Python库:oauthlib - 轻松构建OAuth客户端和服务器
  • 2026年主数据管理厂家全面推荐,主流系统供应商怎么挑选 - 品牌2026
  • UART串口通信协议
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(家具)
  • Vue中el-cascader多选级联选择器的终极指南:如何精准获取最后一级数据