首页 > 其他分享 >FreeRTOS学习随记-2

FreeRTOS学习随记-2

时间:2024-11-25 15:04:33浏览次数:7  
标签:queue handle FreeRTOS 队列 void 学习 任务 NULL 随记

05-2_创建任务函数的进一步实验

  • 创建的任务传入handle,之后通过handle引用任务或者删除任务。
  • 空闲任务释放堆和栈
  • 同一个函数可以创建不同的任务,因为他们对应的栈不同,每个任务有自己的栈,互不影响
  • 如何确定任务需要多大的栈空间需要你研究

直播四小时讲解栈

  • 任务--定义
    • 运行起来的函数
    • 不仅仅是一个函数或者代码,
    • 运行的位置
    • 运行的环境
  • arm架构汇编
    • Flash中存取着指令和汇编码
    • cpu读Flash得到指令,然后再执行指令
    • SP就是指的栈
    • LR表示返回地址
    • PC表示当前指令地址
  • CPU虽然强大,但是还是要靠指令取指挥他,指令保存在Flash上,即机器码
    • 由汇编码得到机器码
  • PUSH入栈,入栈的本质就是写内存
  • POP是读内存
  • 硬件中断
    • 硬件保存一部分reg
    • 软件要保存一部分用到的reg
  • 任务切换中是保存全部reg
  • 句柄---结构体指针
  • 每个任务都有自己的栈
    • 栈的大小依赖
      • 局部变量
      • 调用深度
    • 栈的分配
      • FreeRTOS划分出一个巨大的数组给栈分配
  • 高优先级不执行完,低优先级任务永远无法执行
  • 同等优先级任务轮流执行:时间片轮转
  • TICK中断进行任务调度
    • 间隔可以配置,一般为1ms
    • 产生中断就调用tick中断函数
      • 取出下一个任务
      • 切换任务
        • 保存当前任务
        • 回复新Task
  • 同是0优先级,空闲任务会礼让其他任务

06-1_任务状态理论讲解

06-3_vTaskDelay和vTaskDelayUntil

  • vTaskDelay是任务暂停的时间是固定的
  • vTaskDelayUntil让任务周期性执行,总的运行暂停时长是固定的

自杀与他杀

  • 自杀不能清理尸体,需要空闲任务清理并释放栈
  • 他杀,凶手处理尸体,释放栈
  • 空闲任务只能是running或者ready状态

任务调度算法

  • 时间片轮转可以配置
  • 是否支持抢占也可以配置
  • 空闲任务是否yield别人

同步与互斥

  • 同步比较浪费CPU资源
    • 再等待的时候让当前任务进入阻塞状态
  • 全局变量实现互斥的变量切换时间太长了

08-1_队列的理论讲解

  • 队列---传送带
  • 队列要有存放数据的缓冲区
    • 指针就是buffer
  • 等待数据的写入(没有空间)和读取(没有数据)
  • 优先级高的先读取
  • 同优先级等待时间长的先读取

08-2_队列的常规使用

  • 队列实现同步,读取数据,最后一千万计数为1.3s
  • 队列可以理解为一个容器,你放进去东西,别人能取到东西,就代表能使用,取不到东西就代表不能使用
  • 释放这个队列就把东西放到这个容器里,让别人能取到。
  • 创建队列可以指定
    • 多少个元素
    • 每个元素的大小
  • 队列实现互斥
    • 向你创建的互斥队列中写入数据
    • 读取到数据就代表获取了这个东西,不需要考虑写入了啥数据
    • task1是ready,但是task2是running
      • 可以通过vTaskDelay让task2主动放弃
      • 或者通过taskYIELD(),这个更优
      • 或者设置不同的优先级
  • 传输的时候可以选择结构体struct加入ID,然后区分数据源谁传入的。
  • 数据量过大直接传输地址最快。
  • 队列中可以传入数据,数据要么是值要么是地址

08-3_队列集(Queue Set)

  • 队列集中放的是队列,每个队列中放的是其分组的数据。

  • 队列集实际上也是个队列。

  • 每个队列的handle指向队列集。

  • 读一次queue set,就会读一次queue

  • 例子

    static QueueHandle_t xQueueHandle1;
    static QueueHandle_t xQueueHandle2;
    static QueueSetHandle_t QueueSet;
    
    /*-----------------------------------------------------------*/
    void xTask1Function(void * param)
    {
        int i = 0;
    
        while(1)
        {
            xQueueSend(xQueueHandle1, &i, portMAX_DELAY);
            i++;
            vTaskDelay(10);
        }
    }
    /*-----------------------------------------------------------*/
    void xTask2Function(void * param)
    {
        int i = -1;
        while(1)
        {
            xQueueSend(xQueueHandle2, &i, portMAX_DELAY);
            i--;
            vTaskDelay(20);
        }
    }
    /*-----------------------------------------------------------*/
    void xTask3Function(void * param)
    {
        QueueSetMemberHandle_t handle;
        int i;
        while(1)
        {
            /* 1. read queue set: which queue has data */
            handle = xQueueSelectFromSet(xQueueSet1, portMAX_DELAY);
            /* 2. read queue */
            xQueueReceive(handle, &i, 0);
            /* 3. print */
            printf("get data : %d\r\n", i);
        }
    }
    /*-----------------------------------------------------------*/
    
    int main( void )
    {
    
    #ifdef DEBUG
      debug();
    #endif
    
        prvSetupHardware();
        /* 1. 创建2个queue */
        xQueueHandle1 = xQueueCreate(2, sizeof(int));
        if(xQueueHandle1)
        {
            printf("create queue1 fail\r\n");
        }else
        {
        }
        xQueueHandle2 = xQueueCreate(2, sizeof(int));
        if(xQueueHandle2)
        {
            printf("create queue2 fail\r\n");
        }else
        {
        }
        /* 2. 创建queue set */
        xQueueSet1 = xQueueCreateSet(4);
        /* 3. 把2个queue添加进queue set */
        xQueueAddToSet(xQueueHandle1, xQueueSet1);
        xQueueAddToSet(xQueueHandle2, xQueueSet1);
        /* 4. 创建三个任务 */
        xTaskCreate(xTask1Function, "Task 1", 100, NULL, 1, NULL);
        xTaskCreate(xTask2Function, "Task 2", 100, NULL, 1, NULL);
        xTaskCreate(xTask3Function, "Task 3", 100, NULL, 1, NULL);
    
    
        /* 启用任务调度器 */
        vTaskStartScheduler();
    
    	/* Will only get here if there was not enough heap space to create the
    	idle task. */
    	return 0;
    }
    
    
  • 队列集能让你统筹的管理队列,不用一个个的去处理每个队列。让你能随时从每个队列中获取数据,同一件事情的不同处理方式,那个方式输入进来,相应那个方式。

