FreeRTOS——创建任务

2023-05-16

FreeRTOS的设计小巧且简易,整个核心代码只有3到4个C文件,为了让代码容易阅读、移植和维护,大部分的代码都是以C语言编写,只有一些函数(多数是架构特定排班副程序)采用汇编语言编写。

FreeRTOS提供许多方法以实现多线程(threads)、多作业(task)、互斥锁(mutex)、信号量(semaphore)和软件计时器(software timer),有个为低耗电应用程序提供的无嘀嗒(tick-less)模式,线程的优先权管理也有支持。

FreeRTOS所有的工作都是在任务中完成的,所以我们来看看任务是怎么创建的;

创建任务API函数

创建任务使用xTaskCreate函数

portBASE_TYPE xTaskCreate(  pdTASK_CODE pvTaskCode,
                            const signed portCHAR * const pcName,
                            unsigned portSHORT usStackDepth,
							void *pvParameters,
							unsigned portBASE_TYPE uxPriority,
							xTaskHandle *pxCreatedTask );
参数名描述
pvTaskCode任务只是永不退出的C 函数,实现常通常是一个死循环。参数pvTaskCode 只一个指向任务的实现函数的指针(效果上仅仅是函数名)。
pcName具有描述性的任务名。这个参数不会被FreeRTOS 使用。其只是单纯地用于辅助调试。识别一个具有可读性的名字总是比通过句柄来识别容易得多。应用程序可以通过定义常量config_MAX_TASK_NAME_LEN 来定义任务名的最大长度——包括’\0’结束符。如果传入的字符串长度超过了这个最大值,字符串将会自动被截断。
usStackDepth当任务创建时,内核会分为每个任务分配属于任务自己的唯一状态。usStackDepth 值用于告诉内核为它分配多大的栈空间。这个值指定的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。比如说,如果是32 位宽的栈空间,传入的usStackDepth值为100,则将会分配400 字节的栈空间(100 * 4bytes)。栈深度乘以栈宽度的结果千万不能超过一个size_t 类型变量所能表达的最大值。应用程序通过定义常量configMINIMAL_STACK_SIZE 来决定空闲任务任用的栈空间大小。
pvParameters任务函数接受一个指向void 的指针(void*)。pvParameters 的值即是传递到任务中的值。这篇文档中的一些范例程序将会示范这个参数可以如何使用。
uxPriority指定任务执行的优先级。优先级的取值范围可以从最低优先级0 到最高优先级(configMAX_PRIORITIES – 1)。configMAX_PRIORITIES 是一个由用户定义的常量。优先级号并没有上限(除了受限于采用的数据类型和系统的有效内存空间),但最好使用实际需要的最小数值以避免内存浪费。如果uxPriority 的值超过了(configMAX_PRIORITIES – 1),将会导致实际赋给任务的优先级被自动封顶到最大合法值。
pxCreatedTaskpxCreatedTask 用于传出任务的句柄。这个句柄将在API 调用中对该创建出来的任务进行引用,比如改变任务优先级,或者删除任务。如果应用程序中不会用到这个任务的句柄,则pxCreatedTask 可以被设为NULL。
返回值
1. pdTRUE

表明任务创建成功。

2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY

由于内存堆空间不足,FreeRTOS 无法分配足够的空间来保存任务
结构数据和任务栈,因此无法创建任务。

例子

1.创建任务1

void Task1( void *pvParameters )
{
	const char *pcTaskName = "Task1 output ........";
	volatile unsigned long ul;
	/* 和该任务处于一个死循环中。 */
	while(1)
	{
		/* 输出变量名,此处可以用自己方式验证 */
		vPrintString( pcTaskName );
		/* 延迟,以产生一个周期 */
		for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
		{
		/* 这个空循环是最原始的延迟实现方式。 */
		}
	}
}

1.创建任务2

void Task2( void *pvParameters )
{
	const char *pcTaskName = "Task2 output ........";
	volatile unsigned long ul;
	/* 和该任务处于一个死循环中。 */
	while(1)
	{
		/* 输出变量名,此处可以用自己方式验证 */
		vPrintString( pcTaskName );
		/* 延迟,以产生一个周期 */
		for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
		{
		/* 这个空循环是最原始的延迟实现方式。 */
		}
	}
}

3、main()函数只是简单地创建这两个任务,然后启动调度器

