Microchip
直播中

杨叶

7年用户 168经验值
私信 关注
[问答]

为什么PIC32的Harmony编写没有交互的状态机?

Goodrmorning,我正在用PIC32在HARMony中编写我的第一个项目,尽管我有使用PIC18和PIC24微控制器的经验。我在“和谐”应用程序文件夹上找到了几个例子,但是它们都没有几个相互交互的状态机。离子状态机检查键盘接收的命令,并相应地向SPI发送不同的命令。特别地,SPI被配置为专门与GPIO扩展器MCP23017一起工作。定时器状态机独立工作,不与其他状态机交互。在不同的文件中重新定义,但是基于和声方法,这些状态机也基于中断在不同的文件中从一个状态移动到另一个状态。这个应用程序运行良好,但我询问您的意见,如果这种方法是正确的或可以改进的,或者如果您有任何SU。我想问任何问题,谢谢。

回帖(11)

李巍

2019-8-12 08:54:50
简短的回答…是的,我相信你走对了,vibemac.1;也就是说,我很想听一些更有经验的Harmony人员如何评价你的代码,因为这正是我走的路径。你读过help_.ony.pdf(或者你喜欢的任何格式,选择:pdf,.)吗?OWS帮助,还是HTML?有一个章节叫做第三卷:MPLAB和谐发展,它对基本的、关键的概念有一些很好的描述。它直接关系到你在这里的问题。甚至还有一个关于状态机编程的章节。文档本身目前有7777页长,这似乎令人畏惧,所以我每次只阅读它的部分。如果你的编程是和谐的,我建议你把这个文档变成你的朋友。无论如何,那个代码看起来确实很熟悉。许多并发状态机…就像我正在生产的代码一样。创建好的模块时,我发现自己在完成这些小小的学习练习时,从一个项目到另一个项目剪切和粘贴状态机。有时,我觉得制造可重用的模块是有意义的,其中包含了一些独立的状态机。这些可重用的模块将有自己的.c文件和它们自己的.h文件或文件。在这些可重用模块中,可能会有一些(可能相当多的)函数将您的模块与它的CLIENTS进行交互,其中之一就是您的应用程序。您可能创建的这些可重用模块将很容易在您编写的其他项目中使用。接口函数和状态机设计得非常巧妙,以便使这个新模块尽可能灵活,并且不针对具体项目,从而抽象出其客户端,而不必担心细节。模块不知道它使用的应用程序的任何内容。它只是轮询硬件并通过它的接口函数提供有关硬件的信息。和谐也是一样的,不是吗?因此,我们可以通过创建一个可移植的、可重用的按钮驱动程序来模拟和声(我认为和谐并不真正具备)。不管您正在构建什么东西,或者谁构建的,如果这个东西是Microchip或Digilent教练板套件,或者它是一个数十亿美元的国防项目中的一个组件;如果该东西有一个按钮,或者您想使用的一串按钮,您的应用程序可能希望知道一些点亮的比如,按钮是否被按下,释放了多久,按了多久,按钮快速重复了多少次,双击过吗,按钮按下器是否打算像键盘键一样调用自动重复功能?假设一个创建的按钮处理模块可能需要使用一些和声提供的东西,例如定时器。然后,按钮模块(或者我可以说按钮驱动程序)必须充当Harmony的计时器驱动程序和/或系统服务计时器模块的附加客户端;因此,您需要使用Harmony的计时器驱动程序(而不是STATIC)的DYNAMIC实现——这就是Harmony的美——所以,它可以防止项目中众多模块之间的冲突,这些模块还需要定时器用于其他目的。这是对代码工程非常有逻辑和独创性的方法,很好很和谐地工作。使用您自己的CALLBACKS OF Your OWNAn这张图片的重要部分,我没提到的是回调函数的概念。它们是和谐环境下工作的重要组成部分。回调函数允许模块不知道应用程序。根据到目前为止使用按钮驱动程序模块的经验,我发现处理按钮按下、按钮释放和按钮自动重复事件的最有效的方法是使用回调函数(在某种程度上类似于事件驱动编程)。因此,在初始化模块时,给模块提供回调函数指针。当按下按钮时,驱动程序所做的不仅仅是简单地在某个地方设置一些标志,实际上,(首先检查是否已经提供了回调,然后如果是…),调用回调函数,以便应用程序可以快速地对磁盘上的输入做任何它想做的事情奥弗里这是Harmony框架反复使用的相同概念。POLLING VS.INTERRUPT DRIVENY状态匹配可能不是从您的应用程序调用的,或者从使用Configurator时Harmony生成的SYS_Tasks()函数调用的;可以从中断v调用新模块的护目镜。如果使用Orthor并创建一个包含基于中断的USAT实现的项目,您将看到一个例子,其中生成并放置在SythyStudio.C中的中断服务路由直接调用一些…任务(…)类型函数。我预见到我们的代码可能做同样的事情。像你一样,我有时会想,我是否走在正确的道路上,这感觉好像我明白了,但我不确定。我想知道:专家们有什么要说的?他们的批评和建议是什么?我是偏离轨道还是正轨?希望这些小部分有助于…干杯!
举报

