【ARMv8/v9 系统寄存 3 -- system counter CNTPCT_EL0】

ARMv8/v9 system counter

所有使用Arm处理器的系统中都会包含一个标准化的通用定时器(Generic Timer)框架。这个通用定时器系统提供了一个系统计数器(System Counter)和一组定时器(Timer)。其结构类似下图:
在这里插入图片描述
系统计数器是全局唯一的,并且全局共享,对系统中的所有Arm核心进行广播。

  • ARMv8.0 到 ARMv8.5(含):位宽:至少56位宽。任何64位读取的计数器值都会被零扩展到64位。频率:以固定频率递增,该频率通常在1-50MHz范围内。它可以支持一个或多个备选操作模式,在这些模式中,计数器以较大的数额递增,频率较低,通常用于节能。
  • 从 ARMv8.6 开始 位宽:必须是64位宽,频率:以固定的1GHz频率递增,翻转时间:不少于40年。

这个系统计数器还是一直存在的,哪怕系统处于待机状态,所有内核都被关闭了,它仍然可以工作。

需要注意的是system counter必须实现于always-on power domian. 在 ARMv8.0 到 ARMv8.5期间,为了配合低功耗的工作,system counter 如果运行低频率下,那么每个时钟周期可以增长一个相对较大的值,例如:在10M的时候每个时钟周期增长步长为1,但是在低功耗模式下运行在20KHz的时候,每个时钟周期增长步长为500。

从ARMv8.6 开始system counter运在固定的1GHz, ARM 解释说 尽管它的时钟周期为1ns,但是这并不需要每过1ns counter的值就增加1,它的增长步长不能低于200。

system counter读取函数实现

global syscnt
syscnt:
    STP X29, X30, [SP, #-16]!
    MOV X29, SP
	MRS X0, CNTPCT_EL0
    LDP X29, X30, [SP], #16
	RET

syscnt 使用举例

void syscnt_test(void)
{
        uint64_t start, end;

        start = syscnt();
        asm ("isb");
        end = syscnt();
        log_info("end:0x%llx - start:0x%llx = 0x%llx\n", start, end, end-start);
}

测试结果

[info]: syscnt_test(671): end:0xda8e32 - start:0xda8f54 = 0x122
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Yocto中,生成文件的过程是由BitBake工具完成的。BitBake是一个构建工具,用于构建Yocto项目,它可以生成各种文件,包括配置文件、日志文件、临时文件、构建输出等等。 在您提到的情况下,生成`aarch64-poky-linux.json`文件的过程如下: 1. 首先,BitBake通过查找`recipes-devtools/rust/rust-cross_%.bbappend`文件来确定如何构建交叉编译工具链。在该文件中,会有一些变量和指令,用于指导BitBake如何构建交叉编译工具链。 2. 根据`do_configure`指令,BitBake会运行`rust/configure`脚本来配置Rust编译器。在这个过程中,BitBake会设置一些编译器选项、环境变量等等。 3. 接下来,BitBake会运行`do_compile`指令来编译Rust编译器。在这个过程中,BitBake会生成一些中间文件、目标文件和库文件。这些文件会被放置在`build/tmp/work/x86_64-linux/rust-cross-armv8a-glibc/1.59.0-r0/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/aarch64-poky-linux/lib/`目录下。 4. 最后,BitBake会运行`do_install`指令来安装Rust编译器。在这个过程中,BitBake会将编译好的文件复制到`build/tmp/work/x86_64-linux/rust-cross-armv8a-glibc/1.59.0-r0/sysroot/usr/lib/rustlib/aarch64-poky-linux/lib/`目录下。同时,BitBake也会生成`aarch64-poky-linux.json`文件,并将其放置在`build/tmp/work/x86_64-linux/rust-cross-armv8a-glibc/1.59.0-r0/targets/`目录下。 总的来说,生成`aarch64-poky-linux.json`文件是由BitBake工具在编译Rust交叉编译器的过程中生成的。具体的生成过程是由`recipes-devtools/rust/rust-cross_%.bbappend`文件和`do_configure`、`do_compile`、`do_install`指令控制的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公CodingCos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值