【FreeRTOS】01 初识freertos操作系统,第一个任务

2023-05-16

1)概述

最近打算写一个实时操作系统编程的系列。

操作系统分很多种,有大型的复杂、功能齐全操作系统,也有小型的代码几百行的操作系统内核;也有实时和非实时之分。这里我们学习可以运行在资源很少的类单片机处理器上的实时操作系统(RTOS)。

至于为什么以freeRTOS为例来学习,一方面是它完全开源和免费;另一方面它的功能在小型操作系统里是比较齐全的,学会它在很多场合就够用了;第三个理由是它网上的资源非常多,很多大芯片厂官方都有对它的移植支持,学习起来很方便。

硬件平台还是常用的stm32,它官方出品了代码生成工具cubemx,可以自动生成移植好的FreeRTOS系统代码。这样我们可以把主要的精力放在学习实时操作系统的应用上。

注意,本系列教程打算讲RTOS的应用为主。许多教程一上来就讲系统的移植,而移植可以说是最难理解的,往往让初学者望而生畏;所以我们先来讲应用,等熟悉了之后再去讲操作系统的底层实现和移植。

2)初识FreeRTOS,cubemx建立工程,配置硬件

这一节我们开始写第一个程序,建立两个任务,每个任务控制一个LED灯闪烁。

我们的工程都是由cubemx建立,在keil中修改、编译、下载。先从cubemx创建工程,进入后,先选择stm32f103c8处理器。

首先配置SYS,debug选上serial wire,即SW调试接口;Timebase选择systick以外的一个定时器。

注意,在使用RTOS时,cubemx建议不用systick作为时间基准。这是由于用cubemx生成HAL库工程时,systick的相关函数被定义成了weak类型,可能被用户重写,那么就会造成时间混乱;另外在cubemx生成的代码中它的优先级最低,如果被其他中断打断会使得时间基准不准确,而选其他的定时器会初始化为最高优先级。

我觉得用不用systick作为时间基准,主要看应用场景,一般来讲,系统调度的优先级低于中断的优先级也是合理的,毕竟中断的实时性要求可能更紧迫一些;不过如果在这个时间基准的中断服务程序中,运行时间很短,只是更新定时器,在us级别,那么我觉得设置一个高优先级也是可以的,毕竟一般应用场景见不到要求几us级时间要响应的中断。

这里如果现在不明白,可以无脑按cubemx的推荐走,不用systick。

然后选择时钟源,这里都用的是外部晶振时钟:

接下来选择GPIO,这里我们选择两个引脚设置为输出,我们选择PC13和PA0两个引脚,去控制板子上的LED灯,设置为GPIO_Output:

然后启用freeRTOS,如下图,在中间件中选中freertos,选择interface为CMSIS_V1:

这里说明一下,V1和V2的区别,V1适用于简单的MCU,V2扩展到了一些比较强的MCU,V2的代码中会有很多为了兼容不同处理器的代码,为了简单易学我们使用V1即可。

切换到Task and Queue页面,添加两个任务,添加时只改变任务的优先级为high,其他都暂时都不改:(关于各参数的配置说明,以后会详细讲,现在咱们都默认)

添加完成后,Task栏里出现我们添加的myTask02任务,同时还会多一个default任务;我们用同样的方法再添加一个myTask03任务,完成后如图所示:

切换到时钟配置页面,如下配置,选择外部时钟,设置到最高的时钟频率:

切换到project Manager页面:

先填写工程名称、保存路径,以及生成的工具链,由于我们使用keil开发,选择MDK-ARM V5,其他默认

勾选为每个外设建立.c和.h文件,这样以后方便修改,不会很混乱:

这样就基本配置完成了,点击右上角的generate code生成代码:

3)keil中编辑代码

刚刚生成的工程文件,可以用keil5打开,我们打开freertos.c文件:

我们编写的代码从freertos这个文件里开始,可以看到我们之前建立的两个用户任务:StartTask02和StartTask03。

一般c语言的函数都是从main开始执行,但是这里由于工程文件已经建立好了,我们只需要把我们自己的代码添加到任务的函数中即可。

