【正点原子】手把手教你学FreeRTOS-03

2023-05-16

基本内容:任务的创建、控制块、删除、挂起、恢复的使用

 创建任务函数的核心

栈的增长方向为向下的则portSTACK_GROWTH>0,而我们stm32使用的就是向下因此执行这个,下面的就是向上不执行

核心函数prvInitialiseNewTask()

 

 configCHECK_FOR_STACK_OVERFLOW > 1堆栈溢出监测,监测到剩余的空间,原理是:使用memset把当前任务的堆栈空间全部赋值为tskSTACK_FILL_BYTE值

#define tskSTACK_FILL_BYTE    ( 0xa5U ),只要值改变了,说明被使用了,那么就可以知道剩余多少了

 

pxTopOfStack是栈顶,pxNewTCB->pxStack 是首地址,此时的地址就是为栈顶了,向下从高地址-低地址

下面一句是八字节对齐,提高我们效率

 

 

把创建的任务的信息全部装入任务控制块 

 

 栈的保存内容,其实就是把各个寄存器的值保存下来,有些是硬件保存而有些是软件保存,软件是PSR\PC\LR\R0,其余的是硬件,源码的注释写清楚了

 

 PC保存的是任务函数的地址,而PC保存的是下一条执行的指令地址,因此此时PC的内容就是需要执行的函数地址

这些顺序是内核规定的,因此最好栈顶的位置其实是最后R4下面的地址,再下面就是起始地址,如果来了一个数据,那么栈顶向下移动

 

 

FreeRTOS - 免费的实时操作系统配置常量和配置选项 - 适用于小型实时嵌入式系统的免费开源实时操作系统学会看官方文档,学习所写知识。这是我们需要学习的函数

 疑问:为什么解挂的函数有两种,一种是中断一种是任务型的

void vTaskSuspend( TaskHandle_t xTaskToSuspend );
void vTaskResume( TaskHandle_t xTaskToResume );
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume );
typedef long BaseType_t;

挂起不支持嵌套,多次挂起,一次恢复就可以了,但是

调用了多少次 vTaskSuspendAll() 函数就必须同样调用多少次 xTaskResumeAll() 函数。 

两个函数是不一样的,后者的支持嵌套

 

使用 xTaskResumeFromISR()的时候有几个需要注意的地方:

  1. 当函数的返回值为 pdTRUE 时:恢复运行的任务的优先级等于或高于正在运行的任务,表明在中断服务函数退出后必 须进行一次上下文切换 , 使用 portYIELD_FROM_ISR() 进行上下文切换。当函数的返回值为 pdFALSE 时:恢复运行的任务的优先级低于当前正在运行的任务,表明在中断服务函数退出后不需 要进行上下文切换。
  2. xTaskResumeFromISR() 通常被认为是一个危险的函数,因为它的调用并非是固定的,中断可能随时来来临。所以 xTaskResumeFromISR()不能用于任务和中断间的同步,如果中断恰巧在任务被挂起之前到达,这就会导致一次中断丢失(任务还没有挂起,调用 xTaskResumeFromISR()函数是没有意义的,只能等下一次中断)。这种情况下,可以使用信号量或者任务通知来同步就可以避免这种情况。

 不能用于任务和中断间的同步理解方式为:

中断中:flag = 1;

任务中:if(flag == 1)        fun();

 在文件中有这样一段英文介绍--大致内容其实就是:如果你想在中断中使用API函数(如xTaskResumeFromISR)那么你需要保证你的中断函数的优先级是在FreeRTOS的管理范围内,这里的管理范围一般是5-15,数值越高,优先级越低,0-4是紧急中断(操作系统不管理的中断)

之所以有这个,是因为临界段保护-需要屏蔽中断,屏蔽中断的范围就是5-15(可以自己调)

项目:按键、EXTI中断、LED 

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

