Blog:
Toradex WinCE 库演进:新的库文件方法说明

2016年11月8日星期二
Windows

更多关于我们库文件的信息以及演示应用可以从我们的 开发者中心下载。

概述

Windows十多年之前,为了演示我们的 计算机模块 ,或者称为 系统模块(SoM),我们编写了一些 WinCE 的代码。例如 GPIO、I2C、模拟输入等。当时我们只是为了纯粹的演示目的,并没有关系诸如维护、不同模块之间的兼容性等问题。然而,这些演示程序却被大量 Windows Embedded Compact 用户所采用。我们收到越来越多的技术支持和功能要求,于是我们开始将其集成到演示代码中去。最终,我们有了今天的针对基于 PXATegra® 系统模块的库文件包。通过这些库文件可以可靠和方便地使用我们的模块。但是,迭代维护和为新功能提供 API 却没有那么容易。

当我们为我们的模块系列家族添加新的处理器(片上系统或者 SoC),我们决定停止扩展旧的 API,而是采用一套全新的 API,我们可以把过去获得的经验都倾注其中。我们称这套新的库文件包为“Toradex CE Libraries”。该库文件包的目标和我们原来的一样:使我们的用户能够方便地使用系统模块的功能。

但是,我们三个非常重要的要求:

  1. 可扩展,并可兼容的 API
  2. 允许通过注册表配置库文件
  3. 易于维护

我们将在新的库文件包中满足三个所有的要求。

可扩展,并可兼容的 API

为了保持我们的 API 满足将来的需求,我们决定引入两套调用 API。第一种是通常的做法,使用字符串或者整数将信息传递给库。下面演示了如何将一个系统模块的引脚设置为 GPIO 输入,并调用 SetConfigString 函数激活下拉电阻:

// Set pin to alternate function GPIO, Input with pull-down
    success = Gpio_SetConfigString(hGpio, io1, NULL,
              L"altfn=ioAltFnGpio,dir=in,pull=down", StoreVolatile);

另外一个例子是调用 SetConfigInt 函数将 I2C 控制器的速率设置为 400KHz:

// Set I2C speed to 400KHz
    success = I2c_SetConfigInt(i2c, L"BitRateHz", 400000,
              StoreVolatile);

采用字符串的方法允许我们保持 API 的 100% 兼容,并且在将来可以添加现在系统模块还没有的更多功能。

第二套调用的 API 主要出于性能或者采用标准函数的原因。下面是一个 GPIO 库文件中修改一个 GPIO 的函数例程。 调用 SetConfigString 或者 Set ConfigInt 可以实现同样的目的,出于性能考虑,我们提供了不需要字符串解析的函数。

// Set it to Output,  High
    Gpio_ConfigureAsGpio(hGpio, io1);
    Gpio_SetDir         (hGpio, io1, ioOutput);
    Gpio_SetLevel       (hGpio, io1, ioHigh);

我们看看采用标准函数读取 I2C 的例程。因为性能缘故,我们决定不采用一般字符串的方法(例如上的 Get/SetConfig),但是由于读 I2C(以及类似的函数)已经固定,无法针对将来的 SoC 做改变。

    returnValue = I2c_Read(i2c, (DWORD*) data, 8);
允许通过注册表配置库文件

正如前面看到的,我们可以通过字符串和整数配置库文件。例如也可以在注册表中配置 SPI 库使用特定 SPI 接口、片选信号、波特率等,在你的应用启动的时候加载配置。如果你采用下面的方法加载库:

    hSPI = Spi_Init(L"SPI2");

库文件会自动从注册表下面的位置加载配置:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Toradex\SPI2]
      BitRateHz=500000
      DmaEnable=1
      etc.

你也许会想,这有什么好处。其中一个很好的优势是,可以针对不同设备只维护一个应用。例如,你可以在基于 NXP®(或者可以写为高通)i.MX6 处理器以及 NXP Vybrid 系统模块上使用相同的应用。模块之间唯一的不同是引脚配置,现在这些可以保持在注册表中。剩余的部分完全相同,因此允许你在不同的系统模块上使用一个二进制应用,使得您的开发更加容易。

易于维护

在本文的最后我想重点介绍“为维护而设计”方面。为了我们能够简单、安全地维护,我们根据每一种 SoC 将库文件分为单独的源代码文件。这确保我们能够在修复漏洞或者增加 SoC 相关功能的时候,保持其他 SoC 部分的代码不变。这降低了破坏现有代码的风险,因此也使得我们的软件总体上更加稳健。

参考
作者: Roman Schnarwiler, CTO, Toradex AG

评论

Please login to leave a comment!
Have a Question?