精选文章 FreeRTOS 操作系统学习(二) 任务

FreeRTOS 操作系统学习(二) 任务

作者:mobei1983 时间: 2019-11-11 07:11:28
mobei1983 2019-11-11 07:11:28

                                                                                        FreeRTOS 操作系统学习

http://wiki.csie.ncku.edu.tw/embedded/FreeRTOS_Melot.pdf

1. 任务 

1.1  FreeRTOS 中的任务

       只要硬件和内存足够,FreeRTOS 运行的任务数量不受限制,作为一个实时操作系统,FreeRTOS  同时支持循环和非循环任务。在 RTOS 中,任务由一个简单的C函数定义,参数为 void*  类型,无返回值  (void)。

      用些函数用于对任务的管理 : 任务创建(vTaskCreate()),任务销毁((vTaskDelete()),优先级管理(uxTaskPriorityGet(),   vTaskPrioritySet())   延迟/恢复((vTaskDelay(), vTaskDelayUntil(),vTaskSuspend(), vTaskResume(),vTaskResumeFromISR()

      为了便于调试,用户可以选择很多操作,例如创建关键序列或对任务进行监控。、

1.1.1 任务的生命周期

     本节更详细地讲解任务从创建至销毁的整个发展过程。此时,我们假设只有一个内核,在指定的时间内只运行一个任务,每个人物只有“ 运行 (Running) ” “ 不运行 (Not Running) ”两种状态,由于我们假设是单核运行,且任意时刻有且只有一个任务在运行,那么其他的未运行的任务一定是处于“不运行 (Not Running)”状态. 图1  给出了这种情形下生命周期的简单示意图

     当一个任务从 非运行状态 进入运行状态,称之为“切入”,反之,成为“切出”。

                                                                            FreeRTOS 操作系统学习(二) 任务1

                                                                                                   图1 生命周期示意图

     由于存在一些原因导致任务无法运行,由于“未运行”状态可以展开,如图2所示,当任务处于延迟或等待事件触发时,高优先级任务可以抢占低优先级任务(调度在第2节中介绍)。当任务正在处理器资源准的过程中,这个状态称之为“就绪(Ready)”态。当任务处于等待另一个任务完成(例如 等待信号量同步完成或互斥量)被延后执行,处于等待的状态称之为“阻塞。(Blocked)”。总之,调用vTaskSuspend()   、   vTaskResume()   、 xTaskResumeFromISR() 这些函数,可以使任务进入或退出“挂起 (Suspend)”状态。
     强调任务能自行退出“运行(Running)”态是非常重要的(即进入延迟、挂起或事件等待),只有调度器能使任务重新“切入”运行状态,当一个任务试图重新进入“运行”态,它的状态应为“就绪(Ready)”,只有任务调度器能决定当前的时间片分配给哪个就绪任务。

                                                        FreeRTOS 操作系统学习(二) 任务2

 

                                                                                                    图2 任务的生命周期

1.2  创建 和 删除任务

       由一个简单的C函数定义的任务,它带有一个void *参数并且不返回任何内容(请参见 文本1)

                   void ATaskFunction( void *pvParameters );

                                                                       文本1: 一个典型的任务函数

      一个任务在销毁(Destroy)之前会一直运行。任务通常是一个死循环函数,或在到达最后一个大括号之前调用vTaskDestroy(NULL),由于死循环中的任何代码都可能失败并导致退出此循环,即使是重复性任务,在最后的大括号之前调用vTaskDelete()也更安全。文本3 是一个任务实现的典型例子

     可以使用vTaskCreate()创建任务(文本2)。 此函数参数列表如下:

  •      pvTaskCode:        一个指向任务实现函数的指针.
  •      pcName:              任务名.  这对FreeRTOS没用,但仅用于调试目的
  •      usStackDepth:     以字为单位的此任务的堆栈长度. 堆栈的实际大小取决于微控制器. 如果堆栈为32位(4字节),而usStackDepth的值为100,则将为任务分配400字节(4乘以100).
  •      pvParameters:     任务的指针参数. 较好的做法是创建一个专用的结构体变量,实例化并赋值,然后将其指针交给任务。.
  •      uxPriority:            任务优先级,    赋值范围从  0   到  ( MAX_PRIORITIES–1).   在第2节中将对此进行讨论
  •      pxCreatedTask:   指向可以处理任务标识符的指针. 如果任务标识符将来不会被修改,则可以将其设为NULL。 

   

    文本 2: 任务创建例程

portBASE_TYPE xTaskCreate  (       pdTASK_CODE                        pvTaskCode,           

                                                           const signed portCHAR  *         const pcName,                                 

                                                           unsigned portSHORT               usStackDepth,                                 

                                                           void                                           * pvParameters,                                  

                                                           unsigned                                   portBASE_TYPE uxPriority,               

                                                           xTaskHandle                            *pxCreatedTask   );  

 
文本 3: 一个典型的任务 (from “Using the FreeRTOS Real Time Kernel”).

void ATaskFunction( void *pvParameters ) 

      /* 

          可以按照常规函数声明变量的方法对变量进行声明。.  

          每个使用此函数创建的任务 ,会重新创建一个iVariableExample 变量.  

          如果变量是静态变量,所有此任务的实例将共享变量的存储,一个实例修改将导致所有实例的这个变量值都发生改变 

     */ 

       

      int iVariableExample = 0;      

 

     /* 死循环中为任务的具体实现. */    

     for( ;; )    

     {          

          /* 任务功能实现代码. */   

     }    

 

     /* 

        应该在不打破上述循环的前提下执行任务,然后才能删除该任务。

         传递给vTaskDelete()函数的NULL参数表示要删除的任务是当前正在调用的任务。

     */     

 

     vTaskDelete( NULL ); 

          当任务创建后可以使用xTaskDestroy()例程销毁任务。 参数为pxCreatedTask,例程见文本4中给出,示例参考文本3

                 

文本4 删除一个任务
void vTaskDelete( xTaskHandle pxTask );  

          删除任务后,空闲任务将释放所有释放所有分配给该任务的内存资源。注意,所有动态分配的内存必须手动释放。

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:关于大数据的测试题

下一篇:jQuery—删除DOM节点之replace()、replaceAll()方法

您可能感兴趣

  • Yolo系列详解

    零、图像基本概念 图像表示为二维的矩阵  灰阶图像 0-255,0表示黑色,255表示白色,其余表示灰色。 图像的坐标轴   彩色图像  注意:颜色信息对于任务有时候有用,有时候没用。 一、什么是目标检测 目标检测是计算机视觉中的经典的原子问题,即通过输入的图像来完成物体的检测,它需要解决两个问题: 物体在哪里 物体是什么 目标检测算法的传统实现 sift hog 等算法。这些算法的...

  • 学Mysql怎样快速入门?

    学Mysql怎样快速入门? 前言 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。 MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。关系数据库将数据 保存在不同的表中,...

  • 物联网大数据平台有哪些功能特点

      大数据技术是指从各种各样海量类型的数据中,快速获得有价值信息的能力。适用于大数据的技术,包括大规模并行处理(MPP)数据库,数据挖掘电网,分布式文件系统,分布式数据库,云计算平台,互联网,和可扩展的存储系统。   一个物联网大数据平台需要具备哪些功能?与通用的大数据平台相比,它需要具备什么样的特征呢?我们来仔细分析一下。   1.高效分布式   必须是高效的分布式系统。物联网产生的数据量...

  • 行业软件开发商怎样来抢 BI 这块蛋糕?

    随着企业信息化建设的深入,很多机构的生产系统已建设完成,在保证生产的有序进行后,如何更有效地进行经营决策成了管理者面临的最大任务。商业智能(BI)就是在这种背景成为支撑企业经营分析的一大利器。 根据 IDC 中国的报告,2020 年中国商业智能市场规模将达到 5.8 亿美元(约 40 亿元人民币),而且每年还以近 20% 的速度增长。目前企业对 BI 系统需求旺盛程度可见一斑。 不同于信息化...

  • 零基础入门天池NLP赛事之——新闻文本分类(6)

    基于深度学习的文本分类 一、学习目标: 了解Transformer的原理和基于预训练语言模型(Bert)的词表示 学会Bert的使用,具体包括pretrain和finetune 二、文本表示方法Part4: Transformer原理 Transformer是在"Attention is All You Need"中提出的,模型的编码部分是一组编码器的堆叠(论文中依次堆叠六个编码器),模型的...

  • 论文|从DSSM语义匹配到Google的双塔深度模型召回和广告场景中的双塔模型思考...

    点击标题下「搜索与推荐Wiki」可快速关注 ▼ 相关推荐 ▼ 1、基于DNN的推荐算法介绍 2、传统机器学习和前沿深度学习推荐模型演化关系 3、论文|AGREE-基于注意力机制的群组推荐(附代码) 4、论文|被“玩烂”了的协同过滤加上神经网络怎么搞? 本文包含(文章较长,建议先收藏再阅读,点击文末的阅读原文,查看更多推荐相关文章): DSSM DSSM的变种 MV-DNN Google Tw...

  • 第四次培训任务:esp8266

    (撰写时间2020-08-04) 一、对esp8266进行了解(是什么,有什么用,有哪些功能,如何编程) 1.是什么 是面向物联网应用的高性价比、高度集成的 Wi-Fi MCU。微控制单元(Microcontroller Unit;MCU) ,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)等周边接口,甚至LCD驱动电路都整合...

  • 适合新手练习的Python项目有哪些?

    适合新手练习的Python项目有哪些?简单易上手的Python项目汇总:Web 项目设计:内容聚合器、正则表达式查询工具、网址缩短、便利贴、功能、测验、GUI 项目设计:MP3 播放器、闹铃提醒工具、文件管理器、记账功能、命令行项目设计:通讯录、网站连接检查、批量文件重命名工具、目录树生成器。   一、Web 项目设计:内容聚合器(Content Aggregator)   该项目设计的主要...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。