【正点原子】手把手教你学FreeRTOS-03 的相关文章

  • FreeRTOS快速上手

    FreeRTOS使用 一 源码下载和移植文件提取 1 1 源码下载 在网站https sourceforge net projects freertos 可以找到freertos最新的源码 1 2 移植文件提取 根据第一步 我们会得到一个f
  • 如何搭建C语言环境

    以下文章来源于 公 众 号开源电子网 读取更多技术文章 请扫码关注 如何搭建C语言环境 前言 C语言作为嵌入式开发的必备掌握技能 嵌入式能力的提升速度很大程度在于C语言的掌握能力 正所谓 工欲善其事 必先利其器 学习C语言 第一件动手的事情
  • 【正点原子FPGA连载】 第三十二章基于lwip的TCP服务器性能测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    第三十二章基于lwip的TCP服务器性能测试实验 上一章的lwip Echo Server实验让我们对lwip有一个基本的了解 而Echo Server是基于TCP协议的 TCP协议是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计
  • FreeRTOS-内核控制函数

    FreeRTOS 内核控制函数 FreeRTOS中有一些内核函数 一般来说这些内核函数在应用层不会使用 但是内核控制函数是理解FreeRTOS中断的基础 接下来我们逐一分析这些内核函数 taskYIELD 该函数的作用是进行任务切换 这是一
  • 【正点原子FPGA连载】 第三十一章 交通灯实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1 实验平台 正点原子领航者ZYNQ开发板 2 平台购买地址 https item taobao com item htm id 606160108761 3 全套实验源码 手册 视频下载地址 http www openedv com th
  • Freertos中vTaskDelay()是怎么用的

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • freeRTOS手册 第六章 . 中断管理

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

    FreeRTOS临界区是指那些必须完整运行 不能被打断的代码段 比如有的外设的初始化需要严格的时序 初始化过程中不能被打断 FreeRTOS 在进入临界区代码的时候需要关闭中断 当处理完临界区代码以后再打开中断 FreeRTOS 系统本身就
  • FreeRTOS记录(九、一个裸机工程转FreeRTOS的实例)

    记录一下一个实际项目由裸机程序改成FreeRTOS 以前产品的平台还是C8051单片机上面的程序 硬件平台改成了STM32L051 同时使用STM32CubeMX生成的工程 使用FreeRTOS系统 EEPROM数据存储读取函数修改更新 2
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • FreeRTOS学习---“定时器”篇

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

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

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