李勇进

2019-8-12 09:10:42
非常感谢你的回答,80hCO。事实上,我不是唯一有这种怀疑的人,而且你在做与我的项目类似的事情,让我放心。关于您强调的要点:我知道文档help_.ony.pdf,我为了闪烁的led项目阅读该文档,并获得关于我将要实现的下一个开发的信息(CAN,TCPIP)。我将按照您的建议阅读Volume III,以获得更多关于模块开发的提示。正如你所说的,关于回调函数,我经常使用它们来定时器、USB和SPI功能。我发现的唯一困难涉及SPI回调。回调函数在事件完成时被触发,但它从不触发挂起或处理。你也尝试过SPI并得到同样的问题吗?再次谢谢你。
举报

李巍

2019-8-12 09:30:27
没有,我还没有实现SPI,所以我不能直接对Harmony的SPI工具的细节进行评论。我上次回复的大部分内容是针对我自己在Harmony下编写代码的一般方法。我想或许我会分享一些我自己的观察和个人发现,关于在多状态机环境中创建模块。关于回调函数,我所说的是当创建我自己的模块时,我让它们使用我自己的回调函数,以帮助我创建的模块尽可能地不特定于应用程序。因此,我的按钮状态机可能看起来是这样的。所以在本例中,您可以看到我使用指向函数的指针来调用在按下按钮时和释放按钮时执行的例程。使用AppHyBTNL数据变量数组中的元素,该状态机在卡上的每个按钮中被调用一次。这个数组的元素填充了我卡上每个按钮的数据。包含此状态机的模块可以被包含在不同的项目中而不进行修改。一个简单地填充具有不同数据的数组。可能有2个按钮或15个按钮。状态机根本没有变化。每个按钮都有(或者可能有)自己的回调函数,用于按钮按下和按钮释放事件,但是项目特定的回调函数本身返回到app.c文件中。如果我编写这个函数是为了做任何比这个按钮状态机的.c文件中更特定的事情,那么这个模块就会变得过于特定于应用程序,难以移植。我在某种程度上模仿了Harmony框架本身使用的一些设计模式。因此,我的回调函数将完成代码中特定于应用程序的部分,即按钮是否启动秒表或打开灯,或给外围硬件或其他功能加电。不管它做什么,这个状态机都可以不加修改地处理它,因为使用了APP_BTN_DATA类型参数buttonData中的指针所指向的回调函数。我希望这种方法是正确的。我不知道其他的程序员会不会这么做,但我觉得这样做是对的。我知道你的技能可能超出了这一切,但我不仅写给你们,而且写给更多的读者,他们可能正在阅读本文。有些人可能只是学习,或者其他已经学习过的人,可能想要表扬或批评。只是把一些想法放在那里踢。
举报

李波波

2019-8-12 09:45:47
SPI驱动程序在操作开始时提供回调以及完成。你认为其他地方需要什么?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分