娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年02月03日(星期一)

2020年02月03日 | ARM-Linux中斷系統

發布者:心有歸屬 來源: eefocus關鍵字:ARM-Linux  中斷系統  子系統 手機看文章 掃描二維碼
隨時隨地手機看文章

1.前言

了解Linux中斷子系統,同時也需要了解ARM體系結構中斷處理流程;在熟悉整個軟硬件架構和流程基礎上,才能對流程進行細化,然后找出問題的瓶頸?!?. 梳理中斷處理子系統》


但是所有的優化都離不開一個量化的過程,有個可靠、高效、可讀性強的度量必不可少?!?. 一種測量中斷性能手段》


最后基于此,進行中斷性能的優化。《4.中斷性能優化》


2. 梳理中斷處理子系統

中斷系統涉及到軟硬件兩部分,具體到ARM系統和Linux涉及到很多相關點。


硬件以Cortex-A53為基礎,整個GIC架構包括兩部分:CPU內部的GIC CPU Interface(Cortex-A53 Chapter 9)和CPU外部的GIC external distributor component。


《ARM Cortex-A53 MPCore Processor Technical Reference Manual》簡單介紹了A53核內部的GIC CPU Interface。


《ARM Generic Interrupt Controller Architecture Specification v3/v4》詳細介紹了整個GIC架構的方方面面,具體實現比如GIC-600在《GIC-600 Generic Interrupt ControllerTechnical Reference Manual》。


相關閱讀記錄在《閱讀GIC-500 Technical Reference Manual筆記》。


軟件方面可以參考蝸窩科技關于中斷子系統的一系列文章《Linux中斷子系統》,一共9篇文章,講述了Linux中斷的方方面面。


《綜述》是一個導論性質文檔,從更高層次介紹了中斷相關軟硬件架構;


《IRQ number和中斷描述符》重點介紹了中斷描述符相關數據結構以及API;


在一個中斷出發之后,從CPU架構相模塊進行現場保護《ARM中斷處理過程》-->machine相關中斷處理handler將HW Interrupt ID翻譯成IRQ number《IRQ Domain介紹》-->IRQ number對應中斷例程《High level irq event handler》,以及最終現場恢復流程《ARM中斷處理過程》;


《驅動申請中斷API》是從中斷使用者角度介紹如何使用中斷;中斷處理的下半部包括《softirq》和《tasklet》,以及workqueue 1  2  3  4。


《GIC代碼分析》重點介紹了ARM架構中斷控制器的方方面面。


3. 一種測量中斷性能手段

3.1 明確評估標的

評估一個系統的中斷性能,首先要明確評估那一段處理的性能。這里評估的是從中斷觸發開始,到執行中斷例程(ISR)這段處理。


這一段從外部設備觸發中斷,到中斷控制器,再到CPU處理,直到ISR的調用執行,涉及到軟硬件的方方面面。


3.2 如何對標的進行量化

從硬件觸發開始到軟件ISR執行時間度量,跨軟硬件。測量起來難免會有誤差,尤其是兩者的時間軸問題不易同步。


好在Linux有周期性Timer,周期性Timer設置一個Load值,從Load開始倒計數,計數到達0的時候觸發中斷。


然后重新計數,并且可以隨時讀取當前計數值。


在ISR中讀取計數,就可以知道從上次0計數觸發中斷到當前消耗的Cycle數目,進而得到標的耗時。


3.3 內核實現

內核中主要注冊中斷、提供修改Load接口、創建proc節點。


中斷相關初始化,注冊中斷處理函數。在ISR中進行Timer Cycle的讀取。


提供修改Load接口,供動態修改Load,以達到在不同頻率下測試標的的目的。


選取不同頻率的load:

echo n > /proc/interrupt_stats


讀取Timer中斷統計信息:

cat /proc/interrupt_stats > interrupt_xxx.txt

proc文件提供設置Load和讀取標的結果的接口。


//===================================================

#include


extern unsigned int interrupt_statiscs[1024][2];

extern unsigned int interrupt_period_count;


extern void interrupt_set_period(unsigned int cycles);


static int interrupts_proc_show(struct seq_file *m, void *v)