我们看到,StartTask02和StartTask03中各有一个无限循环,这和我们编写裸机程序主函数中的无限循环类似,都会循环执行。只不过在裸机程序中,只在主函数中有一个无限循环,而这里freeRTOS帮我们实现了在一个MCU里“同时”跑两个无限循环的功能。这其实就是操作系统的最核心功能,可以实现多任务。这里我们不再深入,以后会有更多的讲解。

我们在两个任务中添加闪灯的代码,如下:

 

以task02为例,是在无限循环中,先延时500ms,再拉低PA0引脚;然后延时500ms,再拉高PA0引脚,如此不断循环。task03的功能一样,只是延时是1000ms,操作的引脚是PC13。

点击keil主界面的rebuil图标进行编译:

编译成功无错误后,就可以烧写到开发板了。

4)烧写和运行

将开发板和stlink连接,stlink连接到计算机的usb口上,然后点击keil上的download,就可以下载到开发板运行了:

程序运行起来后,两个任务可以各自延时后翻转LED的状态,互不影响地运行;也可以在调试模式下,通过断点查看程序运行到进入task02和task03的情况。可以看到,本例子中的两个任务虽然都是无限循环,但是都在正常运行,互不影响。

5)总结

本节我们利用cubemx自动生成了一个移植好的freeRTOS工程,然后在上面运行了两个任务,初步试验了多任务。这其中,操作系统相关的代码都不用我们编写,只需要关注应用程序(闪灯)即可,cubemx的强大功能使得我们的学习更加便利。

好了,本节的内容就到这里了,这是freeRTOS嵌入式系统编程的第一课,以后还有更深入的学习。

如果觉得有用可以关注作者微信号“小白白学电子”,在公众号可以找到代码和资料下载地址:

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

