uCOS/FreeRTOS任务创建的两种模式

2023-05-16

在我们使用uCOS/FreeRTOS编写代码时,首先要面临的一个问题是怎样创建任务并启动整个系统。一般来说,我们会有两种不同的方式。这两种方式不仅适用于uCOS/FreeRTOS,同时也适用于其它RTOS。

创建任务的两种方式

这两种方式各有优缺点。如果用一幅图来表示的话,见下方。

RTOS启动流程

下面将分别说明这两种方式的具体应用方法。

方式一:先创建启动任务,启动任务初始化软硬件并创建其它任务

这种方式是这样的:在启动启动前创建一个初始任务,然后在该任务跑起来后,再完成其它软硬件初始化、创建启动任务。

int main () {
    OSInit();
    CreateFirstTask();      // 创建初始任务
    OSStart();
}

void FirstTask () {
    DataInit();         // 初始化应用相关的数据
    HardwareInit();     // 初始化硬件模块
    CreateTask1();      // 创建任务1
    CreateTask2();      // 创建任务2
}

相于接下来讲到的方式二而言,这种方式的一大优点是:所有的初始化及任务创建都是在整个跑起来之后进行。如果这些是在系统跑起来之前进行的话,则有可能存在潜在的隐患。具体可以看下面的方式二。

在完成所有初始化操作之后,该初始任务可以继续完成一些其它的功能。当然,也有的人直接让任务自行删除。不过我认为自行删除并不必要,因为在任务任务时,我们可能是通过全局变量定义任务的Task结构和堆栈空间。删除之后,这些空间肯定还要用的吧?如果是分配给别的任务,那么还得再创建一个任务。既然如此,那么为什么不直接不删除呢?

要特别注意一点:初始任务的优先级应尽可能的高。因为有些RTOS的任务创建接口中,创建任务之后可能会立即启动该任务,如果新任务的优先级比初始任务的优先级更高,则会切换至新任务运行。而这与我们所期望的流程就不一致。

方式二:在main中完成所有软硬初始化及所有任务创建

这是最简单也是最常用的方式。简单来说是这样:在main()中调用RTOS的初始化函数,中间初始化软硬件、创建其它任务,然后再调用启动os的API。以uCOS为例,如果采用这种方式,其初始化流程可能是这样的。

int main() {
    OSInit();
    DataInit();         // 初始化应用相关的数据
    HardwareInit();     // 初始化硬件模块
    CreateTask1();      // 创建任务1
    CreateTask2();      // 创建任务2
    OSStart();    
    return 0;
}

可以看到采用这种方式,在整个系统跑起来之前已经完成了所有任务的初始化,系统跑起来之后,各个任务就可以专注实现其要实现的功能。

但是这种方式有一个隐藏的缺陷:如果在初始化硬件模块时产生中断,且在中断服务函数中又调用了RTOS相关的API,则有可能导致系统崩溃。

原因是什么呢?

这是因为当前RTOS还没有跑起来,甚至于有些内核数据还没初始化好。此时如果发生中断,在中断中调用的RTOS的API可能访问这些内核数据,或者尝试执行只能在RTOS跑起来后执行的操作。

举个实际的例子,假设当前正在配置GPIO外部上沿升输入中断,刚刚开启中断配置使能后恰恰外部输入了一个上升沿信号(外部往往不可控),则立即进入GPIO中断处理函数中。在中断处理函数中,简单快速处理后向Task 1发送消息。发送完消息后,退出中断时会执行任务切换,尝试切换至Task 1,而此时当前还没有任务运行,那么此时应该怎样完成切换呢?

当然,不排除RTOS在设计时有考虑这种情况。但是你能确定所用的RTOS一定能正确处理这种异常问题吗?

所以,如果你的应用中可能会遇到这种问题,与其花时间研究是否能正确处理这种问题,倒不如直接采用方式一,这是最稳妥也最简单的方式。

总结

总结以上内容,可以看出方式一相对于方式二有着明显的优点:即系统启动之前不会受外部事件干扰的影响。

