任务创建

目前free rt os与cube mx 结合地非常好,让开发都变得简单起来,就是因为它实在是太优雅了(总而言之就是太懂程序员了),让不少开发者STM32开发都离不开CUBE MX的自动配置。

创建任务有两种方式,与RT-Thread一样,动态创建和静态创建两种,它们的区别在于每个任务(线程)所分配的任务栈是系统自动分配还是自己指定一块内存区域(通常以静态数组的形式)。

这里在配置的时候需要注意的在于

1.StackSize(任务栈大小),它是以字为单位,所以真正的大小应该为其4倍字节数。

2.任务栈是从RAM上分配下来的,这个RAM大小有多大看芯片的说明手册。另外CUBEMX在配置的时候回给一个默认的总的堆大小。

总的堆大小:这个值需要用户自己随着任务分配自己去修改,任务的栈是从这个总的堆上瓜分下来的(在创建任务时标记任务栈顶的地址以及栈大小为一个任务的任务栈)

关于这里堆栈的称呼实际上是一个意思,这与平时我们所说堆栈不同。在这里它们都是内存RAM的部分,任务栈从系统设定的总的堆大小上分配出来一块区域(一块数组)作为栈。504=4*96+其他属性信息所占内存大小(比如说任务的入口函数地址,任务的名字,任务的优先级大小,任务的任务栈大小等等)

在FreeRTOSConfig.h里进行配置。裁剪出用户自定义的一些配置(比如OS的心跳(systick的中断函数,idle的钩子函数,定时器的最大深度等等)),其中就包括所定义的总的堆大小。

创建任务

使用封装的一个函数 osThreadNew 传入函数入口地址,函数入口参数,配置的属性结构体

以动态创建函数为例。在各种判断后最终执行动态创建函数

在动态创建函数中,初始化堆栈,然后根据该任务的优先级插入到对应的优先级列表中,尾插法插入,

新加入的同优先级的任务放在尾部。

所做的正是插入链表的算法。

  1. 获取当前尾结点(尾结点是一个空的结点),它的前继永远执行真正的最后一个结点。新结点的后继为尾结点。
  2. 新结点(新创建的任务)的前继为尾结点的前继结点(旧链表的最后一个任务)。
  3. 尾结点的前继的后继也就是旧链表的最后一个任务结点的后继为当前新结点。
  4. 更新尾结点的前继为当前任务结点。

最后在main函数里开启调度。

开启调度时创建一个空闲任务。

关于空闲任务:

空闲线程的入口函数