随机推荐

  • kali安装中文版firefox浏览器(安装包安装)

    kali安装中文版firefox浏览器 在官网上下载linux版本的安装包 firefox官网地址 下载好后将整个压缩包直接拖到虚拟机里 进入你放压缩包的位置进行解压 1 cd span class token operator span
  • 【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)

    目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数 xff1a FIO结果说明 I O 的重放 xff08 39 录 39 下实际工况的IO xff0c 用fio 39 重放 39 xff09 fi
  • linux系统启动流程,linux系统启动不了,启动出错怎么办?不小心把boot分区删了怎么办?

    linux系统启动出错 linux系统启动流程启动问题以及解决方法第一种情况 xff1a 磁盘引导数据丢失 xff08 即mbr数据丢失 xff09 第二种情况 xff1a grub2引导文件grub cfg丢失第三种情况 xff1a 开机
  • 怎么在linux和windows之间实现文件共享?

    windows与linux共享文件 windows端共享文件夹 61 61 windows端访问windows共享的文件夹 xff1a 61 61 61 61 linux端访问windows共享的文件夹 xff1a 61 61 linux端
  • Docker容器(1):安装docker,上线简单的2048,马里奥小游戏

    Docker基础知识 可以参考上一篇文章Docker基础知识 安装并启动Docker 实验环境 xff1a server5主机部署docker ip xff1a 172 span class token punctuation span 2
  • Docker网络详解

    Docker网络 Docker网络架构libnetwork中的5种内置驱动Docker原生网络bridge模式host模式none模式 Docker自定义网络创建自定义网桥bridge如何让不同网段的容器可以相互通信 Docker基础知识可
  • Kubernetes(k8s)之Volume(卷)

    Volume k8s中的volume为什么要用volumevolume特点K8s支持多种类型的Volume演示环境emptyDir卷多容器共享卷emptyDir卷缺点 hostPath 卷hostPath卷应用场景使用hostPath卷时
  • Kubernetes(k8s)之在集群环境部署Prometheus(普罗米修斯监控)和集群的ui管理工具Grafana

    Prometheus Prometheus演示环境部署Prometheus和Grafana测试 Prometheus Prometheus是一个开源系统监控和警报工具包 现在是一个独立的开源项目 xff0c 独立于任何公司进行维护 Prom
  • 用OpenStack搭建简单的云平台并启动云主机

    OpenStack OpenStack简介OpenStack重要集成组件OpenStack平台部署部署环境建立虚拟机 配置时间同步安装OpenStack安装 RabbitMQ 消息队列服务Memcached缓存令牌的安装安装和配置OpenS
  • python实现快速排序、归并排序

    时间复杂度平均为nlogn 快速排序快速排序代码 xff1a 归并排序归并排序代码 xff1a 快速排序 快速排序算法有两个核心点 xff0c 分别为 哨兵划分 和 递归 哨兵划分操作 xff1a 以数组某个元素 xff08 一般选取首元素
  • pycharm常用快捷键

    常用快捷键 复制粘贴撤销就不用我说了吧复制选中行并在该行下粘贴批量注释多行缩进多行删除缩进全局关键字搜索该页关键字搜索查看内置函数源码该函数被哪里引用按文件名搜索py文件按文件名搜索所有类型的文件 复制粘贴撤销就不用我说了吧 复制 xff1
  • linux源码安装python3

    python3源码安装 前置环境解压提前解决依赖性源码编译三部曲验证安装 前置环境 先要准备好源码包 xff0c 去官网下载自己想要的版本https www python org ftp python 我下的是3 9 7的直接下到了要安装p
  • 【shell】用 grep 查找包含字符串的文件|grep 过滤|取匹配行的前后n行

    目录 即可即用 grep 匹配多个关键字 与find的不同 grep检索文件内容详解 grep指定搜索的文件类型 grep 不起作用 xff1f 过滤了还是显示 匹配特定的列 指定在哪些文件 哪类文件 哪个目录里搜索 搜索时包含 排除哪类文
  • 基于FreeRTOS+STM32实践-01

    目的 xff1a 复习FreeRTOS以及STM32的使用 xff0c 完成51单片机到stm32的过渡 该项目会与传感器以及其他种类的外设相联系 xff0c 以提升代码管理能力和逻辑能力 在51单片机中我们使用了很多传感器和外设 xff0
  • C++点亮stm32LED灯

    目的 xff1a 引导初学者使用C 43 43 对STM32进行编程 1 xff1a 在C语言中我们没有封装 继承 多态的概念 xff0c 没有面向对象的程序思想 这些思想一般是源于C 43 43 语言的 xff0c C语言是面向过程的语言
  • 基于FreeRTOS+STM32实践-02

    按键学习 按键常见的为独立按键和行列按键 stm32中不存在Bit类型数据 而在51内核中存在bit类型的 按键引脚分配 开发板自带3个独立按键 xff1a KEY0 PC5 KEY1 PA15 WK UP PA0 行列键盘引脚分配 xff
  • 基于FreeRTOS+STM32实践-03

    03 xff1a 按键的扫描 资源 xff1a 软件定时器 43 信号量 43 消息队列 在51单片机中的按键扫描是 xff1a 标志位在10ms定时器1的中断中置一 xff0c 在while 1 中写一个如下的按键扫描程序 xff0c 目
  • 【正点原子】手把手教你学FreeRTOS-01

    内容为 xff1a 正点原子FreeRTOS的视频前1 8 目的 xff1a 简单的回忆一下 xff0c 加深印象和理解 单片机的发展趋势 操作系统的核心就是 任务调度器 xff0c 关于这些特点 xff0c 也是我们学习FreeRTOS的
  • 【正点原子】手把手教你学FreeRTOS-02

    内容为 xff1a 正点原子FreeRTOS的视频第9 10节 一个任务所需要的资源这些东西在标准库需要我们自己写 xff0c 但是在MX软件中可以自己生成 四项基本 xff1a 优先级 堆栈大小 句柄 任务函数声明 一个XXX任务需要的资
  • 【正点原子】手把手教你学FreeRTOS-03

    基本内容 xff1a 任务的创建 控制块 删除 挂起 恢复的使用 创建任务函数的核心 栈的增长方向为向下的则portSTACK GROWTH gt 0 而我们stm32使用的就是向下因此执行这个 xff0c 下面的就是向上不执行 核心函数p