嵌入式基础–使用指针数组映射外围设备

es定义位图或简单地将所需值写入寄存器;但是,我一直以来最喜欢的方法是创建一个映射到外设寄存器的指针数组。该方法提供了一种将外围设备寄存器分组为逻辑通道的好方法,并且提供了一种不仅可以初始化外围设备而且还可以访问其数据的简单方法。指针数组方法易于移植,可用于创建可在不同硬件平台上工作的标准API和应用程序代码,从而允许共享应用程序代码。如果编写得当,它还将创建易于阅读和理解的代码,从而使软件维护更加容易。

指针数组的概念是用于映射到外围设备的相对简单的方法。这个想法是创建一个数组,其中数组的每个索引都是指向特定类型外设寄存器的指针。例如,对于具有多个GPIO端口的微控制器,将设置一个指针阵列以访问每个可用端口的方向寄存器(清单1)。将设置另一个指针数组以访问输入和输出寄存器。每种寄存器类型都将与其自己的指针数组相关联。

清单1–GPIO的指针阵列

重要的是要注意指针数组的声明方式。指针数组portsddr是指向易失性uint16的常量指针。注意声明是从右到左定义的。指向寄存器的指针是一个常量指针,但是将其声明为易失性uint16_t会通知编译器所指向的值可能会自行更改,而无需软件的干预。

使用这种方法进行内存映射有很多优点。首先,它允许将具有相同功能的寄存器进行逻辑分组。这使软件工程师可以将每个外围设备视为MCU的单独通道。例如,计时器1和计时器2可以看作是两个不同的计时器通道。要设置每个定时器的周期寄存器,只需要简单地写入周期指针数组的正确通道索引即可。指针数组的索引然后成为通道访问索引。例如,指针数组索引0将与定时器1关联;指针数组索引1将与定时器2相关联。

接下来,当外围设备开始看起来像通道时,就很容易创建一种不仅初始化而且访问每个外围设备数据的抽象方法。这允许使用一个简单的循环来初始化每个外围设备(清单2)。它允许仅通过使用正确的通道索引来访问外围设备的数据。这样产生的驱动程序框架不仅易于理解和重用,而且使设备寄存器抽象化。

清单2–计时器初始化循环

最后,它允许开发人员为每个外围设备创建配置表。开发人员可以创建一个将配置表作为参数的可重用驱动程序,而不必总是编写自定义初始化代码。然后,初始化函数一次循环遍历该表的一个通道,并通过指针数组初始化外围寄存器。这使驱动程序成为一个库模块,该库模块一次又一次地被测试,从而生成经过验证的代码,可以加速下一个项目。

 

雅各布·贝宁戈 是一位嵌入式系统顾问和讲师,专门从事资源受限和低能耗设备的设计。他与公司合作,以降低成本和缩短上市时间,同时保持高质量和健壮的产品。他是一位狂热的高音扬声器(Jacob_Beningo),技巧和窍门专家,自家制鉴赏家和菠萝迷!请随时与他联系 jacob@beningo.com 或在他的网站www.beningo.com上。

 

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.