static portTASK_FUNCTION( prvIdleTask, pvParameters )
static portTASK_FUNCTION( prvIdleTask, pvParameters )
{/* Stop warnings. */( void ) pvParameters;/** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THESCHEDULER IS STARTED. **//* In case a task that has a secure context deletes itself, in which casethe idle task is responsible for deleting the task's secure context, ifany. */portTASK_CALLS_SECURE_FUNCTIONS();for( ;; ){/* See if any tasks have deleted themselves - if so then the idle taskis responsible for freeing the deleted task's TCB and stack. */prvCheckTasksWaitingTermination();#if ( configUSE_PREEMPTION == 0 ){/* If we are not using preemption we keep forcing a task switch tosee if any other task has become available.  If we are usingpreemption we don't need to do this as any task becoming availablewill automatically get the processor anyway. */taskYIELD();}#endif /* configUSE_PREEMPTION */#if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ){/* When using preemption tasks of equal priority will betimesliced.  If a task that is sharing the idle priority is readyto run then the idle task should yield before the end of thetimeslice.A critical region is not required here as we are just reading fromthe list, and an occasional incorrect value will not matter.  Ifthe ready list at the idle priority contains more than one taskthen a task other than the idle task is ready to execute. */if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ){taskYIELD();}else{mtCOVERAGE_TEST_MARKER();}}#endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */#if ( configUSE_IDLE_HOOK == 1 ){extern void vApplicationIdleHook( void );/* Call the user defined function from within the idle task.  Thisallows the application designer to add background functionalitywithout the overhead of a separate task.NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,CALL A FUNCTION THAT MIGHT BLOCK. */vApplicationIdleHook();}#endif /* configUSE_IDLE_HOOK *//* This conditional compilation should use inequality to 0, not equalityto 1.  This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called whenuser defined low power mode implementations requireconfigUSE_TICKLESS_IDLE to be set to a value other than 1. */#if ( configUSE_TICKLESS_IDLE != 0 ){TickType_t xExpectedIdleTime;/* It is not desirable to suspend then resume the scheduler oneach iteration of the idle task.  Therefore, a preliminarytest of the expected idle time is performed without thescheduler suspended.  The result here is not necessarilyvalid. */xExpectedIdleTime = prvGetExpectedIdleTime();if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ){vTaskSuspendAll();{/* Now the scheduler is suspended, the expected idletime can be sampled again, and this time its value canbe used. */configASSERT( xNextTaskUnblockTime >= xTickCount );xExpectedIdleTime = prvGetExpectedIdleTime();/* Define the following macro to set xExpectedIdleTime to 0if the application does not wantportSUPPRESS_TICKS_AND_SLEEP() to be called. */configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime );if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ){traceLOW_POWER_IDLE_BEGIN();portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );traceLOW_POWER_IDLE_END();}else{mtCOVERAGE_TEST_MARKER();}}( void ) xTaskResumeAll();}else{mtCOVERAGE_TEST_MARKER();}}#endif /* configUSE_TICKLESS_IDLE */}
}

空闲任务的优先级永远是0 (最低优先级,且空闲任务永远礼让给别的优先级任务哪怕在空闲链表里得到执行也会主动礼让。)

基于STM32结合CubeMX学习Free-RT-OS的源码之任务创建相关推荐

  1. 基于STM32开源:磁流体蓝牙音箱(包含源码+PCB)

    目录 日常·唠嗑 一.视频效果 二.硬件设计 三.程序设计 四.工程获取 五.专利 日常·唠嗑 21年6月的时候,那会刚开始创业,跟着合伙人园丁(笔名)在创业的道路上,瞎灯黑火乱摸索,基本上是能跟开发 ...

  2. 基于stm32单片机的图书馆噪音检测量分贝仪(源码+原理图)

    资料编号:080 根据噪音大小,分别不同指示灯,当噪音过大的时候蜂鸣器报警, 具体功能请看下面演示视频    全套资料齐全: 80-基于stm32单片机的图书馆噪音检测量分贝仪(源码+原理图) stm ...

  3. 基于stm32单片机的模拟IIC时序(附源码)

    我下面要说的是基于stm32单片机的模拟IIC时序,以及是一些要注意的事项:结合自己所做的MMA7455加速度传感器,我把模拟IIC的源代码贴了出来,大家可以参考一下. 1.因为在IIC协议中,当总线 ...

  4. 基于STM32结合CubeMX学习Free-RT-OS的源码之消息队列

    目录 在CubeMX上的配置(简洁一览) 队列 写队列 (写到队列尾部) 读队列 在CubeMX上的配置(简洁一览) CMSIS_V1与CMSIS_V2两个API接口,除了前者无法用到事件集,其余都一 ...

  5. 基于YOLOv7的室内场景智能识别系统(源码&教程)

    1.项目背景: 近年来,随着移动互联网与定位技术的发展,基于位置服务越来越多地出现在人们的日常生活中.虽然智能手机都包含很多基于位置服务的应用,但是传统的基于位置服务常常将服务范围划分为室内与室外两种 ...

  6. Android学习笔记-常用的一些源码,防止忘记了

    Android学习笔记-常用的一些源码,防止忘记了... 设置拨打电话 StringdialUri="tell:"+m_currentTelNumble; IntentcallIn ...

  7. 基于改进AlexNet的植物中草药分类系统(源码&教程)

    1.研究背景 传统的中草药图像识别往往需要人工采集大量的原始样本,再进行人工分析和研究,需要研究者具有相当丰富的中医药知识储备和经验,整个过程耗时耗力且识别率难以得到保证.随着信息技术的飞速发展,人工 ...

  8. 基于YOLOv5&Deepsort的山药计数系统(源码&教程)

    1.研究背景 目前缺少针对西南喀斯特山区作物种植地块破碎和多云雾天气导致影像存在阴影进而影响作物遥感识别精度等问题的研究,上述研究也未能找到较好消除杂草对作物植株识别影响的方法.此外,西南喀斯特山区作 ...

  9. Python基于CRNN&CTPN的文本检测系统(源码&教程)

    1.背景 文本是人类最伟大和最具影响力的发明之一,是人类智慧的结晶,是人类文化.思想传承的一种基本的表达方式和不可或缺的载体.在21世纪,文本与日常生活密切相关.描述.理解万事万物,表达情感,与他人交 ...

最新文章

  1. 目前的Android恶意软件分类
  2. 性能跟踪_ORACLE
  3. 随便写写2014创业记(二)
  4. Wireshark 在Windows下的安装
  5. mysql语言中有什么运算_SQL知识点,新手感悟
  6. 2021李宏毅机器学习课程笔记——Explainable AI
  7. 微信接口开发之高级篇系列【网页授权获取用户基本信息】
  8. 编程语言 - 大数据 - Hadoop
  9. Windows10远程连接服务器时出现“这可能是由于CredSSP加密数据库修正”的错误提示的解决办法
  10. Ubuntu Emacs Fcitx 中文输入法设置
  11. PlistEdit Pro 1.9.2 plist文件编辑软件
  12. 计算机制作ppt教程,电脑制作ppt详细步骤_新手制作ppt详细步骤图文教程
  13. Unable to instantiate application 解决方法
  14. 浅析芝麻信用分征信体系
  15. php分享微信图片不显示,解决微信二次分享不显示摘要和图片的问题
  16. php错误排查 写入文档,php error_log 错误信息写入文件
  17. sap pi的操作1
  18. 深入GraphQL 的使用语法
  19. 【电力系统】经济调度、最优潮流、机组组合
  20. matlab定义双精度型变量_matlab双精度浮点数编码及区间覆盖(原创)

热门文章

  1. 度秘语音引擎app_带有语音识别功能的APP
  2. Oracle Discoverer plus操作介绍(一)
  3. html5 jssdk,微信公众号与HTML 5混合模式揭秘1——如何部署JSSDK
  4. 临检流水线仪器基本逻辑
  5. 用Adobe Reader的“朗读”功能实现“少林修女GPS”语音提示
  6. 加州自驾游交规停车等注意事项
  7. 微信小程序报错 net::ERR_CONNECTION_TIMED_OUT
  8. 【C语言入门】编写程序,1英寸 = 2.54厘米,输入英寸,转为厘米。
  9. 使用avaScript脚本动态操作 SVG 文档
  10. BZ2763: [JLOI2011]飞行路线