OK6410A 开发板 (八) 65 linux-5.11 OK6410A linux tick与schedule

发布者:温文儒雅最新更新时间:2022-08-22 来源: csdn关键字:OK6410A  开发板  11  tic 手机看文章 扫描二维码
随时随地手机看文章

tick的概念与实现

摘抄并整理 http://www.wowotech.net/timer_subsystem/time_subsystem_index.html


tick的概念


时间子系统1.0


1. 生产者

在每个architecture相关的代码中要有实现clock event和clock source模块。


clock event

就是通过timer硬件的中断处理函数完成的,在此基础上可以构建tick模块,tick模块维护了系统的tick

例如系统存在10ms的tick,每次tick到来的时候,timekeeping模块就增加系统时间

如果timekeeping完全是tick驱动,那么它精度只能是10ms


clock source

为了更高精度,clock source模块就是一个提供tick之间的offset时间信息的接口函数。

但是实际上并没有提供高精度


2.内核消费者

最初的linux kernel中只支持低精度的timer,也就是基于tick的timer。

如果内核采用10ms的tick,那么低精度的timer的最高的精度也只有10ms,想要取得us甚至ns级别的精度是不可能的。

各个内核的驱动模块都可以使用低精度timer实现自己的定时功能。

各个进程的时间统计也是基于tick的,内核的调度器根据这些信息进行调度。

System Load和Kernel Profiling模块也是基于tick的,用于计算系统负荷和进行内核性能剖析。


3.用户消费者

从用户空间空间来看,有两种需求

一种是获取或者设定当前的系统时间的接口函数:例如time,stime,gettimeofday等。

另外一种是timer相关的接口函数:例如setitimer、alarm等,当timer到期后会向该进程发送signal。



问题:

1. 嵌入式设备需要较好的电源管理策略 , 但是当前系统 周期性时钟会导致从低功耗(idle)状态进入高功耗,不符合电源管理的需求

2. 多媒体的应用程序需要非常精确的timer(ns),但是当前系统 不能提供足够精度的timer(ms)


时间子系统2.0

改变:

A. 新增内核配置 CONFIG_NO_HZ_IDLE  // 在系统idle的时候,停掉周期性tick

B. 新增 高精度 timer ,同时 保留 低精度 timer

C. 其实 A B 的更改都是在 生产者 这块改动的,内核消费者与用户消费者都没变化

1.时间子系统2.0的选择

CONFIG_GENERIC_CLOCKEVENTS

2.时间子系统2.0下,针对A的配置,三种情况

a. 非idle,   周期性tick idle,    周期性tick : CONFIG_HZ_PERIODIC

b. 非idle,   周期性tick idle,停掉周期性tick : CONFIG_NO_HZ_IDLE

c. 非idle,停掉周期性tick idle,停掉周期性tick : CONFIG_NO_HZ_FULL

3.时间子系统2.0下,针对B的配置,两种情况

a. 无高精度timer : CONFIG_HIGH_RES_TIMERS=n

b. 有高精度timer : CONFIG_HIGH_RES_TIMERS CONFIG_TICK_ONESHOT



// 在 时间子系统上封装出了

// 1. tick device : 负责调度(周期性调度和非周期性调用)

// 2. timer : 负责定时器(高精度定时器和低精度定时器)


tick device 的类型

每一个cpu 有一个 tick device (clock event device) // SMP下 ,多个cpu对应的 tick device 中有一个被选择做global tick device,该device负责维护整个系统的jiffies以及更新哪些基于jiffies进行的全系统统计信息。

tick device 根据 类型 分为两种

periodic tick device

可以按照固定的时间间隔产生tick event

event handler是 tick_handle_periodic (没有配置高精度timer)或 hrtimer_interrupt(配置了高精度timer)

one-shot tick device

设定后只能产生一次tick event,如果要连续产生tick event,那么需要每次都进行设定

event handler是 tick_nohz_handler(没有配置高精度timer)或 hrtimer_interrupt(配置了高精度timer)


tick device 的实例

linux-5.11 ok6410a 采用 了 

时间子系统2.0

无高精度timer

非idle,   周期性tick idle,    周期性tick : CONFIG_HZ_PERIODIC


每当底层有新的 clockevent device 加入到系统中的时候

1.会调用 clockevents_register_device 或者clockevents_config_and_register 向通用clockevent layer注册一个新的clockevent设备

2.会调用 tick_check_new_device 通知 tick device layer有新货到来。

3.如果tick device和clockevent device你情我愿,那么就会调用tick_setup_device函数setup这个tick device了。

a.一般而言,刚系统初始化的时候,所有cpu的tick device都没有匹配clock event device

b.因此,该cpu的local tick device也就是global tick device了。

c.而且,如果tick device是新婚(匹配之前,tick device的clock event device等于NULL),那么tick device的模式将被设定为 TICKDEV_MODE_PERIODIC ,即便clock event有one shot能力,即便系统配置了NO HZ。

