基于Ubuntu的嵌入式开发练习(十)FreeRTOS的移植和设计一个基本的多任务程序

2023-05-16

如有错误,欢迎指正,谢谢!

目录

  • 一、FreeRTOS的移植
  • 二、建立一个基本的多任务程序
    • 1、实验要求
    • 2、代码设计
    • 3、执行效果

一、FreeRTOS的移植

  1. 教程(视频):野火 FreeRTOS视频教学 配套书籍《FreeRTOS内核实现与应用开发实战指南》配套例程源码

  2. 流程图
    在这里插入图片描述

  3. 提取最简源码
    包含以下部分
    在这里插入图片描述
    首先要确定自己的芯片类型,我才用的是野火指南者,故采用ARM_CM3中的文件。
    各个文件的来源如下:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述最好还要把FreeRTOS.h加入我们模板的user中,
    在这里插入图片描述
    按先前的图片的顺序加入文件夹,并导入keil中

  4. 设置对应的路径
    在这里插入图片描述

  5. 将模板的文件stm32f10x_it.c中的以下两个函数注释掉
    在这里插入图片描述

  6. 将FreeRTOSConfig.h进行配置(我也不知道配置了个啥,大致就是用野火的文件把官方文档中的替换掉)

二、建立一个基本的多任务程序

1、实验要求

在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:task1,每间隔500ms闪烁(变化)一次LED;task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
注:目前还没有买AHT20芯片,故先执行2个task,去掉传感器部分

2、代码设计

1、功能代码

LED模块:

static void LED1_Task(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);   /*延时500ms*/
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);    /*延时500ms*/	
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}

发送模块:

static void send_Task(void* parameter)
{	
    while (1)
    {
      	Usart_SendString( DEBUG_USARTx,"hello world!\n");   
				vTaskDelay(2000);    /*延时2000ms*/	
    }
}

任务管理模块:

static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;/* ¶¨ÒåÒ»¸ö´´½¨ÐÅÏ¢·µ»ØÖµ£¬Ä¬ÈÏΪpdPASS */
  
  taskENTER_CRITICAL();           //½øÈëÁÙ½çÇø
  
  /* ´´½¨LED_TaskÈÎÎñ */
  xReturn = xTaskCreate((TaskFunction_t )LED1_Task, /* ÈÎÎñÈë¿Úº¯Êý */
                        (const char*    )"LED_Task",/* ÈÎÎñÃû×Ö */
                        (uint16_t       )512,   /* ÈÎÎñÕ»´óС */
                        (void*          )NULL,	/* ÈÎÎñÈë¿Úº¯Êý²ÎÊý */
                        (UBaseType_t    )2,	    /* ÈÎÎñµÄÓÅÏȼ¶ */
                        (TaskHandle_t*  )&LED1_Task_Handle);/* ÈÎÎñ¿ØÖÆ¿éÖ¸Õë */
  if(pdPASS == xReturn)
    printf("´´½¨LED1_TaskÈÎÎñ³É¹¦!\r\n");
  
	/* ´´½¨send_TaskÈÎÎñ */
  xReturn = xTaskCreate((TaskFunction_t )send_Task, /* ÈÎÎñÈë¿Úº¯Êý */
                        (const char*    )"send_Task",/* ÈÎÎñÃû×Ö */
                        (uint16_t       )512,   /* ÈÎÎñÕ»´óС */
                        (void*          )NULL,	/* ÈÎÎñÈë¿Úº¯Êý²ÎÊý */
                        (UBaseType_t    )3,	    /* ÈÎÎñµÄÓÅÏȼ¶ */
                        (TaskHandle_t*  )&send_Task_Handle);/* ÈÎÎñ¿ØÖÆ¿éÖ¸Õë */
  if(pdPASS == xReturn)
    printf("´´½¨send_TaskÈÎÎñ³É¹¦!\r\n");
  
  vTaskDelete(AppTaskCreate_Handle); //ɾ³ýAppTaskCreateÈÎÎñ
  
  taskEXIT_CRITICAL();            //Í˳öÁÙ½çÇø
}

不知道为啥keil复制粘贴注释过来会乱码,再附上下图,方便查看注释
在这里插入图片描述主函数:
在这里插入图片描述

