将RTOS并入用于学习目的的简单传感器接口项目的想法

问题描述 投票:1回答:1

我正在尝试从软件测试角色转为嵌入式,并致力于学习STM32,几乎完成了用于I2C的驱动程序编写工作,该驱动程序用于与传感器接口。我看了很多工作说明,其中大多数确实发现对RTOS至关重要,并且我想知道是否可以以任何方式将其纳入现有的简单项目中。我想到的一种方法可能是有两个线程,一个线程从传感器上读取值,而另一个线程在屏幕上显示。不确定RTOS对于此特定用例是否真的必不可少,只是一个想法。

任何想法都值得赞赏

c embedded sensor rtos
1个回答
1
投票

前言

据我所知,您正在思考如何编写自己的RTOS项目,以便在进行一些HAL编程并作为测试人员一段时间后,进行使用RTOS进行嵌入式编程的一些第一步,现在正在尝试从测试人员角色“成长”为开发人员角色(从测试到开发是否总是意味着成长,这至少是个问题,但至少在某些方面,开发人员比测试人员更能获得奖励。)

因此,我假设您知道如何基于主循环体系结构在STM32上创建嵌入式软件应用程序。

任何想法都值得赞赏

您的问题表达得非常开放,因此我敢于尝试草拟一个计划,以使您能够进行(整个)个人教育项目。我对那些广泛找到此答案的读者表示歉意。

1。从传感器到显示器的RTOS两个任务示例?

您提到的示例是一个非常著名的教科书示例,因为它非常适合演示RTOS在教科书上下文中的优点:通过将两个完全不相关的系统组件部署到不同的任务来支持它们的功能分解。

这是一个不是一个很好的示例应用程序,可以用来实际学习为您的个人教育目的而集成RTOS的问题。这取决于您在这两个任务中所做的事情的熟悉程度,这应该尽可能地大,以便您可以专注于RTOS驱动的SW体系结构的细节。一个任务(“ IN”)处理

从传感器读取值

  • 我假设您使用的是已经处理过的I²C传感器。 -太好了!另一个任务(“ OUT”)处理

显示在屏幕上。

我个人已经开发了RTOS固件两年了,但是我从未真正集成过嵌入式显示器。如果我要自己执行计划,则将这些值转储到其他串行接口(例如,将UART连接到使用普通Nucleo板的STM32时获得的虚拟串行端口),并在我的终端上有一个终端窗口PC实际显示。请根据您自己的技术经验调整您的个人计划。

2。为RTOS准备软件

[从您已经做的很好的事情开始:使目标对象上的主循环固件正确运行,在其中您很好地分离了这两个功能,请注意在这两个部分之间要有一个简洁的接口(IN组件仅与OUT通信)。它需要知道什么)。最重要的是,IN用于将数据更新放入OUT的接口应该是事件驱动的,而不是轮询的,即,仅当有要更新的内容时IN才调用函数,并且OUT不调用任何函数来“嗅探” IN是否具有某些功能。要报告的新信息。

目前,两个组件都应具有从主循环中调用的“ tick”函数,以便任何一个组件都能在该函数中完成其自身所需的一切。例如,IN任务使用驱动程序定期触发I²C外设(或其DMA)的获取数据请求。

3a。将RTOS添加到整体固件中

现在,请集成RTOS库,以便它运行包含您以前的主循环的单个任务。提示:旧的主循环成为您唯一的“默认任务”,并且main()函数在start-RTOS调用之后结束(如果您犯了配置错误,则assert语句可能捕获任何意外返回)。通常,不会启动启动调度程序的调用,因为主(系统)上下文将被RTOS任务上下文取代。

[如果您尚未决定要选择哪种RTOS,我建议您选择freeRTOS(它是OSS)并由STM32CubeMX对其进行预配置(也免费),因此您不必一劳永逸地解决所有细节。时间。如果选择freeRTOS,则启动RTOS的最终调用将是“ osKernelStart()”。

完成设置并调试,使其再次运行。

3b。使其成为一个多任务软件

这是您的固件变成真正的RTOS固件(而不是一个类似的固件)。您需要另一个任务-将其插入到已有任务旁边的RTOS配置中,然后创建另一个任务功能。任务函数看起来像“ main()”函数,由一个一次性的初始化部分和一个无限循环组成。从先前存在的任务中删除一个组件,然后将其放入新任务中。

现在,您必须通过任务间通信从上方替换“ put”功能调用。设置由OUT任务读取的队列。每当OUT可以从队列中取出数据更新时,它都必须将其应用于“显示”(例如,发送一系列UART帧)。让IN任务将数据结构放入您创建的队列中。注意:队列句柄(创建后的常量指针)应是两个任务都能看到的唯一变量符号。除此之外,这些任务应该生活在不同的世界中。

3c。任务触发时间

假定您的OUT任务可以执行一次操作,例如将数据结构放入DMA缓冲区并触发DMA,则此任务仅在通过IN任务的“队列”馈送时才运行。也就是说,除非有工作要做,否则它不会消耗CPU时间。给此任务分配比向IN任务更高的优先级。

现在,IN任务仅在OUT任务不忙时运行。目前-如果IN任务无关,您可以使其处于空闲状态,直到希望它从传感器中检索下一组数据为止。完成代码并调试它,以便您再次具有正在运行的系统。

当然,您不希望IN任务消耗几乎所有的CPU时间,而只消耗它需要的时间。重新检查您的I²C驱动程序接口并确定必须多久调用一次。设置一个重载计时器(根据需要使用硬件计时器或软件计时器,稍后尝试其他选项)。计时器回调(对于硬件计时器:ISR处理程序)应将事件发送到IN任务。 IN任务应侦听该事件(并在没有事件时阻止)。每当事件来自计时器回调时,IN任务就会唤醒,从传感器获取数据,将其放入队列到OUT,然后等待下一个事件再次被阻止。

现在您需要一个空闲任务,在所有生产任务被阻止时,RTOS会唤醒它。恕我直言,闲置的任务不会做任何事情,但这要进行哲学辩论。重新完成编码和调试。找到您的系统再次运行,微笑并喝点冰淇淋:-)

4。添加更多的东西

您已经掌握了关键点,现在通过以下几点来加深您的RTOS知识/经验:

  • 检查您的RTOS库提供的各种进程间通信,在系统中进行尝试。
  • [添加带有精美内容的其他任务。例如,根据传感器值使用另一个队列/任务来驱动LED。
  • 设置SWV跟踪/调试并研究每个任务(ITM / SWO)产生的负载以及在任意断点时刻的运行时状态。
  • 整理代码,找出放置模块边界的位置。
  • 在RTOS顶部使用操作系统抽象层。
© www.soinside.com 2019 - 2024. All rights reserved.