4. 对应 TICKDEV_MODE_PERIODIC , setup函数 是 tick_setup_periodic // tick_setup_periodic 函数用来设定一个periodic tick device。

5. setup第一部分:设定 event handler 为 tick_handle_periodic // 对于周期性tick device,其clock event device的handler被设定为 tick_handle_periodic。

6. setup第二部分:调用 clockevent device layer 的接口函数 kick off底层的硬件,让其周期性的产生clock event,


time_init

machine_desc->init_time/s3c64xx_timer_init

samsung_pwm_clocksource_init(S3C_VA_TIMER, timer_irqs, &s3c64xx_pwm_variant);

pwm.base = base;

...

pwm.timerclk = clk_get(NULL, "timers");

_samsung_pwm_clocksource_init

samsung_timer_resources

samsung_clockevent_init

clockevents_config_and_register

clockevents_register_device

tick_check_new_device

tick_setup_device

void (*handler)(struct clock_event_device *) = NULL;

tick_setup_periodic(newdev, 0);

tick_set_periodic_handler

dev->event_handler = tick_handle_periodic;

clockevents_program_event

tick_setup_oneshot(newdev, handler, next_event);

request_irq(irq_number, samsung_clock_event_isr, IRQF_TIMER | IRQF_IRQPOLL, "samsung_time_irq", &time_event_device)

samsung_clocksource_init

sched_clock_register


什么时候开始有tick?

time_init

boot cpu ,在其初始化过程中会调用 time_init

这里会启动clocksource的初始化过程。这时候,周期性的tick就会开始了。

smp_init

其他的processor会启动,然后会注册其自己的local timer,这样,各个cpu上的tick就都启动了。


tick 的发生

// tick 发生时,走的是中断

// 这里面主要设置的 是 need_resched 


irq_usr

...

...

samsung_clock_event_isr

evt->event_handler/tick_handle_periodic

tick_periodic(cpu);

update_process_times // 根据task_struct 里面时间片相关的成员  做 set_tsk_need_resched

scheduler_tick

sched_clock_tick

curr->sched_class->task_tick(rq, curr, 0);

if (!clockevent_state_oneshot(dev)) return;

next = ktime_add_ns(next, TICK_NSEC);


tick 与 schedule


调用 调度 的 途径有很多

1. 直接调用

进程主动放弃cpu执行调度

2. 系统调用(通过检查 need_resched )

中断返回

系统调用返回用户空间

信号处理完成后返回内核空间


设置 need_resched 的途径还有很多// tick 是 设置 need_resched 的 一个途径

1.

2. 

tick 时的 schedule

返回用户空间时调度

need_resched


tick 属于 第一种


__irq_usr

irq_handler

b   ret_to_user_from_irq

// 从任务的TI_FLAGS标志判断是否需要处理抢占或者信号

