鸿蒙移植i.mx6ull(十) 系统时钟

简介: 鸿蒙移植i.mx6ull(十) 系统时钟

1. Generic Timer介绍


参考资料:


ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf


《B8: The Generic Timer》 * 《D5: System Level Implementation of the Generic Timer》

STM32MP157芯片手册DM00327659.pdf


《46 System timer generator (STGEN)》

Linux时间子系统之(十七):ARM generic timer驱动代码分析


1.1 硬件结构


在操作系统中,需要一个系统时钟,各类芯片都有自己的定时器,它们的编程方法互不相同,这给系统移植带来麻烦。 Generic Timer是ARM推荐的一种硬件实现实现,可以实现统一的编程方法。 Generic Timer分为两部分:共享的System Counter、各个Processor专有的Timer。


System Counter:给所有Processor提供统一的时间

Timer:可以设置周期性的事件,给Processor提供中断信号

下图是Generic Timer的硬件框图,

红线表示时钟:System counter是时钟源,进入Porcessor中的Timer。

蓝线表示中断:Porcessor中的Timer产生的中断进入GIC,作为PPI(Private Peripheral Interrupt)传给Processor。 System Counter是系统级别的(System Level),给整个系统提供时钟,可以使用Memeory Mapped的寄存器来访问。


每个Processor里都有一个Timer,这些Timer可以发出周期性的中断,给Processor提供系统时钟。Timer需要使用CP15协处理器命令来访问。

1671001730667.jpg


1.1.1 System Counter特性

规格 描述
位宽(Width) 至少56位,跟硬件实现。
读取时,可以得到64位的数值。

频率(Frequency)

1M~50MHz,增加值可以调整:

比如时钟为8MHz时,每来一个时钟计数值增加1,

设置为4MHz时,每来一个时钟计数值增加2,

降低频率时可以降低功耗,同时增加步进值以维持时钟精度

溢出(Roll-over) 不少于40年
精度(Accuracy) 推荐:误差在24小时内不超过10秒
复位值(Start-up) 从0开始


1. 两种访问方式

SystemCounter是给所有Processor使用的,它有两种访问方式:


CP15协处理器命令:某个Processor去访问它时可以使用CP15协处理器命令。


MemoryMapped寄存器:


既然它是给所有Processor使用的,那么应该提供更高级的访问方法(System Level)


而且有些Processor并没有实现CP15,所有也应该提供MemoryMapped的方法


2. CP15寄存器

下面这个表格列出了所有的寄存器,包括SystemCounter和Timer,不仅仅是SystemCounter。

1671001800931.jpg

3. MemoryMapped寄存器

这些寄存器在下列手册描述得比较清楚:


DM00327659.pdf的《46 System timer generator (STGEN)》

ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf的Table D5-1(下图):

1671001810598.jpg


在u-boot代码中可以看到这样的结构体:

/* System Counter */
struct sctr_regs {
  u32 cntcr;   // control register, 启动/停止
  u32 cntsr;   // status register, 是否启动/停止, 使用哪个频率
  u32 cntcv1;  // count value lower register
  u32 cntcv2;  // count value upper register, cntcv1和cntcv2组成64位的计数值
  u32 resv1[4];
  u32 cntfid0; // base frequency register, 必须等于SystemCounter的输入频率
  u32 cntfid1; // cntfid1和cntfid2:其他频率
  u32 cntfid2;
  u32 resv2[1001];
  u32 counterid[1];
};


1.1.2 Timer特性


每个Processor都有一个Timer,它有3个寄存器,只能使用协处理器命令方位(CP15):


64位的比较寄存器(CVAL):当SystemCounter的值等于它时,产生事件(中断)


SystemCounter总是增长的,所以Timer的64位比较寄存器也只能设置为大于SystemCounter的值

被称为upcounter


32位的TimerValue寄存器(TVAL)


它是downconter

比如设置为1000,表示再经过1000个时钟之后,就会产生事件(中断)

实质是:设置64位的比较寄存器,让它等于SystemCounter+1000