正是因为这样,我个人比较推荐第一种。目前,在有些RTOS的实现中,默认采用了方式一。其内部已经自动帮我们创建了一个初始任务,我们只需要额外实现一个其定义好的接口函数,然后在函数中添加软硬件初始化及其它任务的创建即可。

当然,实际在写代码时,采用的具体方式可能并不完全同上述两种方式,但基本流程差不太多。

该文章同时发布在:http://01ketang.cc/rtos/rtos-init.html

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

uCOS/FreeRTOS任务创建的两种模式 的相关文章

  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS-内核控制函数

    FreeRTOS 内核控制函数 FreeRTOS中有一些内核函数 一般来说这些内核函数在应用层不会使用 但是内核控制函数是理解FreeRTOS中断的基础 接下来我们逐一分析这些内核函数 taskYIELD 该函数的作用是进行任务切换 这是一
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • UCOS2的文件目录

    想着闲着也是闲着 把之前学习ucos2源码的笔记整理一下 复盘一次 总结内容将其写为博客作为学习的输出 一 为什么要学RTOS或者IOTOS 我在大一时 开始进入实验室接触单片机 摸爬滚打的参加了几次比赛 也因此入了嵌入式的坑 大三时开始思
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • FreeRTOS ------- 任务(task)

    在学习RTOS的时候 个人觉得带着问题去学习 会了解到更多 1 什么是任务 在FreeRTOS中 每个执行线程都被称为 任务 每个任务都是在自己权限范围内的一个小程序 其具有程序入口每个任务都是在自己权限范围内的一个小程序 其具有程序入口通
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站