ldr r1, [tsk, #TI_FLAGS]

movs    r1, r1, lsl #16

// 处理抢占或者信号

bne slow_work_pending

mov r0, sp              @ 'regs'

mov r2, why             @ 'syscall'

bl  do_work_pending

// 该函数内会调用 schedule

// 此时 表示 没有抢占或者信号要处理

// 或者 抢占或者信号 已经处理完毕

no_work_pending:

...

restore_user_regs fast = 0, offset = 0


__irq_svc

irq_handler

#ifdef CONFIG_PREEMPTION

blne    svc_preempt

bl  preempt_schedule_irq

__schedule

#endif

svc_exit r5, irq = 1

关键字:OK6410A  开发板  11  tic 引用地址:OK6410A 开发板 (八) 65 linux-5.11 OK6410A linux tick与schedule

上一篇:OK6410A 开发板 (八) 66 linux-5.11 OK6410A linux 并发 竞态 与 同步
下一篇:OK6410A 开发板 (八) 64 linux-5.11 OK6410A linux异常解析

推荐阅读最新更新时间:2024-11-08 08:30

51单片机控制SL811HS的USB主机底层驱动
引言 基于USB接口的设备使用方便,性价比高,因此在人们的工作和生活中得到了广泛的应用,如U盘,移动硬盘,光驱,USB摄像头,USB鼠标键盘等,同时,51系列单片机以其成熟的技术和高性价比吸引了大量国内用户,被广泛应用于测控和自动化领域,因此,如果在51单片机系统中增加USB主机接口,实现对USB从机设备的控制,则该单片机系统可以充分利用现有的各种USB从机设备,大大扩展单片机系统功能。 本设计实现了在51单片机系统中增加USB主机功能,采用普通51单片机外接专用USB接口芯片的方案,这种方案虽然会使系统传输速度受到限制,而且在稳定性有所欠缺,但此方案设计灵活性高,且易于移植,为低成本产品的开发提供了广阔前景,设计中采用51单
[单片机]
米尔入门级i.MX6UL开发板的神经网络框架ncnn移植与测试
米尔入门级i.MX6UL开发板的神经网络框架ncnn移植与测试 嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板 米尔 MYD-Y6ULX-V2 开发板,基于 NXP i.MX6UL/i.MX6ULL处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发板上进行神经网络框架ncnn的移植与测试开发,测试ncnn在此开发板上的性能与应用测试。 01.什么是ncnn ncnn 是腾讯优图推出的在手机端极致优化的高性能神经网络前向计算框架。也能够在移动设备上的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑移动端的部署和使用。无第三方依赖,跨平台,其中手机
[嵌入式]
米尔入门级i.MX6UL<font color='red'>开发板</font>的神经网络框架ncnn移植与测试
联发科逆袭:一年增长11
    2012年的全球半导体产业,前10大厂商7家负增长,唯有高通(NASDAQ:QCOM)增速超过两位数。 根据咨询公司iSuppli最新发布的数字,今年高通的半导体营收将达130亿美元,相比去年的102亿美元大幅增长27.2%,排名全球第三。按12月12日的收盘价计算,高通市值为1082亿美元,超过营收规模大其四倍有余的英特尔(NASDAQ:INTC)。英特尔的营收为475亿美元,市值为1028亿美元。 高通的大红大紫得益于扑面而来的移动互联网时代。在智能手机中,“Intel Inside”目前还只是一个口号,而高通的芯片则几乎无处不在。 不过,在作为全球最大智能手机市场的中国大陆,高通却被联发科(2454:TW)狠狠超过。按
[手机便携]
Google Android平台经理谈2011年Android发展路线图
本文由SocialBeta内容贡献者wisp编译自unhappy-with-slow-growth-of-android-app-purchases-google-talks-2011-roadmap。 Google Android平台经理Eric Chu明白虽然android智能手机用户在快速增长,但是付费应用的交易数量却表现惨淡。在周二于圣弗朗西斯科举行的Inside Social Apps会议上,Chu明确表示Google对付费应用交易完全不满意。 虽然目前对于Google在2011年的Android发展战略仍缺乏具体地消息(Chu表示“敬请期待进一步消息”),但大致可以才想到Google会在下面几
[手机便携]
U-Boot在基于S3C4480开发板上的移植
1 引言 Bootloader代码是器件复位后进入操作系统前执行的一段代码,通过该代码初始化处理器各寄存器和片上外设,建立存储器映射图以及初始化堆栈,从而为操作系统提供基本的运行环境。由于Bootloader与CPU和开发板配置有关,不可能有通用的Bootloader,因此需要根据具体情况进行移植。嵌入式系统U-Boot是当前流行、功能强大的Bootloader。U-Boot用于多种嵌入式CPU的Bootloader 程序,U-Boot支持ARM、PowerPC等多种架构的处理器,也支持Linux、NetBSD和Vx Works等操作系统。这里采用U Boot 的版本为U-boot-1.1.6。 2 U-Boot目录结构
[单片机]
U-Boot在基于S3C4480<font color='red'>开发板</font>上的移植
大冢商会:“从零开始的LED照明业务,2011年将实现飞跃”
      从事信息系统集成等业务的大冢商会还打算大力开展LED照明业务。该公司目前正在日本市场销售韩国FAWOO Technology的LED照明器具,并利用这些产品提出照明系统方案。日前记者就大冢商会的LED业务现状等采访了该公司MRO事业部LED照明部部长代理森本哲雄及营销本部产品推进部LED推进科的平城正美。(采访人:大久保 聪,《日经电子》,《Green Device Magazine》) ——请介绍一下大冢商会LED照明业务的发展历程。 大冢商会: 2008年我们公司在社长的呼吁下启动了LED照明业务。我们一直从事IT业务,LED照明业务是一个全新的领域,一切都是从零开始的。我们之前一直致力于利用IT技术来改善办公
[电源管理]
2022年全球功率半导体销售额同比增长11
据半导体市场研究机构IC insights最新公布的数据显示,2022年全球功率半导体的销售额预计将同比增长11%,达到245亿美元,实现连续第六年的增长,达到创纪录的历史最高水平。 IC insights表示,功率半导体销售额的持续增长,主要是因为这一大型分立半导体细分市场产品的平均销售价格(ASP)达到了近十多年来的最高涨幅。预计功率半导体的平均销售价格预计将在2021年同比增长8%,2022年则同比增长了11%。 2021年,功率半导体的销售额增长了26%,主要原因是单位出货量增加了13%,以及产能扩张的瓶颈推动了ASP的增长。功率半导体的一系列创纪录高销售额预计将于2023年结束,届时由于明年全球经济增长放缓以及设
[半导体设计/制造]
2022年全球功率半导体销售额同比增长<font color='red'>11</font>%
11.栈的初始化
11.栈的初始化 1.栈的概念: 2.满/空栈: 1.3:升/降栈: 1.4.栈桢的理解: 局部变量是保存在栈中的: Stack.c: 编译和反汇编: 传递参数: Func1: 保存寄存器的值: Main: Func1: Func2:
[单片机]
<font color='red'>11</font>.栈的初始化
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved