当前位置: 首页 > news >正文

[Linux]学习笔记系列 -- [arm][lib]

文章目录

  • arch/arm/lib/delay.c
    • register_current_timer_delay 注册当前定时器延迟
    • read_current_timer 读取当前定时器
  • drivers/clocksource/timer-stm32.c
    • stm32_clocksource_init STM32 平台上初始化时钟源

在这里插入图片描述

https://github.com/wdfk-prog/linux-study

arch/arm/lib/delay.c

register_current_timer_delay 注册当前定时器延迟

void __init register_current_timer_delay(const struct delay_timer *timer)
{u32 new_mult, new_shift;u64 res;clocks_calc_mult_shift(&new_mult, &new_shift, timer->freq,NSEC_PER_SEC, 3600);res = cyc_to_ns(1ULL, new_mult, new_shift);if (res > 1000) {pr_err("Ignoring delay timer %ps, which has insufficient resolution of %lluns\n",timer, res);return;}if (!delay_calibrated && (!delay_res || (res < delay_res))) {pr_info("Switching to timer-based delay loop, resolution %lluns\n", res);delay_timer			= timer;lpj_fine			= timer->freq / HZ;delay_res			= res;/* cpufreq 可能会loops_per_jiffy扩展,因此请保留一个私有副本 */arm_delay_ops.ticks_per_jiffy	= lpj_fine;arm_delay_ops.delay		= __timer_delay;arm_delay_ops.const_udelay	= __timer_const_udelay;arm_delay_ops.udelay		= __timer_udelay;} else {pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");}
}

read_current_timer 读取当前定时器

int read_current_timer(unsigned long *timer_val)
{if (!delay_timer)return -ENXIO;*timer_val = delay_timer->read_current_timer();return 0;
}
EXPORT_SYMBOL_GPL(read_current_timer);

drivers/clocksource/timer-stm32.c

stm32_clocksource_init STM32 平台上初始化时钟源

static unsigned long stm32_read_delay(void)
{return readl_relaxed(stm32_timer_cnt);
}static int __init stm32_clocksource_init(struct timer_of *to)
{u32 bits = stm32_timer_of_bits_get(to);const char *name = to->np->full_name;/** 此驱动程序允许注册多个计时器,并依赖于通用时间框架来选择正确的计时器。* 但是,不允许对 sched_clock 执行相同的作。* 我们对 16 位定时器的 sched_clock 不感兴趣,而只对 32 位定时器感兴趣,* 因此如果尚未注册 32 位定时器,我们选择这个 32 位定时器作为sched_clock。*/if (bits == 32 && !stm32_timer_cnt) {/** 立即启动计数器,因为我们将在之后立即使用它。*/stm32_timer_start(to);/* 获取计数器寄存器地址 */stm32_timer_cnt = timer_of_base(to) + TIM_CNT;sched_clock_register(stm32_read_sched_clock, bits, timer_of_rate(to));pr_info("%s: STM32 sched_clock registered\n", name);stm32_timer_delay.read_current_timer = stm32_read_delay;stm32_timer_delay.freq = timer_of_rate(to);register_current_timer_delay(&stm32_timer_delay);pr_info("%s: STM32 delay timer registered\n", name);}return clocksource_mmio_init(timer_of_base(to) + TIM_CNT, name,timer_of_rate(to), bits == 32 ? 250 : 100,bits, clocksource_mmio_readl_up);
}
http://www.lryc.cn/news/615737.html

相关文章:

  • 13. 是否可以在static环境中访问非static变量
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 MySQL 服务器
  • opencv颜色识别项目:识别水果
  • jmeter常规压测【读取csv文件】
  • Ubuntu 22.04 离线环境下完整安装 Anaconda、CUDA 12.1、NVIDIA 驱动及 cuDNN 8.9.3 教程
  • AI绘画:生成唐初秦叔宝全身像提示词
  • 安全运维工具链全解析
  • ELK分布式日志采集系统
  • 【系统分析师】软件需求工程——第11章学习笔记(上)
  • 旅行者1号无线电工作频段
  • 《解锁 C++ 起源与核心:命名空间用法 + 版本演进全知道》
  • 计算机网络:求地址块128.14.35.7/20中的相关信息
  • 《从零构建大语言模型》学习笔记4,注意力机制1
  • Redis如何实现一个分布式锁?
  • Redis主从复制和哨兵模式
  • nginx+lua+redis案例
  • Error: error:0308010C:digital envelope routines::unsupported at new Hash
  • node.js 学习笔记3 HTTP
  • #C语言——刷题攻略:牛客编程入门训练(八):分支控制(二)
  • Linux 虚拟机磁盘空间占满-全面清理方案
  • 【C++详解】红黑树规则讲解与模拟实现(内附红黑树插入操作思维导图)
  • 随机向量正交投影定理(Orthogonal Projection Theorem, OPT)_学习笔记
  • 【Python】常用内置模块
  • 诺基亚就4G/5G相关专利起诉吉利对中国汽车及蜂窝模组企业的影响
  • QT的常用控件说明
  • 【人工智能99问】LLaMA的训练过程和推理过程是怎么样的?(22/99)
  • vuhub Beelzebub靶场攻略
  • 智能体革命:网络安全人的角色重塑与突围指南
  • 医学统计(随机对照研究分类变量结局数据的统计策略2)
  • 用 ES|QL 做搜索从过滤到相关性、再到语义与混合检索