S32 SDK 的外设驱动组件

lichongyang
lichongyang
lichongyang
110
文章
0
评论
2020年4月26日15:25:18 评论 324 次浏览

在 S32 SDK 中每一个外设驱动组件都有一个组件的全局状态结构体,以<组件/外设名>_state_t 命名,用于存放该外设/组件的工作状态和硬件资源使用信息,主要包含以下信息:

① 外设模块的配置信息;
② 通信外设收发器的工作状态(isTxBbusy/isRxBusy);
③ 通信外设收发器是否为阻塞方式工作(isTxBlocking/isRxBlocking);
④ 中断回调函数指针(*callback)及参数(*callbackParam)定义;
⑤ 外 设 工 作 / 通 信 使 用 的 信 号 (semaphore)(TxComplete/RxComplete) 和 通 信 状 态
(transmitStatus/receiveStatus);
⑥ 通信外设收发数据的缓存(txBuff/rxBuff)和大小(txSize/rxSize);
⑦ 外设使用的 DMA 通道号;

在基于 MCU 的嵌入式系统软件开发中,外设中断是保证系统软件工作实时性和内核效率最重要的工作机制--在外设事件(比如通信外设的数据接收完成, GPIO 状态改变以及定时周期满等), CPU 内核将停止当前程序指令的执行,及时响应外设中断请求并做相应的处理(比如搬移数据,填充缓冲,改变程序运行条件/状态、激活新任务等)。
    在传统的嵌入式 MCU 底层外设驱动程序开发中,对于外设中断的处理流程/机制如下:
① POR 复位后,在 main()函数最开始完成系统时钟初始化后,初始化外设模块时,就配置使能相应的外设中断;
② 编写中断服务函数 ISR,在其中处理中断事件,置位全局事件标志通知应用程序做后续处理, 并清除中断标志;
③ 将中断服务函数放到 MCU 的中断向量表中,这一步可能是通过关键词(interrupt) + 中断向量号 + ISR 定义的方式实现,工具链的编译器和链接器自动识别并加载到 MCU 中断向量表中;
④ 使能全局中断;
在整个 MCU 正常工作期间,除非特殊应用需要,不会关心外设中断的关闭与使能,
而在 S32 SDK 中,其进行了如下优化:

①外设初始化 Init()函数中, 仅使能芯片级中断控制器中对应的中断源(比如 S32K 的 ARM Cortex M 系列内核的 NVIC,和 Qorivva MPC57xx/S32R 的 PowerPC e200 系列内核的 INTC模块)并不使能相应外设的 IP 级中断(比如 LPUART 的 TX 和 RX 以及 ERROR 中断);
    在具体使用外设的特定功能(比如 LPUART 的数据发送和接收)时,才使能该特定功能的中断(比如 LPUART 的发送中断和接收中断),在中断发生后,若相应的中断已经完全发生(比如发送 10 字节数据,全部发送完成),则在 ISR 的最后关闭该特定功能中断;这样做的好处是,避免意外的中断浪费宝贵的 CPU 资源,比如由于程序跑飞导致的LPUART 意外数据发送和接收;
   ② 在 S32 SDK 的 PD 层为绝大多数硬件外设模块提供了中断 ISR 函数, (对应 S32K SDK来说,仅 PD 层的 LPIT 组件和 GPIO 的 IRQ 中断,需要用户自己使能 NVIC 中断并编写自己的中断 ISR)无需用户自己编写;
   在 S32 SDK 的组件中, 相同外设的不同实体(比如 LPUART0/1/2)共用同一个中断 ISR,依靠外设实体号(instance)来区分不同的处理,由于相同外设的工作流程和中断处理流程相同,这样的好处是可以提高代码的复用效率:

③ S32 SDK 默认在 startup 过程中将外设中断向量表拷贝到 SARM 中,这样运行用户可以在程序运行时动态的修改中断 ISR;
④ S32 SDK 中为大部分外设都提供了中断处理函数(ISR)—位于外设驱动 PD 的中断处理文件(<Peripheral_Name>_irq.c/h)中,并在外设初始化时配置了相应的中断,其外设中断 ISR属于 SDK PD 层驱动非常重要的一部分代码,不允许用户修改,因此提供了在外设中断 ISR中调用用户中断回调函数的方式给用户提供中断处理接口。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信小程序
  • 我的微信小程序扫一扫
  • weinxin
lichongyang
  • 本文由 发表于 2020年4月26日15:25:18
  • 转载请务必保留本文链接:https://www.chongyangli.com/archives/s32-sdk-%e7%9a%84%e5%a4%96%e8%ae%be%e9%a9%b1%e5%8a%a8%e7%bb%84%e4%bb%b6/
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: