当前位置:工控会员企业> 首页 >技术文章>Toradex WinCE 库演进:新的库文件方法说明

韬睿(上海)计算机科技有限公司用户评论

用户评级:

口碑:3

人气:34953 低于平均:1.00%

收藏:0

联系我们

名称:韬睿(上海)计算机科技有限公司

地址:上海市 闵行区 金都路 3688号 1栋 215室

邮编:201108

电话:021-54380582

传真:021-54380582

网址:http://www.toradex.com

Email:shanghai@toradex.com

在线反馈

本网站信息涉及广告内容!

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

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

1). 概述

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


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


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


./ 可扩展,并可兼容的 API

./ 允许通过注册表配置库文件

./ 易于维护

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


2). 可扩展,并可兼容的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);

-----------------------------


3). 允许通过注册表配置库文件

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

-----------------------------

hSPI = Spi_Init(L"SPI2");

-----------------------------

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

-----------------------------

[HKEY_LOCAL_MACHINE\SOFTWARE\Toradex\SPI2]

BitRateHz=500000

DmaEnable=1

etc.

-----------------------------

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


4). 易于维护

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


5). 参考

您可以在我们的开发者中心 中找到所支持功能的列表以及下载库文件、API说明等。

同样欢迎您查看我们的library roadmap,我们公开了所以已知的问题和我们计划解决的时间。

发布时间:2016年12月6日 10:53  人气:   审核编辑(李晨晖)
相关链接

我来评价

评价:
一般