随机推荐

  • jeecg-boot配置字典遇到的问题

    在online报表生成代码后 xff0c 配置的数据字典一直不生效 xff0c 显示空值最后在官方文档发现需要后端加一个注解 xff0c 如下图所示 xff1a 文档链接 xff1a http doc jeecg com 1273944
  • 配置pycharm 编译器时遇到的一些问题

    今天在配置完pycharm 编译器运行代码时 xff0c 突然出现一个报错 Fatal Python error Py Initialize unable to load the file system codec ImportError
  • chrome浏览器起始页被hao123劫持了怎么办?

    对于一个强迫症来说 xff0c 起始页被修改了 xff0c 真的很难受 hao123真的很烦 第一种情况 修改了你浏览器的默认起始页 xff0c 在设置中去修改就可以了 第二种情况 在这里面添加了他的网站 xff0c 删除或者从新生成一个快
  • COMODO杀毒软件Linux版

    科摩多Linux杀毒软件 CAVL 提供同样出色的防病毒保护 xff0c 同时附带一个额外的完全可配置的反垃圾邮件系统 具有按访问和按需求病毒扫描 xff0c CAVL还采用了基于云计算的对未知文件的分析 xff0c 针对零日恶意软件提供了
  • ubuntu系统下安装windows并引导双系统

    首先 xff0c 感谢wenbusy xff0c 给了我很大的帮助 xff0c 以下部分内容来自于该博主 windows系统安装ubuntu很容易 xff0c 但在ubuntu下如何安装windows构成双系统并成功引导 xff1f 本文来
  • 3.4 小乌龟git使用说明

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 安装二 使用步骤1 设置语言2 添加你的git 用户名和邮箱3 创建git空项目3 1 方法1 本地创建3 2 方法2
  • WinScp连接Win7

    本机安装WinScp 目标Win7安装OpenSSH 下载openSSH https github com PowerShell Win32 OpenSSH releases下载后解压放在C xff1a ProgramFiles目录下设置环
  • DEBIAN_FRONTEND noninteractive参数

    DEBIAN FRONTEND这个环境变量 xff0c 告知操作系统应该从哪儿获得用户输入 如果设置为 noninteractive xff0c 你就可以直接运行命令 xff0c 而无需向用户请求输入 xff08 所有操作都是非交互式的 x
  • RFC3630 - TE Extensions to OSPF Version 2中文

    Traffic Engineering TE Extensions to OSPF Version 2 该标准是RFC2370的更新 标准RFC2370是关于OSPFv2的Opaque LSA的扩展 xff0c 在被更新以后 xff0c 已
  • 【分享】免梯子的chatGPT,玩 ChatGPT 的正确姿势

    火了一周的 ChatGPT xff0c HG 不允许还有小伙伴不知道这个东西是什么 xff1f 简单来说就是 xff0c 你可以让它扮演任何事物 xff0c 据说已经有人用它开始了颜色文学创作 因为它太火了 xff0c 所以 xff0c 本
  • 使用Unity3D Physics来工作

    这个教程将教你如何用Unity3D构建一个小球击倒柴火堆的游戏 xff01 在这个过程中 xff0c 你将了解到关于使用物理引擎的重要性和你这么做后可以减少无数小时的手工动画的时间 继续阅读 xff01 有什么完整的现代游戏引擎会缺少物理引
  • 不想学挖掘机的厨师不是好程序员!

    程序员大部分学历都不高 xff1f 我想是的 xff0c 因为刚开始只要你会敲代码 xff0c 就能挣到钱的 相比于其他行业 xff0c 程序员的工资还是受很多人认可的 xff0c 我就是其中的一员 但是我们想往高处爬 xff0c 显然没有
  • 关于X射线球管的参数

    球管的规格参数包括结构参数和电参数两种 前者指球管结构所决定的各种参数 xff0c 如靶面的倾斜角度 有效焦点 外形尺寸 重量 管壁的滤过当量 阳极转速 工作温度和冷却形式等 电参数是指球管电性能的规格数据 xff0c 如灯丝加热电压和电流
  • [DSA] 决定数字血管造影系统综合性能的关键参数研究

    一 购买数字血管造影系统的目的 xff1a 放射介入学的出现 xff0c 彻底改变了放射学在医学中的地位 xff0c 使放射学不仅能够诊断 xff0c 而且能够治疗 xff0c 并将诊断与治疗有机的结合起来 xff0c 它已渗透到了临床学科
  • 软件的生命周期(软件工程各阶段的工作)

    其实软件工程是一个非常大的概念 xff0c 我们的软件测试也好 xff0c 软件开发也好 xff0c 软件运维也好 xff0c 其实都是属于软件工程的范畴 今天就讲一讲软件工程和我们软件测试相关的一些内容 我们今天三个主要的节点 xff1a
  • 查看磁盘分区UUID的四种方法

    查看磁盘分区 UUID 的四种方法 xff08 Helloblock 写作 xff09 1 使用 dev disk by uuid 目录 root 64 server ls l dev disk by uuid 总用量 0 lrwxrwxr
  • Lodash 核心 lodash

    baseCreate Object create ptoto propertiesObject 不能以名称而去定义该方法的作用 它并不只是为了创建一个对象 其可以理解为 34 创建一个继承了指定对象的对象 34 并且创建后的对象是不存在原型
  • MySql之索引

    索引 1 gt 什么是索引 xff1f 2 gt MySql的查询方式3 gt 索引的实现原理4 gt 索引应用在什么情况下5 gt 索引的创建 删除6 gt 索引的常见失败情况第一种情况即使添加了索引也不走索引的原因 第二种情况第三种情况
  • VNC远程管理配置

    其实配置VNC很简单 xff0c 只要运行vncserver就好了 运行完毕后 xff0c 它会在家目录生成 vnc目录 xff0c 里面最重要的一个文件是Xstartup 然后你可以使用vncviewer yourremotehost i
  • uCOS/FreeRTOS任务创建的两种模式

    在我们使用uCOS FreeRTOS编写代码时 xff0c 首先要面临的一个问题是怎样创建任务并启动整个系统 一般来说 xff0c 我们会有两种不同的方式 这两种方式不仅适用于uCOS FreeRTOS xff0c 同时也适用于其它RTOS