当前位置:网站首页>嵌入式开发:嵌入式基础——使用指针数组映射外设
嵌入式开发:嵌入式基础——使用指针数组映射外设
2022-08-10 15:00:00 【粤嵌教育】
驱动器设计的一个基本问题是决定如何映射到外设寄存器。多年来,嵌入式开发人员已经使用了许多不同的方法,例如建立结构来定义位图,或者简单地将所需的值写入寄存器;然而,我一直最喜欢的方法是创建一个映射到外设寄存器的指针数组。这种方法提供了一种将外设寄存器分组到逻辑通道的优雅方式,并提供了一种简单的方法来初始化外设以及访问其数据。指针数组方法很容易移植,可以用来创建标准的API和应用程序代码,它们可以在不同的硬件平台上工作,允许共享应用程序代码。如果编写得当,它还可以创建更容易阅读和理解的代码,从而使软件维护更容易。
指针数组的概念是一种相对直接的映射到外设的方法。其思想是创建一个数组,其中数组的每个索引都是指向特定类型的外围寄存器的指针。例如,对于具有多个GPIO端口的微控制器,将设置一个指针数组来访问每个可用端口的方向寄存器(清单1)。将设置另一个指针数组来访问输入和输出寄存器。每个寄存器类型都将与其自己的指针数组相关联。
清单1–GPIO的指针数组
注意指针数组的声明方式是很重要的。指针数组portsddr是一个指向可变uint16的常量指针。请注意,声明是从右向左定义的。指向寄存器的指针是一个常量指针,但将其声明为易失性uint16_t会通知编译器,所指向的值可能会自行改变,而无需软件的交互。
嵌入式开发人员使用这种方法进行内存映射有很多好处。首先,它允许将功能相同的寄存器逻辑地组合在一起。这使得软件工程师可以将每个外设视为MCU的一个独立通道。例如,定时器1和定时器2可以看作是两个不同的定时器通道。设置每个定时器的周期寄存器只需要简单地写入周期指针阵列的适当通道索引。指针数组的索引变成了通道访问索引。例如,指针数组索引0将与定时器1相关联;指针数组索引1将与定时器2相关联。
接下来,当外设开始看起来像通道时,创建一个抽象的方法就变得容易了,不仅可以初始化,还可以访问每个外设数据。这允许使用一个简单的循环来初始化每个外设(清单2)。只需使用正确的通道索引,就可以访问外设的数据。这使得驱动程序框架不仅易于理解和重用,而且是一个抽象设备寄存器的框架。
清单2–定时器初始化循环
最后,它允许开发人员为每个外设创建配置表。嵌入式开发人员可以创建一个可重用的驱动程序,将配置表作为参数,而不是总是编写定制的初始化代码。然后,初始化函数一次循环一个通道,并通过指针数组初始化外设寄存器。这使得驱动程序成为一个库模块,一次又一次地被测试,产生可以加速下一个项目的经过验证的代码。
边栏推荐
猜你喜欢
领域驱动模型设计与微服务架构落地-从项目去剖析领域驱动
Problem solving-->Online OJ (19)
Flask框架——MongoEngine使用MongoDB数据库
WSL 提示音关闭
DB2查询2个时间段之间的所有月份,DB2查询2个时间段之间的所有日期
王学岗—————————哔哩哔哩直播-手写哔哩哔哩硬编码录屏推流(硬编)(26节课)
fatal error C1083 Unable to open include file 'io.h' No such file
NFT数字藏品——数字藏品发行平台开发
Introduction to program debugging and its use
Community News——Congratulations to Dolphin Scheduling China User Group for 9 new "Community Administrators"
随机推荐
头脑风暴:目标和
兆骑科创高层次人才创业大赛平台,投融资对接,双创服务
程序员=加班??——掌握时间才能掌握人生
Zijin Example
【吴恩达来信】强化学习的发展!
BFT机器人带你走进智慧生活 ——探索遨博机器人i系列的多种应用
JS 从零手写实现一个bind方法
社区动态——恭喜海豚调度中国区用户组新晋 9 枚“社群管理员”
Azure IoT 合作伙伴技术赋能工作坊:IoT Dev Hack
scala 10种函数高级应用
产品使用说明书小程序开发制作说明
Lilac Garden
阿里五位MySQL封神大佬耗17个月总结出53章性能优化法则
MySQL Principle and Optimization: Update Optimization
第壹章模块大全之《re模块》
CSP-J1 CSP-S1 初赛 第1轮(2022.08.09)
兆骑科创创业赛事活动发布平台,创业赛事,项目路演
基于inotify实现落盘文件的跨进程实时读写交互
Introduction to program debugging and its use
SYM32——RTC实时时钟程序讲解