{

    int i;


    for(i = 0; i < sizeof(interrupt_statiscs)/sizeof(interrupt_statiscs[0]); i++)

        seq_printf(m, "%u, %u, %un", interrupt_period_count, interrupt_statiscs[i][0], interrupt_statiscs[i][1]);


    return 0;

}


static ssize_t interrupts_proc_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos)

{

    unsigned int period_cycles;

    char buf[1];



    if (copy_from_user(buf, user_buf, 1))

        return -EFAULT;

    sscanf(buf, "%u", &period_cycles);

    printk("%s period_cycles %un", __func__, period_cycles);


    if (period_cycles > 0 && period_cycles < 5)

    {

        switch(period_cycles)

        {

            case 0:

                period_cycles = 2600000;

                break;

            case 1:

                period_cycles = 260000;

                break;

            case 2:

                period_cycles = 26000;

                break;

            case 3:

                period_cycles = 2600;

                break;

            case 4:

                period_cycles = 1300;

                break;

            default:

                period_cycles = 260000;

        }


        interrupt_set_period(period_cycles);

        printk("%s set interrupt period to %un", __func__, period_cycles);

    }

    return 1;

}


static int interrupts_proc_open(struct inode *inode, struct file *file)

{

    return single_open(file, interrupts_proc_show, NULL);

}


static const struct file_operations interrupt_stats_proc_fops = {

    .open        = interrupts_proc_open,

    .write        = interrupts_proc_write,

    .read        = seq_read,

    .llseek        = seq_lseek,

    .release    = single_release,

};


//===================================================


static int __init proc_uptime_init(void)

{

    proc_create("uptime", 0, NULL, &uptime_proc_fops);

    

    proc_create("interrupt_stats", 0, NULL, &interrupt_stats_proc_fops);

    return 0;

}

module_init(proc_uptime_init);


3.4 分析結果

當前使用測試Timer是26MHz,輔助衡量Load準確行的是32768時鐘計數。


26MHz的時鐘,一個Cycle=38.46納秒,這個精度已經很高了。用于衡量中斷性能應該夠用。


1. 將測試結果從設備中導出。第1列是當前Load數,第2列是標的耗時,第3列是輔助時鐘計數。第1、2列是26MHz時鐘,第3列是32K時鐘。


將這些結果按照Load不同存儲到interrupts_1300.txt/...文件中。


2600000, 321, 3277

2600000, 334, 3277

2600000, 315, 3277

2600000, 321, 3277

2600000, 324, 3277

2600000, 335, 3276

2600000, 355, 3277

2600000, 341, 3277

2600000, 345, 3277

2600000, 346, 3277

...


2. 編寫分析腳本


import pandas as pd

import numpy as np

import os

import re

import matplotlib.pyplot as plt

import matplotlib

matplotlib.style.use('ggplot')



cnames = ['index', 'count', 'duration']


output = []

output_cycles = []


timer_freq = 26000000

p = re.compile('^interrupts_([0-9]*).txt$')


filenames = os.listdir('.')

for file in filenames:

    if p.match(file):

        data = []

        interrupt_data = []

        interrupt_stats = []


        duration_data = []


        interrupt_stats = pd.read_csv(file, names = cnames)--------------------讀取數據源

        

        #Show the plotting of interrupts time consumption

        ts = pd.Series(interrupt_stats['count'], index=range(len(interrupt_stats['count'])))

        ts.plot(title='%s'%file)

        fig = plt.gcf()

        fig.set_size_inches(25, 4)

        plt.ylabel('Cycles from trigger to ISR.')

        plt.show()

        

        #Convert to time consumption

        for i in interrupt_stats['count'].tolist():

            data.append(float(i)*1000000/timer_freq)------------------------轉換成時間單位us


        #Calc the timer duration

        for i in interrupt_stats['duration'].tolist():

            duration_data.append(i)


        #Statistics of interrupts

        interrupt_data = np.array(data)

        output.append([interrupt_data.mean(), interrupt_data.max(), interrupt_data.min(), interrupt_data.std()])----每個case的統計信息

        output_cycles.append([interrupt_stats['count'].mean(),

                              interrupt_stats['count'].max(),

                              interrupt_stats['count'].min(),

                              interrupt_stats['count'].std()])------------------------------------------------------cycles形式的統計信息

        

df = pd.DataFrame(output, columns=['mean(us)','max(us)','min(us)', 'std(us)'], index=['1300', '2600', '26000', '260000', '2600000'])