32位的控制寄存器(CTL)


使能/禁止Timer

使能输出:是否能产生事件(中断) * 状态:是否能产生了事件(中断)

1671001832957.jpg


1.2 SystemCounter时钟源


SystemCounter的时钟源,跟芯片设计相关。


以STM32MP157为例:

1671001843499.jpg

1.3 使用方法

image.png


设置时钟源:芯片相关,一般u-boot里做好了

设置/启动SystemCounter

设置Processor的Timer:

设置比较值、使能中断、使能Timer

注册中断处理函数


2. GenericTimer源码分析


2.1 GenericTimer使用方法

image.png


设置时钟源:芯片相关,一般u-boot里做好了

设置/启动SystemCounter:一般u-boot里做好了

设置Processor的Timer:

设置比较值、使能中断、使能Timer

注册中断处理函数


2.2 源码分析


代码:kernel\liteos_a\platform\hw\arm\timer\arm_generic\arm_generic_timer.c


2.2.1 初始化


它做了2件事:


读出SystemCounter的频率:以后设置中断周期时要用

注册中断处理函数

LITE_OS_SEC_TEXT_INIT VOID HalClockInit(VOID)
{
    UINT32 ret;
    g_sysClock = HalClockFreqRead();
    ret = LOS_HwiCreate(OS_TICK_INT_NUM, MIN_INTERRUPT_PRIORITY, 0, OsTickEntry, 0);
    if (ret != LOS_OK) {
        PRINT_ERR("%s, %d create tick irq failed, ret:0x%x\n", __FUNCTION__, __LINE__, ret);
    }
}


2.2.2 启动Timer


它做了2件事:


使能中断:中断号是29

设置TimerValue寄存器:

OS_CYCLE_PER_TICK = g_sysClock / 100,也就是10MS之后产生中断

设置TimerValue寄存器的实质,就是设置比较寄存器(CVAL) =当前SystemCounter值 +

OS_CYCLE_PER_TICK
LITE_OS_SEC_TEXT_INIT VOID HalClockStart(VOID)
{
    HalIrqUnmask(OS_TICK_INT_NUM);
    /* triggle the first tick */
    TimerCtlWrite(0);
    TimerTvalWrite(OS_CYCLE_PER_TICK);
    TimerCtlWrite(1);
}


2.2.3 中断处理


它做了2件事:


调用OsTickHandler

设置下一次中断时间:

设置比较寄存器(CVAL) = 当前比较寄存器值 + OS_CYCLE_PER_TICK

为什么不是当前SystemCounter值 + OS_CYCLE_PER_TICK?

因为处理中断也是要时间的,SystemCounter值一直在增加

要让两次中断的间隔非常精确的话,要使用发生中断时的SystemCounter值,也就是比较寄存器的当前值