int main( void )
{
/* 创建第一个任务。需要说明的是一个实用的应用程序中应当检测函数xTaskCreate()的返回值,以确保任
务创建成功。 */
	xTaskCreate( Task1, /* 指向任务函数的指针 */
				"Task 1", /* 任务的文本名字,只会在调试中用到 */
				1000, /* 栈深度 – 大多数小型微控制器会使用的值会比此值小得多 */
				NULL, /* 没有任务参数 */
				1, /* 此任务运行在优先级1上. */
				NULL ); /* 不会用到任务句柄 */
	/* Create the other task in exactly the same way and at the same priority. */
	xTaskCreate( Task2, "Task 2", 1000, NULL, 1, NULL );
	/* 启动调度器,任务开始执行 */
	vTaskStartScheduler();
	/* 如果一切正常,main()函数不应该会执行到这里。但如果执行到这里,很可能是内存堆空间不足导致空闲
	任务无法创建。第五章有讲述更多关于内存管理方面的信息 */
	while(1);
}

这样两个简单的任务就创建完成了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS——创建任务 的相关文章

  • 使用docker安裝GPU版pytorch

    1 在docker pytorch 網址找到自己需要的環境 網址 https hub docker com r pytorch pytorch tags 点击复制 devel 版 连接 此处以 docker pull pytorch pyt
  • docker ssh连接

    docker ssh连接 1 进入docker span class token function passwd span span class token comment add root passward 记住自己设置的密码 xff0c
  • Docker容器显示图形到宿主机屏幕

    Docker容器显示图形到宿主机屏幕 在 docker 内 span class token function apt span span class token function install span xorg span class
  • Franka环境配置——从源码安装libfranka和franka_ros

    Franka安装ROS功能包 xff0c 有以下两种安装方式 xff1a 二进制包安装从源码安装编译 二进制包安装只要在终端输入一行命令就行 xff0c 很方便 但是功能包全部安装在根目录 xff1a opt ros kinetic sha
  • MeshLab——计算点云法向量求三角网格

    MeshLab 原始 1 点云分割 点击1后选中要删除区域 xff0c 点击2删除即可得到如下 xff1a 2 画三角网格 求法向量 Filters gt Normal Curvatures and Orientation gt Compu
  • XRDP--远程桌面连接(支持ubuntu16.04,18.04,20.04,22.04)

    XRDP 远程桌面连接 支持ubuntu16 04 18 04 20 04 22 04 1 环境 被控端 ubuntu 16 04 22 04 远控端 windows 2 具体操作 1 xff09 查看本机ip 终端输入 ifconfig
  • Jetson nano 卡刷教程

    Jetson nano 卡刷教程 所需用的的软件资源操作步骤 所需用的的软件资源 1 镜像 jetson nano jp451 sd card image zip 可自己在官网下载 https developer nvidia com em
  • dockers移盘&挂载

    docker 目录移动到其他磁盘的操作 systemctl stop docker 停止dockersystemctl status docker 查看docker服务状态mv var lib docker media li 1d10567
  • window docker 教程

    window docker 教程 1 docker windows 安装2 Docker Windows 修改默认镜像文件位置2 1 更改Docker Desktop设定2 2 创建文件链接2 3重新启动docker即可 1 docker
  • python导出环境依赖(requirements.txt)

    pip list format span class token operator 61 span freeze span class token operator gt span requirement txt 即可在同级目录得到一个re
  • 000-搭建Gitea-自己的git服务器

    000 搭建Gitea 自己的git服务器 1 什么是gitea 官网的介绍是 xff1a Gitea的首要目标是创建一个极易安装 xff0c 运行非常快速 xff0c 安装和使用体验良好的自建 Git 服务 我们采用Go作为后端语言 xf
  • 动态规划、贪心算法、分治算法的优缺点分析

    动态规划模型相对于静态规划模型的优点 xff1a 1 能够得到全局最优解 xff1b 2 可以得到一族最优解 xff1b 3 由于动态规划方法反映了动态过程演变的联系和特征 xff0c 在计算时可以利用实际知识和经验提高求解效率 动态规划模
  • 如何在vscode上运行调试C++(最简单的方法)

    Visual Studio Code vscode同样是微软出品的 支持 看上面的vside介绍吧 就省略了 人称宇宙第一编辑器 作为编辑器 它几乎支持所有的语言 对应语言风格的高亮 自动缩进 代码纠错 代码提示和代码补全等 要是有相应的编
  • visual studio中,已经安装完成后如何再安装其他组件(即在安装过程中未勾选的)怎么办?

    方法一 xff1a 控制面板 gt 程序 程序和功能 右键visual studio 单击更改 下面有三个按钮 单击更改 xff0c 把需要安装的组件全钩 xff0c 然后点击更改即可 1 在win10界面左下角搜索 控制面板 2 寻找程序
  • 安装好git包后,但在vsc中却提示:“ 未找到 Git。请安装 Git,或在 “git.path“ 设置中配置“的解决处理办法

    解决步骤 1 在官网安装好git管理工具包后 新建一个文件夹 然后用vsc打开该文件夹 效果下图所示 2 点选上图右侧的齿轮按钮 管理功能 后选中 34 管理扩展 34 功能 3 进入新的界面如下图所示 点开管理扩展后我们会看到Git扩展
  • 一种 XML2XML 格式之间转换的解决方案(转)

    一种 XML2XML 格式之间转换的解决方案 本文提供了一种 XML2XML 格式之间转换的通用解决方案 我们通过建立用以存储数据信息的数据模型 xff0c 并应用优化器 Optimizers xff0c 转换规则 Rules 对所存储的信
  • Unity can't be installed on this disk.The contents of this disk can't be changed.

    1 问题 在使用mac下Unity的时候 xff0c 通常情况下我们的方法都是通过Hub的安装按钮下载 但是 xff0c 很多时候上面并没有我们需要的版本 于是我们傻乎乎的通过点击上面的 xff1a 官方发布网站 进行下载 在下载的第五个步
  • Unity之【使用Blend-Tree】

    Blended Tree 材料准备创建Animator创建Controller配置混合树脚本代码效果演示 材料准备 人物模型和动画 直接去Unity素材库里找 xff0c 动画可以找可以自己录制 Unity编辑器 创建Animator 步骤
  • linux常用开关机指令

    关机命令 xff1a shutdown h now xff08 立刻进行关机 xff09 halt xff08 立刻进行关机 xff09 poweroff xff08 立刻进行关机 xff09 重启命令 xff1a shutdown r n
  • _vimrc (linux版)

    一般放在 xff1a etc vim span class token string 34 vimrc 34 span span class token function vim span config span class token f