int main(void)
{	
  BaseType_t xReturn = pdPASS;/* ¶¨ÒåÒ»¸ö´´½¨ÐÅÏ¢·µ»ØÖµ£¬Ä¬ÈÏΪpdPASS */

  /* ¿ª·¢°åÓ²¼þ³õʼ»¯ */
  BSP_Init();
  printf("ÕâÊÇÒ»¸ö[Ò°»ð]-STM32ȫϵÁпª·¢°å-FreeRTOS-¶¯Ì¬´´½¨¶àÈÎÎñʵÑé!\r\n");
   /* ´´½¨AppTaskCreateÈÎÎñ */
  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* ÈÎÎñÈë¿Úº¯Êý */
                        (const char*    )"AppTaskCreate",/* ÈÎÎñÃû×Ö */
                        (uint16_t       )512,  /* ÈÎÎñÕ»´óС */
                        (void*          )NULL,/* ÈÎÎñÈë¿Úº¯Êý²ÎÊý */
                        (UBaseType_t    )1, /* ÈÎÎñµÄÓÅÏȼ¶ */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* ÈÎÎñ¿ØÖÆ¿éÖ¸Õë */ 
  /* Æô¶¯ÈÎÎñµ÷¶È */           
  if(pdPASS == xReturn)
    vTaskStartScheduler();   /* Æô¶¯ÈÎÎñ£¬¿ªÆôµ÷¶È */
  else
    return -1;  
  
  while(1);   /* Õý³£²»»áÖ´Ðе½ÕâÀï */    
}

3、执行效果

在这里插入图片描述在这里插入图片描述

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

基于Ubuntu的嵌入式开发练习(十)FreeRTOS的移植和设计一个基本的多任务程序 的相关文章

  • 【Java】Java的类加载器和双亲委派模型

    文章目录 类加载器双亲委派模型 类加载器 对于任意一个类 xff0c 都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性 xff0c 每一个类加载器 xff0c 都有一个独立的类名称空间 比较两个类是否 34 相等
  • 【git】说说git的基础命令

    git的基础命令 命令名称作用git config global user name 用户名设置用户签名git config global user email 邮箱设置用户签名git init初始化本地库git status查看本地库状态
  • 【maven】maven基础知识入门

    maven 文章目录 maven什么是maven为什么使用maven项目构建过程的几个主要环节maven核心概念如何通过坐标到仓库中查找jar包 什么是maven Maven 是 Apache 软件基金会组织维护的一款自动化构建工具 xff
  • 【spring】说说spring的IOC与DI

    说说spring的IOC与DI 文章目录 说说spring的IOC与DIid属性和name属性标签scope Bean的作用范围Spring xff0c 配置生成Bean的三种方式Sping 的 Bean属性注入Sping的Bean属性通过
  • ffmpeg时间戳相关函数

    1 概述 ffmpeg中与时间戳相关的函数主要有 xff1a av rescale q xff0c av rescale q rnd xff0c av compare ts av rescale q span class token cla
  • 【计算机网络】网线规格的鉴别与接线方法

    网线规格的鉴别与接线发送 文章目录 网线规格的鉴别与接线发送一 怎么判断网线类型 xff1f 二 制作网线标准三 屏蔽类型四 使用场景五 米数标记接线方法 一 怎么判断网线类型 xff1f 可以根据网线外皮的标识来判断 xff0c 正规厂商
  • 【Java】说说spring-jdbc和spring事务管理

    文章目录 说说spring jdbc和spring事务管理spring jdbc1 配置数据源2 使用jdbcTemplete3 在dao层使用jdbcTemplete 外部配置方式新建配置文件jdbc properties修改数据源配置部
  • 【微服务】springcloud-dubbo,springCloudAlibaba服务调用使用dubbo

    springcloud dubbo xff0c springCloudAlibaba服务调用使用dubbo 文章目录 springcloud dubbo xff0c springCloudAlibaba服务调用使用dubbo添加依赖配置具体
  • 【项目实战】spring boot中使用webSocket

    spring boot中使用webSocket 文章目录 spring boot中使用webSocket引入依赖支持配置类接口类前端连接方式前端信息发送方式 引入依赖 需要在基础的spring boot web项目项目中添加下面一个依赖 x
  • 【项目复盘】springboot项目中使用mybatis-plus进行分页

    springboot项目中使用mybatis plus进行分页 文章目录 springboot项目中使用mybatis plus进行分页引入依赖配置类实体类持久层业务层 引入依赖 span class token generics span
  • 【项目复盘】javax.validation的简单使用

    javax validation的简单使用 javax validation需要与hibernate validator配合使用 validation bean 是基于JSR 303标准开发出来的 xff0c 使用注解方式实现 xff0c
  • 【项目复盘】springboot中使用swagger生成接口文档并配置bootstrap主题

    springboot中使用swagger生成接口文档并配置bootstrap主题 引入依赖 span class token generics span class token punctuation lt span dependency
  • 【项目复盘】微服务网关GateWay过滤

    微服务网管过滤 新建一个过滤类 span class token annotation punctuation 64 Component span span class token comment 过滤器的执行优先级 返回值越小 执行优先级
  • 【项目实战】Winodws下使用ELK搭建日志分析框架

    项目实战 Winodws下使用ELK搭建日志分析框架 ELK是什么 xff1a 引用官网的一句话 xff1a 核心产品包括 Elasticsearch Kibana Beats 和 Logstash xff08 也称为 ELK Stack
  • java_网络编程知识

    day11 网络编程 主要内容 软件架构CS xff0f BS网络通信三要素TCP通信Socket套接字ServerSocket 学习目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类名称 能够编写TCP协议下字符串数据传
  • AvFrame和AvPacket

    在FFmpeg中 未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存 针对视频编码器 其流程为从数据源获取图像格式的输入数据 保存为AVFrame对象并传入编码器 从编码器输出AVPacket结构 1 AVFr
  • 基于FreeRTOS的stm32程序初始化底层搭建(hal库)

    采用嵌入式实时操作系统 RTOS 可以更合理 更有效地利用CPU的资源 xff0c 简化应用软件的设计 xff0c 缩短系统开发时间 xff0c 更好地保证系统的实时性和可靠性 FreeRTOS是一个迷你的实时操作系统内核 作为一个轻量级的
  • ceres小结 -- vins为例

    从 typora 复制的 排版有问题 见谅 在estimator cpp文件里 这个函数 void Estimator optimization 1 声明problem ceres Problem problem 2 引入核函数loss f
  • JavaScript操作表格及CSS样式

    概述 在前端开发中 xff0c 表格主要用于存储结构化的数据 xff0c CSS主要用于修饰DOM元素 xff0c 如何通过DOM来操作表格及CSS呢 xff1f 本文主要通过一些简单的小例子 xff0c 简述DOM对表格和CSS的常见操作
  • 转:Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后 xff0c 不可避免的要拆分成多个子模块 xff0c 我们希望各个子模块有独立的版本管理 xff0c 并且由专门的人去维护 xff0c 这时候我们就要用到git的submodule功能 常用命令 span c