df.to_csv('interrupt.csv')

pd.pivot_table(df, index='mean(us)')----------pivot table形式展示統計信息


  f2 = pd.DataFrame(output_cycles, columns=['mean(us)','max(us)','min(us)', 'std(us)'], index=['1300', '2600', '26000', '260000', '2600000'])

  pd.pivot_table(df2, index='mean(us)')--------pivot table形式展示統計信息



3. 結果分析


3.1 耗時圖表分析


從下面5張圖中可以看出標的耗時分布情況,總體來講數據比較穩定。


26000/260000/2600000會有個別特別長的延時;

所有case的最低值比較接近在90-120左右個Cycles;

隨著Load增加,平均耗時呈遞增趨勢;

對26000/260000/2600000修改了ylim到500,可以看出細節部分。

 

 

 

 

 

 

 3.2 耗時統計信息

下面是每個case的平均值、最大值、最小值、均方差的統計信息。

4.中斷性能優化

中斷性能優化可以分為兩個階段:中斷公用部分和每個中斷例程包括下半部。


4.1 中斷共用部分

中斷共用部分包括:架構相關代碼、中斷控制器驅動等。


提高cache命中率?

將相關處理代碼放入cache中?

中斷和CPU綁定?

級聯對中斷性能的影響?

......

 

4.2 每中斷例程及下半部

每中斷例程及下半部:首先針對中斷例程,盡量短小快速、不睡眠;對下半部,采取合適的方法softirq/tasklet/workqueue。


中斷例程的優化,可以通過Tracepoint中中斷相關trace進行統計。


/sys/kernel/debug/tracing/events/irq/irq_handler_entry

/sys/kernel/debug/tracing/events/irq/irq_handler_exit

/sys/kernel/debug/tracing/events/irq/softirq_entry

/sys/kernel/debug/tracing/events/irq/softirq_exit

/sys/kernel/debug/tracing/events/irq/softirq_raise

 下面是一個中斷例程執行耗時統計信息。


平均值大說明例程需要優化,因為在中斷例程執行期間是屏蔽中斷的,屏蔽時間太長容易丟中斷。


如果均方差大,說明中斷例程內流程差異較大,可能存在隱患。


+------------------------+-------+--------+-------+-------+--------+------------------+

|          name          |  mean |  max   |  min  | count |  sum   |       std        |

+------------------------+-------+--------+-------+-------+--------+------------------+

|      dwc_otg_pcd       | 0.457 | 32.196 |  0.0  |  104  | 47.516 |  3.26191450776   |

|        xxxxxxx         | 0.004 | 0.031  |  0.0  |  675  | 2.903  | 0.0106282606939  |

[1] [2]
關鍵字:ARM-Linux  中斷系統  子系統 引用地址:ARM-Linux中斷系統

上一篇:Ubuntu 安裝arm-linux-gcc編譯器
下一篇:s5pv210中斷體系

推薦閱讀

據彭博報道,知情人士透露,英特爾有意出售自己AR部門的多數股權。該部門一直在開發智能眼鏡,它可以通過藍牙與手機配對。該公司計劃在今年向消費者提供智能眼鏡。目前,英特爾為該業務尋找投資者,英特爾對該部門業務的估值在3.5億美元。知情人士說,這副眼鏡將能夠將北京信息顯示在佩戴者的視野中,利用激光投影儀將圖像投影到用戶視網膜上。臺灣廣達電...
超級電容器  超級電容器,是一種新型的具有遠超傳統電容器電容,以及超高儲能密度的電容器。通過在兩個隔離的極板上儲存相反電荷,超級電容器可以儲存大量的能量。與傳統電容器不同,超級電容器不再使用固態電介質,而是使用靜電雙電層電容和電化學贗電容。靜電雙層電容使用碳材料電極達到傳導電極和電解液的亥姆霍茲雙層界面上的電荷分離,這種電荷分離...
一、什么是I2C通信協議?1、物理接口:SCL + SDA(1)SCL(serial clock):時鐘線,傳輸CLK信號,一般是I2C主設備向從設備提供時鐘的通道。(2)SDA(serial data): 數據線,通信數據都通過SDA線傳輸 2、通信特征:串行、同步、非差分、低速率、半雙工(1)I2C屬于串行通信,所有的數據以位為單位在SDA線上串行傳輸。(2)同步通信就是通信雙方工作在同一個時鐘...
1、測量極性及管型判斷紅筆接S、黑筆接D值為(300-800)為N溝道紅筆接D、黑筆接S值為(300-800)為p溝道如果先沒G、D再沒S、D會長響,表筆放在G和最短腳相連放電,如果再長響為擊穿貼片場管與三極管難以區分,先按三極管沒,如果不是按場管測場管測量時,最好取下來測,在主板上測量會不準2、好壞判斷測D、S兩腳值為(300-800)為正常,如果顯示“0”且長響,場...