09-1_信号量的理论讲解

  • 信号量不能传输数值,只能表示资源的数量。
  • 信号量为正数,且能限制最大值
  • 步骤
    • 创建一个结构体Semaphpre
    • give/take函数构建
  • 二进制信号量和技术型信号量

标签:queue,handle,FreeRTOS,队列,void,学习,任务,NULL,随记
From: https://www.cnblogs.com/wuangmingyu/p/18567516

相关文章

  • FreeRTOS学习随记-1
    1-扩展讲解变量与指针RAM-read/writeROM-readonlymap文件可以看变量的地址和大小不管指针还是普通变量,都是变量,在内存中就需要一个地址存放、const是个常量,在rom中char一个字节指针对于32位处理器来说,他保存的是个地址,所以一定是4字节/32位的,不管他的类......
  • ssm毕设在线学习考试程序+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着信息技术的飞速发展,互联网在教育领域的应用日益广泛。在线学习考试系统逐渐成为现代教育和企业培训等领域不可或缺的一部分。传统的学习和考......
  • Linux—进程概念学习-03
    目录Linux—进程学习—31.进程优先级1.1Linux中的进程优先级1.2修改进程优先级—top2.进程的其他概念3.进程切换4.环境变量4.0环境变量的理解4.1环境变量的基本概念4.2添加环境变量—export4.3Linux中环境变量的由来4.4常见环境变量4.5和环境变量相关的命令4.6通过系统......
  • NLP论文速读(ECCV2024)|面向文生图的Parrot优化的多奖励强化学习
    论文速读|Parrot:Pareto-optimalMulti-RewardReinforcementLearningFrameworkforText-to-ImageGeneration论文信息:简介:   本文背景是文本到图像(Text-to-Image,T2I)生成领域,这是一个旨在根据给定的文本提示生成相应图像的技术领域。尽管该领域取得了显著进......
  • 【人工智能】基于PyTorch的深度强化学习入门:从DQN到PPO的实现与解析
    《PythonOpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!深度强化学习(DeepReinforcementLearning)是一种结合深度学习和强化学习的技术,适用于解决复杂的决策问题。深度Q网络(DQN)和近端策略优化(PPO)是其中两种经典的算法,被广泛应用于游戏、机器人控制等任务中。本......
  • 一键擦除手写笔迹,试试这款省时省力的学习利器
    凡是给小朋友辅导过功课,或是自己有过考证经验的朋友,想必都对成沓成堆的书本、习题册、试卷、资料不太陌生。尽管电子化办公已逐渐走向成熟,“笔头”和“案卷”仍然是大家成长过程中必经的一环。与之相伴的,是涂改得花花绿绿、覆满字迹的纸页。当作业和试卷批改完,需要整理错题、二次......
  • swagger学习
    swagger 支持基于API自动生成接口文档,接口文档始终与API保持同步,一、引入依赖:<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>3.0.0</version></dependency><dependency>......
  • FreeRTOS 任务管理
    文章目录一、任务管理基础任务创建任务优先级任务状态管理二、任务管理实例LED闪烁任务按键检测任务任务创建与调度FreeRTOS任务管理实例一、任务管理基础在FreeRTOS中,任务(Task)是RTOS调度的基本单位。每个任务都是一个独立的函数,执行特定的功能。FreeRTOS通过......
  • FreeRTOS 任务挂起和恢复实验
    文章目录一、实验原理二、实验步骤创建任务:实现任务挂起:实现任务恢复:编写测试代码:三、实验代码示例四、实验结果与分析FreeRTOS任务挂起和恢复实验一、实验原理在FreeRTOS中,任务挂起是指将一个正在运行或等待运行的任务置于挂起状态,使其暂时不参与调度,从而暂停......
  • sql学习~
    一.mysql数据模型二.sql简介三、mysql通用语法1.注释单行注释。--内容(注意空格)多行注释。/*内容*/2.不区分大小写3.分号结尾。四、sql分类1.DDL1>进入mysqlmysql-uroot-p+密码2>操作数据库查询数据库showdatabases;创建数据库createdatabase数据库名称......