在“ 概述:从代码片段到代码生成 ”中,我讨论了在我的开发过程中使用的几种工具。 Processor Expert 是一种对我完成工作有很大帮助的工具。在这篇文章中,我将概述此工具并说明使用它的优缺点。
概述
在本文中,我回顾了 Processor Expert 的概念以及我如何在我的应用程序中使用它们。在过去的几年里,我在许多客户和研究项目中使用过它。由于一种工具可能不适合所有用例,因此我尝试列出我如何看待它们的优缺点。
历史
我对 Processor Expert 的完整历史一无所知,所以这就是我所知道和能够收集到的: Processor Expert 是 Unis 于 1994 年左右在捷克共和国布尔诺开发的一种工具。我在 1998 年左右开始使用该工具,后来使用摩托罗拉/飞思卡尔 HCS12 和 HCS08 微控制器的“经典”CodeWarrior。当时,Processor Expert 技术是独立的,也可用于非摩托罗拉/飞思卡尔处理器,例如 Fujitsu 。 2001年荣获欧洲IST价格。
网页文档里有提到欧洲IST价格,但是这个IST组织/网页好像不退出了?
该技术已于 2008 年 被 Freescale 收购,目前仅支持 Freescale 处理器:HCS08、HCS12(X)、DSC、ColdFire、i.MX 和 Kinetis。
一开始,该工具作为“独立”版本(没有 IDE)提供,但后来被 Metrowerks 作为插件集成到 CodeWarrior IDE 中。
如今,它可作为 Eclipse(例如 Kepler、Luna)中的插件使用或集成在 Freescale Kinetis Design Studio 中,并可在 Windows、Mac OS X 和 Linux 上运行。
优点 | 缺点 |
非常快速地开发一个工作应用程序。 | 需要时间来学习该工具。 |
内置知识库,有时比参考手册更好。 | 仍然需要对微控制器有扎实的了解。 |
图形用户界面。 | 需要主机上的资源来运行 GUI |
集成到 Eclipse 和 CodeWarrior IDE 中。 | 其他非 Eclipse IDE,如 Keil 或 IAR 需要将其用作外部工具,这对用户来说不是那么友好。 |
支持范围广泛的飞思卡尔设备。 |
仅适用于飞思卡尔 |
概念和流程
Processor Expert 的概念是我可以从 组件库 中选择“组件”以在我的应用程序中使用和组合它们。组件就像“乐高积木”,带有可以放在一起并可以配置的接口。基于此配置,它然后使用 代码生成器 生成普通的 C/C++/Asm 源文件。
除了源文件之外,该代码生成器还生成报告和文档文件。它们与我的源文件一起被编译/链接以构建我的板的 ELF/二进制文件。
优点 | 缺点 |
能够使用库中的组件进行快速原型制作。 | 根据设备组件的可用性,并非所有飞思卡尔设备都受支持。 |
根据我的设置优化生成的源文件,生成的代码是静态的。 | 安全编码规则可以防止任何“生成的”代码。使用新版本的工具会影响生成的代码,需要重新认证应用程序/代码。 |
共享公共代码和库函数。 |
代码生成,尤其是许多模块的代码生成会减慢应用程序的完整构建速度。 |
组件库
组件库具有“块”,用于读取模拟值 (ADC) 或切换引脚(位 I/O),直到更复杂的东西,如通信堆栈 (USB),它本身可以包含几个子组件。组件可以是非常特定于硬件的(如 UART),也可以是纯软件组件,如用于实现环形缓冲区的组件。
Processor Expert 的安装附带了许多组件。可以使用 CDE(组件开发环境)框架创建您自己的组件。
优点 | 缺点 |
在应用程序中重用公共块作为库。 | 直到最近(Kinetis 处理器专家 v3.0.0)才可能使用多个存储库。 |
浏览并搜索功能/组件。 | 如果飞思卡尔未提供功能,则需要添加/创建自己的或第 3 方组件。 |
范围广泛的组件,通常涵盖片上功能。 | 很少有“片外”组件可用,例如传感器或其他外部组件。飞思卡尔仅为飞思卡尔设备提供组件。 |
带有“组件帮助”在线帮助的图形用户界面。 |
缺乏文档、教程和示例项目。 |
高级 Bean、逻辑设备驱动程序和 SDK 组件
在 Processor Expert 中有三种不同类型的组件:
- 高级组件 或 Bean (HLB):这些是最先引入的。他们使用简单的 API。例如,要在 UART 上发送一个字符,我调用 AS1_SendChar('a'): AsynchroSerial 高级 Bean 这可以很容易地用于裸机和带有 RTOS 的应用程序。当然,如果从多个任务中使用一个设备,则必须进行同步。 “Bean”的最大优势是它们在不同架构中具有通用 API,因此我可以在 HCS08、HCSC12、DSC 和 ColdFire 设备中使用相同的 API/组件。因此,将应用程序从一种架构移植到另一种架构通常需要几个小时。
- 后来随着 Freescale Kinetis 设备的推出,引入了 逻辑设备驱动程序 。这些组件的名称末尾有“_LDD”。不同之处在于现在需要在每个 API 调用中传递一个“设备句柄”: 这些组件不像高级 Bean 那样易于使用和高效,因为总是有额外的参数。虽然“设备句柄”对于某些应用程序来说是一件好事,但对于裸机应用程序或设备仅由单个 RTOS 任务使用(在许多情况下是默认用例)的应用程序而言,它是一种矫枉过正。 LDD 的最大问题是它们的 API 确实破坏了与以前(比如 S08 和 S12)项目的兼容性,因为仅适用于 Kinetis。这就是为什么在 LDD 组件发布后不久,Freescale 也必须为 Kinetis 提供高级 Bean 以提供兼容性 API。因此,通过使用继承,提供了两个 API: LDD 作为高级组件中的继承组件
- 随着 Kinetis SDK 的推出,引入了一种新型组件:名称前面带有“fsl_”的 SDK 组件 。 fsl_uart SDK 组件SDK 组件本身不生成完整的驱动程序。相反,它们为 Kinetis SDK 生成配置结构。 SDK 使用 HAL(硬件抽象层),为此还提供了“_hal”组件,这些组件在“fsl_”组件中使用。即使这些组件不生成代码,它们也提供了一种简单的可视化方式来使用 Kinetis SDK。
优点 | 缺点 |
高级 Bean 的简单 API。易于使用和学习。 | 应用程序代码需要处理同步 |
扩展的功能集,例如 Kinetis 上的定时器或灵活定时器。 | 许多应用不需要的 LDD 的开销和复杂性。难以使用/学习 |
LDD 的通用设备句柄,更易于在使用设备句柄(例如 MQX)的 RTOS 环境中使用它。 | LDD API 与以前使用 HLB 组件的应用程序不兼容。 |
使用 SDK 组件的“静态”配置和代码生成。组件用于“配置”,而不是代码生成。使用 Kinetis SDK 和 HAL API 的简单直观方式。 |
SDK 组件与以前的项目再次中断。组件/项目不能使用/混合不同的组件,没有可移植性 API。 SDK 本身增加了复杂性和开销。 |
方法、事件和属性
我可以使用组件库中的组件。组件可以使用 方法 、 事件、属性 和 继承 :
- 方法 :驱动程序的功能/过程。例如,用于 UART 组件的 SendChar()
- 事件 :挂钩或中断事件。例如,用于 UART 组件的 OnRxChar() 中断挂钩
- 属性 :影响驱动程序行为的组件设置。
- 继承 :可以以面向对象的方式组合多个组件或使用到其他组件的链接/接口。例如,一个 UART 组件可以继承自一个低级 UART 组件,并构建一个具有新功能的新接口。
在上面的屏幕截图中,可以启用或禁用未使用的方法和事件(用小“x”标记)。禁用的方法不会生成,组件代码生成器可能会根据启用/禁用的内容优化驱动程序。例如,如果不需要“GetStatus()”方法,那么组件可能根本不需要在某处存储状态。
对于组件,有一个视图可以更改和检查属性:例如,对于 UART 组件,我可以打开中断并分配用于 Rx 和 Tx 的引脚:
我在上面的屏幕截图中显示了“经典”视图。还有一个“选项卡”视图(默认),但我认为该选项卡视图更难使用,因此我建议使用“经典”视图。有关详细信息,请参阅“ 在 Processor Expert 中的“选项卡”和“无选项卡”UI 之间切换 ”。
基本上,这为我的 UART 驱动程序提供了一个图形前端。根据我的设置,它会为我配置和生成软件文件:
生成的 UART 驱动程序代码
通过 UART 发送字符的源代码如下所示:
/*
** ===================================================================
** Method : AS1_SendChar (component AsynchroSerial)
** Description :
** Sends one character to the channel. If the component is
** temporarily disabled (Disable method) SendChar method only
** stores data into an output buffer. In case of a zero output
** buffer size, only one character can be stored. Enabling the
** component (Enable method) starts the transmission of the
** stored data. This method is available only if the
** transmitter property is enabled.
** Parameters :
** NAME - DESCRIPTION
** Chr - Character to send
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_TXFULL - Transmitter is full
** ===================================================================
*/
byte AS1_SendChar(AS1_TComData Chr)
{
if (SCI1S1_TDRE == 0U) { /* Is the transmitter full? */
return ERR_TXFULL; /* If yes then error */
}
SCI1D = (byte)Chr; /* Store char to the transmitter register */
return ERR_OK; /* OK */
}
所以这与任何其他 UART 驱动程序没有太大区别。不同之处在于处理器专家所做的知识和一致性检查。例如,它知道哪些引脚可用于 Rx 功能,哪些引脚已被其他东西使用:
还有 CPU 视图,它跟踪使用了哪些块和引脚:
另一件事是它提出了我可以使用的可能的 UART 波特值:
为此,它会跟踪内部时钟和时钟路径:
所有这些信息也将出现在设备参考手册中。但是使用 AsynchroSerial/UART 组件更容易和更快:
- 将组件添加到项目
- 选择 UART 设备(例如 UART0)
- 选择 Rx 和 Tx 引脚
- 指定初始 UART 波特率
- 生成驱动程序/配置
- 在我的应用程序中使用它
如果我对生成的代码不满意,我可以选择“冻结”组件的代码生成。请参阅“ 禁用我的代码生成 ”
优点 | 缺点 |
拥有司机的简单方法。 | 仍然需要了解硬件在某种程度上是如何工作的。 |
用于配置的图形用户界面。 | 需要 IDE 集成 (Eclipse)。 |
一致性检查可防止错误或错误的设置。 | 一致性检查需要时间,会减慢工具的速度。有时“递归”依赖关系没有得到正确解决。 |
生成“有效”的驱动程序代码和示例代码。 |
API 和编码风格可能不符合自己的喜好。因为驱动程序需要处理许多不同的用例,所以它不是最有效的(代码大小、速度)。 |
物理设备驱动程序
如果生成的函数和方法不够用,可以使用较低层的 API:物理设备驱动程序(PDD,请参阅“ 使用 PDD(物理设备驱动程序)进行低级编码 ”)。 PDD 基本上是低级宏,可用于访问设备的低级功能。由于 PDD 宏与所使用的设备紧密相关,因此它们在不同设备之间的可移植性不高。
优点 | 缺点 |
小而紧凑的代码。 | 难以理解 API 以及如何使用它。 |
访问低级外围功能。 | 宏依赖于设备,不可移植。 |
用于拖放宏/函数的图形用户界面 |
缺乏文档。 |
遗产
Processor Expert 组件的另一个重要功能是它们的“继承”模型:一个组件可以从其他组件继承功能。下面显示了从“BitIO”组件继承功能的 LED 组件:
LED 函数 On()(打开 LED)将使用 BitIO ClrVal() 或 SetVal() 来更改引脚的逻辑电平,具体取决于 LED 的阴极/阳极连接方式。端口引脚。这种继承方案非常强大,可以实现组件共享。 Processor Expert 还具有“链接”到其他组件的能力。例如,LED 组件可以链接到 Shell 组件,这样会自动为该组件启用命令行支持:
优点 | 缺点 |
能够打开/关闭功能以优化代码。 | 有时不清楚启用/禁用功能的影响是什么。 |
生成“有效”代码或可用作参考实现的简单方法。 | 代码有时并不理想,或者没有很好地记录。 |
自动检查依赖性,为我配置引脚和时钟。检查冲突。 | 还是需要了解单片机。进行错误的设置将导致错误的结果。 |
我可以禁用代码生成并进行自己的更改。 |
飞思卡尔提供的组件是“封闭的”:我无法编辑或更改它们。 |
组件开发环境
Processor Expert 中的组件框架允许我创建自己的组件。如果我不打算出售创建的组件,那么该功能是免费的(不需要许可证)。这是“社区版许可证”,如果没有找到其他许可证,则会打印 Eclipse 控制台视图中的以下文本:
/*
** ===================================================================
** Method : AS1_SendChar (component AsynchroSerial)
** Description :
** Sends one character to the channel. If the component is
** temporarily disabled (Disable method) SendChar method only
** stores data into an output buffer. In case of a zero output
** buffer size, only one character can be stored. Enabling the
** component (Enable method) starts the transmission of the
** stored data. This method is available only if the
** transmitter property is enabled.
** Parameters :
** NAME - DESCRIPTION
** Chr - Character to send
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_TXFULL - Transmitter is full
** ===================================================================
*/
byte AS1_SendChar(AS1_TComData Chr)
{
if (SCI1S1_TDRE == 0U) { /* Is the transmitter full? */
return ERR_TXFULL; /* If yes then error */
}
SCI1D = (byte)Chr; /* Store char to the transmitter register */
return ERR_OK; /* OK */
}
我写了一个教程“ 教程:为加速度计创建处理器专家组件 ”如何创建我自己的组件。较新的 Processor Expert 版本带有一个基于 Java/Eclipse 的插件来创建/更改您的组件。在经典的 CodeWarrior 中有“BeanWizard”(独立的),但这个需要付费/专业 CodeWarrior 许可证。
使用 CDE,我可以创建类似于 McuOnEclipse SourceForge 站点上的组件,或者类似于 Freescale 提供的组件。除了一个例外: 无法 创建处理器组件:
优点 | 缺点 |
可以创建我自己的组件。 | 不容易学,需要很多经验。 |
免费许可证(Eclipse 插件) | 不能销售组件,不能创建处理器组件。 Classic BeanWizard 不是免费的。 |
用于创建组件的图形向导和用户界面。 |
Eclipse 中的 CDE 插件不是很成熟,也不像“经典的”BeanWizard 那样易于使用。 |
可移植性
使用组件的另一大优势是:由于组件接口保持不变,并且由于 Processor Expert 可在多个飞思卡尔平台上使用,因此在不同的衍生产品之间移动项目非常容易。例如,我的 INTRO Robot 应用程序在 Freescale S08、ColdFire 和 Kinetis (ARM) 上运行,它们都具有相同的组件集。因此,Processor Expert 使得从一个设备转移到另一个设备(例如 Kinetis KL25Z 到 Kinetis K64F)或从一种架构转移到另一个(例如 HCS08 到 Kinetis KL25Z),或者从一个工具链转移到另一个工具链(例如 CodeWarrior 到 KDS 或任何工具链)变得非常容易其他 Eclipse IDE)。
例如,这是 CodeWarrior 上的一个 S08(飞思卡尔 S08 16 位微处理器)项目,它使用多个组件,包括一个 LCD:
Eclipse Kinetis Design Studio 上的 32 位 Kinetis (ARM Cortex-M0+) 上的相同功能/项目:
移植这样的项目只需一个小时或更短的时间:
- 为新目标的 Processor Expert 创建一个新的(空)项目
- 将组件复制粘贴到新项目(参见“ 处理器专家组件的复制 ”)
- 更改组件设置以使用新板上的新引脚
- 复制应用程序代码
- 生成代码、构建和测试
Processor Expert 组件如何可以跨不同的工具链、架构和 IDE 移植的一个很好的例子是在 McOnEclipse 项目中维护的 FreeRTOS Processor Expert 组件:
具有用于配置 FreeRTOS 的图形用户界面的单个组件:
- 9 种编译器和 6 种架构:Freescale chc12、chc08、DSC、ColdFire V1、ColdFire V2 和 ARM 编译器、GNU GCC ARM Embedded(launchpad)、IAR、Keil
- 7 个 IDE:CodeWarrior (classic) 6.x、CodeWarrior (eclipse) 10.x、Kinetis Design Studio、Driver Suite 10.x、Atollic TrueStudio、Emprog Thunderbench、NXP LPCXpresso
- 支持 3 种组件类型:HLB(高级 Bean)、LDD(逻辑设备驱动程序)和 Kinetis SDK
一个组件来统治他们!
概括
我知道这是一篇相当长的文章,我希望它能为新手概述什么是 Processor Expert:一个基于组件的框架,它封装了具有图形配置前端的软件。这个框架背后还有很多东西,包括自动构建和生成支持。当然,没有一种工具是完美的,也没有一种工具可以满足所有需求。我看到的问题是框架应该更快,尤其是对于大型项目。但最大的缺点(也许飞思卡尔可能会说这是关键特性,它只存在于飞思卡尔设备中)。因此,一旦有人探索了它的强大功能,就很难转向其他供应商。
对我来说,Processor Expert 就像 C++:需要一些学习和时间来掌握它,但它非常强大。有时我感觉就像在引入 C/C++ 编译器并且每个人都在使用汇编程序的过去:高级语言被认为是缓慢、低效的,并且“我可以更好地编写它!”但是今天没有关于使用编译器的争论,因为它们既有所改进,其次我们需要提高生产力。其他一切看起来都像石器时代。