史海拾趣

問答坊 | AI 解惑

美國國家半導體推出兩款全球最小巧的音頻放大器,進一步加強這系列芯片的產品陣容

美國國家半導體推出兩款全球最小巧的音頻放大器,進一步加強這系列芯片的產品陣容 新推出的 Boomer AB 類 (Class AB) 單聲道放大器及立體聲耳機放大器屬于迷你型芯片,最適用于外型小巧纖薄的便攜式電子產品 2006-08-18   美國國家半 ...…

查看全部問答∨

數字電視改造工程

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 編輯 承接電視改造工程,輕松實現50個機頂盒共享500臺以上的電視機,詳情請登入: …

查看全部問答∨

nand flash啟動問題

我用ads1.2編譯arm9 2410的boot_loader(NAND FLASH 啟動)時,將其ro_base設置為0x33f00000,這就意味著代碼段的起始地址從0x33f00000開始。若將生成的bin文件download到nand中,arm啟動時,應該執行0x0地址對應的代碼,這時sdram寄存器都還沒有設 ...…

查看全部問答∨

fast gpio口能響應外部中斷嗎

用的片子是LPC2478,PROT0能響應外部中斷,問題是吧port0配置成fast gpio口后還能響應外部中斷嗎 ps.感覺eeworld里也沒有多少高手啊,問了幾個問題都沒有人回答…

查看全部問答∨

wince中串口中斷的問題

請高手解釋如何在evc編程時,采用中斷的方式監控串口?…

查看全部問答∨

新手求wince的網絡安全方面的程序,文章,資料之類的,謝謝各位高手

rt,本人最近由于要接觸一些wince嵌入式系統的網絡安全方面的研究,但以前沒怎么接觸過這方面,希望各位有經驗的高手能提供一些關于在wince下面開發網絡安全程序的資料,文章,程序源碼,或者網站也可以,我想做一個有基本功能的網絡安全的防火墻, ...…

查看全部問答∨

硬件問題

一臺電腦,開機到登陸界面,只要按鍵盤,鍵盤和鼠標就被鎖住,隨怎么按鍵和移動鼠標也不動了。而如果不按鍵盤拿鼠標的就可以。請各位大俠幫忙。。?!?

查看全部問答∨

CAN總線通訊問題

    小弟最近在看CAN總線方面的資料。有些許疑惑,請各位指點一下。在CAN2.0標準數據幀沖裁區里面的BASIC ID 規定為 11bits,然后是 1 bit的RTR, 而控制場為 6bits的 包括4位數據長度和2位保留位。這里很糊涂了,這兩部分在傳輸的時候是 ...…

查看全部問答∨

調試USB驅動時致使PC直接關機,可能的原因是什么呢?

我使用的CPU是S3C2442,USB電源是self-power模式,PC的電源線沒有引到板子上。…

查看全部問答∨

請問單片機如何實現中文輸入法?

請問要做個遙控器,讓他有類似手機寫短信息的功能要怎么做?…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 江城| 青神县| 金塔县| 大余县| 旬阳县| 襄垣县| 四会市| 清涧县| 黄陵县| 琼中| 浮山县| 黑山县| 芜湖县| 鹤岗市| 武夷山市| 商城县| 沐川县| 长垣县| 潜山县| 抚宁县| 乌苏市| 巴青县| 武穴市| 温州市| 台北县| 夹江县| 平度市| 安新县| 开江县| 东丰县| 抚顺市| 自贡市| 漳平市| 滦平县| 九龙坡区| 阜阳市| 吉木萨尔县| 义乌市| 天祝| 安多县| 乐都县|