随机推荐

  • 01_Unity事件函数OnMouseDown生效条件

    前言 Unity提供了OnMouseDown xff0c OnMouseEnter xff0c OnMouseExit等方法 xff0c 这些方法可以很方便的帮助我们处理鼠标的时间响应 但是需要注意他的生效条件 xff0c 最近我在制作视频
  • 算法题型:滑动窗口(leetcode 209)

    一 209 长度最小的子数组 难度中等 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s xff0c 找出该数组中满足其和 s 的长度最小的连续子数组 如果不存在符合条件的连续子数组 xff0c 返回 0 示例 输入 s 61 7
  • 前端:bootstrap table表格属性、列属性、事件、方法

    目录 一 使用前提 二 基本属性 列参数 事件 方法 多语言 一 使用前提 1 在html中引用table相应的包 lt link rel 61 34 stylesheet 34 type 61 34 text css 34 href 61
  • 从0开始学SLAM的各种问题

    一 关于更改vscode自带终端文字间隔 xff0c 字体大小 文件 gt 首选项 gt 设置 gt 搜索 终端 gt 找到Terminal gt Integrated Font Family gt 更改为monospace即可 找到Ter
  • python —— 变量后面加个下划线_是啥意思

    前后没有下划线的是公有方法 前边有一个下划线的为私有方法或属性 xff0c 子类无法继承 前边有两个下划线的 一般是为了避免于子类属性或者方法名冲突 xff0c 无法在外部直接访问 前后都有双下划线的为系统方法或属性 后边单个下划线的可以避
  • SD卡烧录镜像后插电脑不显示问题

    起因 起因是给sd卡刷入jetson nano的ROS机器人镜像 xff0c 之后读卡器插入电脑就不显示了 解决方法 xff1a xff08 1 xff09 Ubuntu下 xff1a https blog csdn net yandaqi
  • 【码农本色】用数据解读我的2014

    转眼2014就过去了 xff0c 不禁感叹又老了一岁的同时 xff0c 却发现已经快研究生毕业了 xff0c 趁着这个活动简单总结下2014 1 实习篇 2014年一月份拿到了人生第一个实习offer xff0c 在sony这样的大公司做a
  • Windows下QGroundControl开发问题汇总

    Windows下QGroundControl二次开发问题汇总 前段时间因为项目要求涉及了一下QGC地面站的二次开发 xff0c 开发难度先不提 xff0c 环境搭建遇到了很多问题 xff0c 几乎网上能搜到的问题都遇到了一遍 xff0c 在
  • 初识Git——Git、Github、Gitee的关系

    想要自己做一些有意义的东西 xff0c 甚至去参加一些互联网比赛 xff0c 就必须要学会使用Git 最初了解Git xff0c 同时听到了Git Github Gitee xff08 码云 xff09 xff0c 于是竭力想要弄明白三者之
  • UCOSII原理与应用----基本概念和任务

    1 实时操作系统是什么 实时操作系统 xff1a 能够使计算机系统在一个规定的时间内及时响应外部请求并及时控制设备和实时任务协调运行的操作系统 实时系统有两个基本要求 xff1a 1 实时系统的计算必须产生正确结果 xff0c 称逻辑或功能
  • UCOSII原理与应用----任务调度

    任务调度 xff1a UCOSII任务调度思想 xff1a 近似地每时每刻让优先级最高的就绪任务处于运行状态 具体上 xff0c 采用系统或用户任务调用系统函数及执行中断服务程序结束时来调用调度器 xff0c 以确定应该运行的任务并运行它
  • Docker的使用(docker pull拉取镜像失败问题解决)

    在docker拉取Nginx镜像过程中 xff0c 速度慢 xff0c 或者不成功 报错代码 xff1a Error response from daemon Get https registry 1 docker io v2 net ht
  • Hexo-Next 博客搭建

    lt span style 61 34 color 777777 34 gt title Hexo 搭配 GitHub 建立博客 选用 nexT 主题 date 2021 04 26 19 21 20 categories 兴趣 网站 博客
  • 进阶之路:Prometheus —— 技巧篇

    前言 入门篇 xff1a 从零开始 xff1a Prometheus 理解篇 xff1a 进阶之路 xff1a Prometheus 理解篇 本文记录了一些我在使用Prometheus的过程中的技巧 xff0c 以后还会随着使用的深入不定期
  • Linux系统如何离线安装软件

    Linux系统如何离线安装软件 前言 xff08 一堆废话 xff0c 不看也罢 xff09 功能需求具体操作 前言 xff08 一堆废话 xff0c 不看也罢 xff09 升学足足两个月了 xff0c 但是截至目前 xff0c 还没有认认
  • python中出现变量前后带下划线的是什么意思

    前后没有下划线的是公有方法 xff0c 前边有一个下划线的为私有方法或属性 xff0c 子类无法继承 xff0c 前边有两个下划线的 一般是为了避免于子类属性或者方法名冲突 xff0c 无法在外部直接访问 前后都有双下划线的为系统方法或属性
  • 普通程序员如何入门AI

    毫无疑问 xff0c 人工智能是目前整个互联网领域最火的行业 xff0c 随着AlphaGo战胜世界围棋冠军 xff0c 以及各种无人驾驶 智能家居项目的布道 xff0c 人们已经意识到了AI就是下一个风口 当然 xff0c 程序员是我见过
  • 扩展卡尔曼线性化近似与仿真

    扩展卡尔曼线性化近似与仿真 关于线性化直入主题 上例子小车运动方式 xff1a 沿着圆心在原点 半径为5的圆进行匀速圆周运动 xff0c 其角速度为w 即每次更新变化w个角度 仿真结果总结Matlab测试代码 xff08 EKF test
  • Ubuntu挂载硬盘

    Ubuntu挂载硬盘 1 查看磁盘信息命令 fdisk l 2 查看硬盘的UUID命令sudo blkid 3 mkdir创建挂载点WorkpaceP2和WorkpaceP2 4 永久性挂载分区 xff0c 修改分区文件 xff0c 输入如
  • FreeRTOS——创建任务

    FreeRTOS的设计小巧且简易 xff0c 整个核心代码只有3到4个C文件 xff0c 为了让代码容易阅读 移植和维护 xff0c 大部分的代码都是以C语言编写 xff0c 只有一些函数 xff08 多数是架构特定排班副程序 xff09