LITE_OS_SEC_TEXT VOID OsTickEntry(VOID)
{
    TimerCtlWrite(0);
    OsTickHandler();
    /*
     * use last cval to generate the next tick's timing is
     * absolute and accurate. DO NOT use tval to drive the
     * generic time in which case tick will be slower.
     */
    TimerCvalWrite(TimerCvalRead() + OS_CYCLE_PER_TICK);
    TimerCtlWrite(1);
}
相关文章
|
9月前
|
定位技术 开发工具
【HarmonyOS】鸿蒙应用实现调用系统地图导航或路径规划
【HarmonyOS】鸿蒙应用实现调用系统地图导航或路径规划
505 5
【HarmonyOS】鸿蒙应用实现调用系统地图导航或路径规划
|
10月前
|
Linux 编译器 Android开发
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡
560 1
鸿蒙系统被抹黑的深层解析:技术、商业与地缘政治的复杂博弈-优雅草卓伊凡
|
9月前
|
安全 开发工具 数据安全/隐私保护
HarmonyOS应用安全全攻略:从系统到代码的全面防护
本文全面解析HarmonyOS应用安全开发,涵盖系统到代码的防护策略。首先介绍HarmonyOS三层安全体系:系统安全层、开发工具层与应用生态层。接着详解设备与数据安全等级划分,提供分级加密实战代码,包括文件读写与HUKS高级加密案例。最后总结开发最佳实践,强调数据分类、最小权限、加密常态及传输安全保障,助你构建更安全的应用。保护用户数据不仅是功能需求,更是开发者责任!
|
7月前
|
移动开发 网络协议 小程序
鸿蒙NEXT即时通讯/IM系统RinbowTalk v2.4版发布,基于MobileIMSDK框架、ArkTS编写
RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChat和RainbowChat-Web 技术同源,历经考验。
322 1
|
8月前
|
缓存 移动开发 网络协议
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
624 1
|
10月前
|
人工智能 运维 监控
HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践
本书《HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践》深入探讨了鸿蒙系统的运维管理。从架构特点到实际操作,涵盖分布式能力、性能优化、安全维护及故障排查。内容包括设备管理、系统监控、安全管理等核心任务,提供常见问题解决方案与工具推荐。面对未来超级终端和AI赋能的挑战,运维人员需不断学习,以充分发挥鸿蒙的分布式优势,为用户带来流畅体验。
789 8
|
9月前
|
开发工具 数据安全/隐私保护 开发者
打造鸿蒙系统中最好用的加载动画和提示弹窗
幽蓝君开发了鸿蒙平台的轻量级弹窗工具 yloadinghud,旨在实现简洁优雅的提示交互。无需在每个页面重复初始化,只需一行代码即可展示加载动画或提示弹窗。支持多种类型,如成功、失败提示及文字弹窗,且具备自动消失功能,使用便捷。项目已上传至 ohpm 仓库,欢迎搜索体验并提出宝贵建议。#三方SDK #工具效率
|
10月前
|
JavaScript 前端开发 Java
HarmonyOS NEXT~鸿蒙系统下的Cordova框架应用开发指南
《HarmonyOS NEXT:鸿蒙系统下的Cordova框架应用开发指南》详细介绍如何将Cordova应用适配到鸿蒙系统。文章涵盖兼容性分析、环境配置、特性适配、性能优化及发布调试等内容。尽管Cordova官方暂无直接支持,但通过Cordova-Android平台与定制插件可实现功能扩展。开发者需注意性能差异,并借助插件机制融入鸿蒙特色功能,如服务卡片和分布式能力。未来,随着鸿蒙生态完善,Cordova在该平台的应用将更加广泛且高效。
885 1
|
10月前
|
移动开发 Java 测试技术
HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
本文详细介绍了鸿蒙系统(HarmonyOS)与mPaaS框架的集成方法。鸿蒙系统作为华为开发的分布式操作系统,具备分布式架构、微内核设计等特性;mPaaS是蚂蚁金服推出的移动开发平台,提供金融级组件和全生命周期管理能力。文章从环境准备、核心功能集成(如初始化、用户认证、支付功能)、适配问题解决到调试测试及最佳实践,全方位指导开发者高效集成两者。通过遵循指南,可充分利用鸿蒙的特性和mPaaS的金融能力,构建高性能、高安全性的应用,同时避免常见兼容性问题,缩短开发周期。
551 0
|
10月前
|
开发框架 API 开发工具
HarmonyOS NEXT~鸿蒙系统与Uniapp跨平台开发实践指南
本书《HarmonyOS NEXT~鸿蒙系统与Uniapp跨平台开发实践指南》深入探讨了华为鸿蒙系统(HarmonyOS)与Uniapp框架的融合应用。书中首先介绍了鸿蒙系统的分布式架构特点及其原子化服务理念,随后详细讲解了Uniapp在鸿蒙环境下的适配方案,包括开发环境配置、特有配置项设置以及条件编译调用鸿蒙原生能力的方法。此外,还提供了界面适配策略、性能优化建议及调试发布流程,帮助开发者高效构建多端协同应用。最后展望了鸿蒙生态未来的发展方向,如ArkUI-X的深度集成和全新API能力的应用前景。
894 0

热门文章

最新文章