【FreeRTOS】01 初识freertos操作系统,第一个任务 的相关文章

  • linux usb usbip驱动详解(二)

    终于来到usbip驱动代码分析了 xff01 我们在做产品时 xff0c 通常是先讨论方案 制定协议 编码和测试 usbip的方案是行得通的 xff0c 它是从URB对象获取信息 xff0c 然后从tcp发送出去的 xff0c URB是li
  • linux usb usbip驱动详解(四)

    我们先讲解vhci hcd驱动 xff08 linux 4 20 14的usbip驱动 xff09 usb主机控制器驱动hcd学习心得 xff1a 可以阅读某款SOC的主机控制器驱动代码 xff0c 譬如TI的am3358芯片 xff0c
  • docker 启动 centos-7 xrpd server

    docker 启动 centos 7 xrpd server 效果预览 docker 启动 centos 7 xrpd server 连接容器 docker run dit name 61 xrdp p 10022 22 p 13389 3
  • 常见数据结构和算法 的图形界面可视化实现

    解压后 xff0c 运行里面的index html xff0c 推荐火狐浏览器下 针对某一数据结构 或 算法的实现 xff0c 有动态的界面演示 xff0c 并且有相应的代码 xff0c 对学习有很好的参考作用 http pan baidu
  • 再见,2012,你好,2013.

    其实这篇日志过年前 xff0c 已经写得差不多 xff0c 但是忘记发了 xff0c 现在补上 xff0c 现在应该还不是太晚吧 ps xff1a 想了一个很俗的标题 61 61 2012年 xff0c 是对我意义最不平凡的一年 这一年 x
  • 无人机—加速度计与光流数据融合

    加速度计与光流数据融合 无人机的定点定高飞行时实现目标识别追踪 xff0c 航点规划 xff0c 循迹巡线等下一个任务的基础 xff0c 稳定的定高定点飞行才能执行其他高级算法 在室内没有GPS的情况下 xff0c 要想实现这个目标 xff
  • 【转】C语言中 -> 是什么意思?

    gt 是一个整体 xff0c 它是用于指向结构体 C 43 43 中的class等含有子数据的指针用来取子数据 换种说法 xff0c 如果我们在C语言中定义了一个结构体 xff0c 然后申明一个指针指向这个结构体 xff0c 那么我们要用指
  • GIS开发学习推荐书目

    书名 作者 出版社 版次 GIS 基础 地理信息系统导论 US Kang tsung Chang xff1b 陈健飞 译 电子工业出版社 第七版 ArcGIS地理信息系统空间分析实验教程 汤国安 杨昕 科学出版社 第二版 编程 基础 C语言
  • SINS/GNSS组合导航:组合导航设计(卡尔曼滤波)

    SINS GNSS组合导航将SINS输出信息与GNSS信息进行组合 xff0c 状态量为 卡尔曼滤波原理参照卡尔曼滤波 xff08 KF xff09 与扩展卡尔曼滤波 xff08 EKF xff09 讲解与推导 xff0c 核心就是五个递推
  • VSLAM学习(一) 三维运动、相机模型、SLAM模型

    目录 VSLAM学习 一 三维运动 相机模型 SLAM模型 VSLAM学习 二 非线性优化 VSLAM学习 三 单目相机位姿估计 VSLAM学习 四 Bundle Adjustment 一 三维空间刚体运动 1 1 旋转矩阵 同一向量在不同
  • ssh远程提示“找不到匹配的keyexchange算法”解决方案

    20230216更新 xff1a xshell官网地址 xff1a https www xshell com zh free for home school 新的知识 xff1a 是因为openssh版本比自己的ssh工具如xshell4版
  • JAVA中的类和对象之this的详解

    系列文章目录 第一章 JAVA中的类和对象之this的详解 目录 前言 一 为什么要有this引用 二 this的三种用法 1 this 成员变量 2 this 成员方法 3 this 调用其它的构造方法 三 this的引用特性 前言 JA
  • 这么学,好玩,有趣,逗死了!(2017年系统规划与管理师上午综合知识试题试题解析(六))

    IT服务风险管理中 xff0c 对风险的识别是很重要的一项工作 识别方法中 xff0c 通常采用文档审查 信息收集技术 检查表 分析假设和图解技术 下面 xff08 xff09 选项不属于信息采集技术 xff08 51 xff09 A 德尔
  • 松滋历史(1)--松滋县建县历史考证

    刘鲋鮈总共4个儿子 xff1a 刘建德 刘梁 刘延年 刘度 长沙顷王刘鲋鮈的儿子刘梁 汉昭帝始元六年 xff08 公元前81年 xff09 xff0c 六月乙未封高城节侯 汉宣帝元康元年 xff08 公元前65年 xff09 xff0c 正
  • 松滋历史(2)--高成县为什么这么高光?

    东汉开国皇帝刘秀 xff0c 是长沙定王刘发第5代世孙 也就是说 xff0c 东汉开国皇帝刘秀爷爷的爷爷与高城侯刘梁 xff08 高城县 xff08 松滋县前身 xff09 创始人 xff09 的爷爷是亲兄弟 在哪个特别讲血统的年代 xff
  • 为什么要报考系统架构设计师考试

    为什么要报考系统架构师考试 最近一年多 xff0c 很多朋友来信 xff0c 问我什么要报考系统架构设计师考试 为什么参加这个考试 xff0c 这个考试有用吗 xff1f 对自己的职业会带来什么好处 xff1f 我想有以下几个方面 xff1
  • Unity中使用暴风魔镜进行VR游戏开发

    64 VR简介 虚拟现实VR Virtual Reality 和增强现实AR Argument Reality 的概念其实在很多年前就已经出现 xff0c 2015年下半年开始变得火热 xff0c 在各大媒体圈子中频繁出现 xff0c 而今
  • 我的2013

    我的 2013 一 工作 分为 2 个阶段 1 上半年 岗位 xff1a 系统架构师 心得体会 xff1a 1 多跟领导 团队 公司其他部门 客户 协助第三方多沟通 xff1b 2 快速理顺业务逻辑关系 xff0c 弄清楚业务流程 xff0
  • 2014年24段魔尺变三叶花视频教程

    2014年24段魔尺变三叶花视频教程 xff08 升级版 xff09 偶是真心喜欢24段魔尺制作的三叶花 xff0c 那是相当漂亮 xff0c 体现了几何美 xff0c 对称美 xff0c 空间美 xff0c 色彩美 xff0c 见下图 三
  • 24段魔尺,可以折出哪些精美图案

    24段魔尺 xff0c 可以折出哪些精美图案 24段魔尺 xff0c 究竟可以叠成哪些精美图案 xff1f 球 小乌龟 十字架 三叶花 三角形 牛魔王 音符是大家比较熟悉的 偶对这个问题 xff0c 比较感兴趣 先将网络上流传的24段魔尺折

随机推荐