- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在分析我的系统(Freescale ARM MX6Q 和 Linux 内核版本 3.0.35)中的中断延迟,我正在使用 irqsoff 跟踪器,这是我获得的最大 irq 关闭延迟的输出:
# tracer: irqsoff
#
# irqsoff latency trace v1.1.5
# --------------------------------------------------------------------
# latency: 2770 us, #89/89, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:4)
# -----------------
# | task: swapper-0 (uid:0 nice:0 policy:0 rt_prio:0)
# -----------------
# => started at: tick_oneshot_mode_active
# => ended at: default_idle
#
#
# _------=> CPU#
# / _-----=> irqs-off
# | / _----=> need-resched
# || / _---=> hardirq/softirq
# ||| / _--=> preempt-depth
# |||| / delay
# cmd pid ||||| time | caller
# \ / ||||| \ | /
<idle>-0 0d..1 1us : tick_oneshot_mode_active
<idle>-0 0d..1 2us : clockevents_notify <-arch_idle
<idle>-0 0d..1 3us : _raw_spin_lock_irqsave <-clockevents_notify
<idle>-0 0d..1 5us : __raw_spin_lock_irqsave <-_raw_spin_lock_irqsave
<idle>-0 0d..1 6us : add_preempt_count <-__raw_spin_lock_irqsave
<idle>-0 0d..2 7us : clockevents_do_notify <-clockevents_notify
<idle>-0 0d..2 8us : raw_notifier_call_chain <-clockevents_do_notify
<idle>-0 0d..2 10us : __raw_notifier_call_chain <-raw_notifier_call_chain
<idle>-0 0d..2 11us : notifier_call_chain <-__raw_notifier_call_chain
<idle>-0 0d..2 12us : tick_notify <-notifier_call_chain
<idle>-0 0d..2 13us : tick_broadcast_oneshot_control <-tick_notify
<idle>-0 0d..2 15us : _raw_spin_lock_irqsave <-tick_broadcast_oneshot_control
<idle>-0 0d..2 16us : __raw_spin_lock_irqsave <-_raw_spin_lock_irqsave
<idle>-0 0d..2 17us+: add_preempt_count <-__raw_spin_lock_irqsave
<idle>-0 0d..3 19us : clockevents_set_mode <-tick_broadcast_oneshot_control
<idle>-0 0d..3 20us : twd_set_mode <-clockevents_set_mode
<idle>-0 0d..3 21us : irq_modify_status <-gic_disable_ppi
<idle>-0 0d..3 22us : __irq_get_desc_lock <-irq_modify_status
<idle>-0 0d..3 24us : irq_to_desc <-__irq_get_desc_lock
<idle>-0 0d..3 25us : _raw_spin_lock_irqsave <-__irq_get_desc_lock
<idle>-0 0d..3 26us : __raw_spin_lock_irqsave <-_raw_spin_lock_irqsave
<idle>-0 0d..3 27us : add_preempt_count <-__raw_spin_lock_irqsave
<idle>-0 0d..4 29us : __irq_put_desc_unlock <-irq_modify_status
<idle>-0 0d..4 30us : _raw_spin_unlock_irqrestore <-__irq_put_desc_unlock
<idle>-0 0d..4 31us : sub_preempt_count <-_raw_spin_unlock_irqrestore
<idle>-0 0d..3 32us : irq_get_irq_data <-gic_disable_ppi
<idle>-0 0d..3 34us : irq_to_desc <-irq_get_irq_data
<idle>-0 0d..3 35us : gic_mask_irq <-gic_disable_ppi
<idle>-0 0d..3 36us : _raw_spin_lock <-gic_mask_irq
<idle>-0 0d..3 37us : __raw_spin_lock <-_raw_spin_lock
<idle>-0 0d..3 39us : add_preempt_count <-__raw_spin_lock
<idle>-0 0d..4 40us : _raw_spin_unlock <-gic_mask_irq
<idle>-0 0d..4 41us+: sub_preempt_count <-_raw_spin_unlock
<idle>-0 0d..3 43us : _raw_spin_unlock_irqrestore <-tick_broadcast_oneshot_control
<idle>-0 0d..3 44us : sub_preempt_count <-_raw_spin_unlock_irqrestore
<idle>-0 0d..2 45us+: _raw_spin_unlock_irqrestore <-clockevents_notify
<idle>-0 0d..2 47us : sub_preempt_count <-_raw_spin_unlock_irqrestore
<idle>-0 0d..1 48us+: mxc_cpu_lp_set <-arch_idle
<idle>-0 0d..1 50us+: gpc_mask_single_irq <-mxc_cpu_lp_set
<idle>-0 0d..1 51us+: gpc_mask_single_irq <-mxc_cpu_lp_set
<idle>-0 0d..1 53us+: arch_idle_multi_core <-arch_idle
<idle>-0 0d..1 55us!: ca9_do_idle <-arch_idle_multi_core
<idle>-0 0d..1 2709us : clockevents_notify <-arch_idle
<idle>-0 0d..1 2710us : _raw_spin_lock_irqsave <-clockevents_notify
<idle>-0 0d..1 2711us : __raw_spin_lock_irqsave <-_raw_spin_lock_irqsave
<idle>-0 0d..1 2712us+: add_preempt_count <-__raw_spin_lock_irqsave
<idle>-0 0d..2 2714us : clockevents_do_notify <-clockevents_notify
<idle>-0 0d..2 2715us : raw_notifier_call_chain <-clockevents_do_notify
<idle>-0 0d..2 2716us : __raw_notifier_call_chain <-raw_notifier_call_chain
<idle>-0 0d..2 2717us : notifier_call_chain <-__raw_notifier_call_chain
<idle>-0 0d..2 2718us : tick_notify <-notifier_call_chain
<idle>-0 0d..2 2720us : tick_broadcast_oneshot_control <-tick_notify
<idle>-0 0d..2 2721us : _raw_spin_lock_irqsave <-tick_broadcast_oneshot_control
<idle>-0 0d..2 2722us : __raw_spin_lock_irqsave <-_raw_spin_lock_irqsave
<idle>-0 0d..2 2723us : add_preempt_count <-__raw_spin_lock_irqsave
<idle>-0 0d..3 2725us : clockevents_set_mode <-tick_broadcast_oneshot_control
<idle>-0 0d..3 2726us : twd_set_mode <-clockevents_set_mode
<idle>-0 0d..3 2727us : irq_modify_status <-gic_enable_ppi
<idle>-0 0d..3 2729us : __irq_get_desc_lock <-irq_modify_status
<idle>-0 0d..3 2730us : irq_to_desc <-__irq_get_desc_lock
<idle>-0 0d..3 2731us : _raw_spin_lock_irqsave <-__irq_get_desc_lock
<idle>-0 0d..3 2732us : __raw_spin_lock_irqsave <-_raw_spin_lock_irqsave
<idle>-0 0d..3 2733us+: add_preempt_count <-__raw_spin_lock_irqsave
<idle>-0 0d..4 2738us+: __irq_put_desc_unlock <-irq_modify_status
<idle>-0 0d..4 2739us : _raw_spin_unlock_irqrestore <-__irq_put_desc_unlock
<idle>-0 0d..4 2741us : sub_preempt_count <-_raw_spin_unlock_irqrestore
<idle>-0 0d..3 2742us : irq_get_irq_data <-gic_enable_ppi
<idle>-0 0d..3 2743us : irq_to_desc <-irq_get_irq_data
<idle>-0 0d..3 2745us : gic_unmask_irq <-gic_enable_ppi
<idle>-0 0d..3 2746us : _raw_spin_lock <-gic_unmask_irq
<idle>-0 0d..3 2747us : __raw_spin_lock <-_raw_spin_lock
<idle>-0 0d..3 2748us+: add_preempt_count <-__raw_spin_lock
<idle>-0 0d..4 2750us : _raw_spin_unlock <-gic_unmask_irq
<idle>-0 0d..4 2751us+: sub_preempt_count <-_raw_spin_unlock
<idle>-0 0d..3 2753us : ktime_get <-tick_broadcast_oneshot_control
<idle>-0 0d..3 2754us+: clocksource_mmio_readl_up <-ktime_get
<idle>-0 0d..3 2756us : tick_program_event <-tick_broadcast_oneshot_control
<idle>-0 0d..3 2757us : tick_dev_program_event <-tick_program_event
<idle>-0 0d..3 2758us : ktime_get <-tick_dev_program_event
<idle>-0 0d..3 2759us+: clocksource_mmio_readl_up <-ktime_get
<idle>-0 0d..3 2761us : clockevents_program_event <-tick_dev_program_event
<idle>-0 0d..3 2762us : twd_set_next_event <-clockevents_program_event
<idle>-0 0d..3 2764us : _raw_spin_unlock_irqrestore <-tick_broadcast_oneshot_control
<idle>-0 0d..3 2765us+: sub_preempt_count <-_raw_spin_unlock_irqrestore
<idle>-0 0d..2 2767us : _raw_spin_unlock_irqrestore <-clockevents_notify
<idle>-0 0d..2 2768us : sub_preempt_count <-_raw_spin_unlock_irqrestore
<idle>-0 0d..1 2769us+: default_idle
<idle>-0 0d..1 2772us+: trace_hardirqs_on <-default_idle
<idle>-0 0d..1 2773us : <stack trace>
=> trace_hardirqs_on
=> default_idle
=> cpu_idle
=> rest_init
=> start_kernel
=>
所以根据 ftrace,我有一个相当大的延迟,看起来只要 CPU 空闲,中断就被禁用了。所以我认为这肯定不是真的,所以我更仔细地研究了函数 tick_oneshot_mode_active:
int tick_oneshot_mode_active(void)
{
unsigned long flags;
int ret;
local_irq_save(flags);
ret = __this_cpu_read(tick_cpu_device.mode) == TICKDEV_MODE_ONESHOT;
local_irq_restore(flags);
return ret;
}
因此在宏 local_irq_save 中,中断被禁用并调用函数 trace_hardirqs_off() 哪些寄存器被禁用:
#define local_irq_save(flags) \
do { \
raw_local_irq_save(flags); \
trace_hardirqs_off(); \
} while (0)
检查设备模式后,中断已启用,现在这里很奇怪:
#define local_irq_restore(flags) \
do { \
if (raw_irqs_disabled_flags(flags)) { \
raw_local_irq_restore(flags); \
trace_hardirqs_off(); \
} else { \
trace_hardirqs_on(); \
raw_local_irq_restore(flags); \
} \
} while (0)
在我的例子中,代码遍历第一个分支:
if (raw_irqs_disabled_flags(flags)) { \
raw_local_irq_restore(flags); \
trace_hardirqs_off(); \
看起来即使中断被重新启用,也没有调用函数 trace_hardirqs_on 而是调用 trace_hardirqs_off()。为什么会这样,我真的有这么大的延迟吗?
最佳答案
关于c - Linux 内核 ftrace irqsoff 跟踪器生成奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24207371/
我需要跟踪包含数千个 JAR 和 .CLASS 文件的已编译 Java 应用程序,您知道有什么合适的工具可以附加到 JVM 来跟踪函数调用(无需源代码)吗? 最佳答案 是的。 Jprofiler无需源
我想使用深度学习和计算机视觉技术来检测和统计葡萄园中葡萄藤的数量。我正在使用 YOLOv4 对象检测器并在 darknet 上进行训练框架。我已经能够将 SORT 跟踪器集成到我的应用程序中并且运行良
我有一个分为两部分的问题 (1) 如何在用户不移动时暂停事件跟踪,(2) 这可以节省电池生命周期吗? 更多信息。我正在构建一个事件跟踪器,但用于通常涉及大量暂停的事件 - 例如。步行30分钟,在一个位
我需要能够在一个页面上使用多个 Google Analytics(分析)。我怎样才能用异步代码做到这一点? 让跟踪器的工作方式有点像这样(不确定确切的代码): var tracker2 = _gat.
我正在尝试为我的 Android 应用设置 Google Analytics v2。 现在,我正在尝试通过为我的 Activity 和 fragment 设置跟踪器来跟踪不同的屏幕。我有两个所有东西都
您知道有哪些易于使用、简洁的 Python 或 Perl API 可以与 BitTorrent Tracker 进行交互吗?例如,我获取一个 torrent 文件,枚举文件中的所有跟踪器,并向跟踪器询
我一直在尝试为 SEO 编写自己的关键字位置排名扫描器。我找到了一个 PHP 类,它看起来很有用,但我不知道如何让它工作。 我对在 PHP 中使用类/函数还很陌生。 这是我找到的代码: http://
我正在使用 KCF 跟踪算法,我的问题是当目标退出窗口时,跟踪器不会重置并错误地在窗口边缘显示它的矩形。在理想状态下,跟踪器应该在失去目标时删除矩形。 这些是我的代码: int main(int ar
我正在开发一项服务,用于跟踪互联网上的节点。该服务将按日期时间对节点列表进行排序,并且数据库不需要在崩溃中幸存下来(http://wiki.postgresql.org/wiki/What%27s_n
我有一个如下所示的类,当我通过命令行运行它时,我想查看进度状态。类似的东西, 10% completed... 30% completed... 100% completed...Job done!
我已经按照入门指南进行了一些扩展,以了解之前的 Angular 2 版本。我已经更新了我的修订版并相应地更改了所有内容。当我运行 Web 服务器时,我现在收到 traceur 错误 404... 这是
我正在开发一个使用 GPS/GPRS/GSM 的车辆跟踪系统。我目前使用的追踪设备是 GV100,这是一款来自 Quectel ([www.quectel.com][1]) 的 GPS/GPRS/GS
我将 angular2 从 RC2 迁移到 RC4,现在收到以下错误: localhost/:36 Error: Error: XHR error (404 Not Found) loading ht
我目前正在尝试在 nodeJS 中实现一个最小的 torrent 客户端。 我正在阅读此规范:https://wiki.theory.org/index.php/BitTorrentSpecifica
我正在使用 OpenCV 跟踪器在视频中执行人脸跟踪,每隔几帧使用人脸检测器。如果人脸检测器检测到人脸,我想用“检测到的”边界框更新跟踪器。我看到在 C++ 实现中有一个输入 Rect 的选项,但由于
我刚刚安装了 Mantis 错误跟踪器以与 Eclipse IDE 一起使用,并且已经开始发现它的优点。真的很棒。 由于 Eclipse 通过 PHP soap API 与 Mantis 通信,我想知
使用 Google Analytics 的 Javascript 跟踪器,如果有人访问 IP #1 的网站,1 小时后(同一天)使用另一个 IP #2(但在同一浏览器中)访问网站,是否算作 1 或2
很抱歉打扰您,但我已经为此苦苦挣扎了近两周,并进行了很多研究,但没有找到任何解决方案: 我正在尝试运行这个 git 项目 open gps tracker ,在本地它运行完美,但是当我将它部署到开放
我有一个 asp net 项目,我必须在登录后向 Mantis 跟踪器添加一些问题。最好的方法是什么? JS 还是 C#?我找到了几个库(例如 Mantis-JS),但我发现没有文档,我不明白我应该做
我发送了一个抓取数据包,播种器、下载器和盗取器总是返回 0。 这是我的初始连接和抓取代码。 public void scrape() { for (final String infoh
我是一名优秀的程序员,十分优秀!