随机推荐

  • Linux/c++服务器开发方向的重点

    作者 xff1a NULL 链接 xff1a https www zhihu com question 37247264 answer 2352680534 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c
  • Prometheus之Dockerfile编写、镜像构建、容器启动

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 目录 从官方镜
  • Java的接口调用

    最近在观看一个Android开发中 xff0c 有一个问题百思不得其解 xff0c 就是从Fragment传数据回Activity和Activity传数据到Fragment中 xff0c bundle其实刚开始还是理解的 xff0c 但是当
  • X86实模式与保护模式简介

    0 引言 从80386开始 xff0c CPU有三种工作方式 xff1a 实模式 xff0c 保护模式和虚拟8086模式 v86模式 只有在刚刚启动的时候是real mode xff0c 等到操作系统运行起来以后就切换到protected
  • (1)VisDrone无人机目标检测数据集介绍

    数据集介绍 官网 xff1a http aiskyeye com VisDrone数据集 xff0c 包含了10个类 xff08 即行人 人 汽车 面包车 公共汽车 卡车 汽车 自行车 遮阳三轮车和三轮车 xff09 无人机计算机视觉相关检
  • 简单的shell编程的语法

    shell 1 span class token punctuation span 脚本以 span class token comment bin bash 开头 span span class token comment 脚本的常用执行
  • 使用c++模板的优点和缺点

    作为C 43 43 语言的新组成部分 xff0c 模板引入了基于通用编程的概念 通用编程是一种无须考虑特定对象的描述和发展算法的方法 xff0c 因此它与具体数据结构无关 但在决定使用C 43 43 模板之前 xff0c 让我们分析一下使用
  • kalibr 进行相机单目、双目标定全流程

    一 部署kalibr环境 docker 步骤 xff1a 参考链接 xff1a Installation ethz asl kalibr Wiki GitHub Docker操作知识 xff1a Docker攻略 xff1a 从安装到入门到
  • kalibr源码阅读参考

    Kalibr简介 xff1a Kalibr是一个用于标定多相机系统和IMU xff08 惯性测量单元 xff09 的开源工具包 xff0c 旨在提供一套完整的 易于使用的标定工具 它是ETH Zurich自主飞行系统实验室的一个项目 xff
  • QT5.11.1下的DirectShowPlayerService::doRender: Unresolved error code 0x80040266 ()报错)

    64 TOC QT5 11 1下的DirectShowPlayerService doRender Unresolved error code 0x80040266 报错 1 实验环境 实验环境 xff1a xff08 1 xff09 QT
  • GPS定位中的卡尔曼滤波算法

    卡尔曼滤波 xff1a 卡尔曼滤波由预测和校正两部分组成 预测部份又称时间更新过程 xff0c 是在上一个历元 k 1 状态估计值的基础上 xff0c 利用系统的状态方程来预测当前历元 k 的状态值 校正部分又叫测量更新过程 xff0c 它
  • 古月居ROS21讲入门(10)发布者Publisher的编程实现(源代码详解)

    发布者Publisher的编程实现 源代码详解 一 话题模型二 创建learning topic功能包三 实现一个发布者1 初始化ROS节点2 注册节点信息3 创建消息数据 四 配置CMakeLists txt中的编译规则五 编译并运行发布
  • STM32自学笔记串口DMA发送/接收 FIFO 突发模式

    参考博文 串口发送TXPA9DMA2 Stream7通道4正常模式串口发送RXPA10DMA2 Stream5通道4循环模式 串口波特率115200 PA9 PA10复用输出 注意点 串口接受数据dma方式不能开启串口接受中断 Dma双缓冲
  • 【STM32】标准库-自定义BootLoader

    Bootloader bootloader其实就是一段启动程序 xff0c 它在芯片启动的时候最先被执行 xff0c 可以用来做一些硬件的初始化或者用作固件热更新 xff0c 当初始化完成之后跳转到对应的应用程序中去 bootloader程
  • 【数据结构】使用结构体指针时需要使用malloc

    如果定义一个结构体类型的普通变量 xff0c 可以不malloc动态申请内存 xff0c CPU会为这个结构体变量分配内存 如果定义的是一个结构体的指针 xff0c CPU会为这个指针开辟内存 xff0c 但是此时这个大小是4 xff08
  • fwrite乱码问题

    我们这里数据格式为 201911606 liu 1 1 1 2 99 201911607 wang 1 2 1 3 98 fwrite写入文件是二进制代码形式 xff0c 所以用文本打开为乱码 xff0c 这时候我们可以用fprintf代替
  • ubuntu下使用kazam录屏与视频解码(亲测视频在windows可用)

    Ubuntu中难免会使用录屏软件记录试验过程 xff0c 本博客采用kazam软件录屏 xff0c 并将录屏软件解码 xff0c 解码文件可以复制到windows使用 1 kazam安装 安装命令 xff1a span class toke
  • 高通MSM8998芯片数据资料参考

    高通MSM8998芯片数据资料参考 今日分享是高通MSM8998芯片的基础知识 xff0c 现在分享是比较基础的资料 xff0c 还有其他的项目案例和参考资料找个时间再分享出来 xff0c 资料都在闯客网技术论坛上 xff0c 也是可以免费
  • 深度学习中epoch,batch的概念--笔记

    深度学习中epoch xff0c batch的概念 batch epoch和iteration是深度学习中几个常见的超参数 1 batch size 每批数据量的大小 DL通常用SGD的优化算法进行训练 xff0c 也就是一次 1 个ite
  • 基于Ubuntu的嵌入式开发练习(十)FreeRTOS的移植和设计一个基本的多任务程序

    如有错误 xff0c 欢迎指正 xff0c 谢谢 xff01 目录 一 FreeRTOS的移植二 建立一个基本的多任务程序1 实验要求2 代码设计3 执行效果 一 FreeRTOS的移植 教程 视频 xff1a 野火 FreeRTOS视频教