主頁 > 作業系統 > 痞子衡嵌入式:以i.MXRT1xxx的GPIO模塊為例談談中斷處理函式(IRQHandler)的標準流程

痞子衡嵌入式:以i.MXRT1xxx的GPIO模塊為例談談中斷處理函式(IRQHandler)的標準流程

2021-07-04 06:03:34 作業系統


  大家好,我是痞子衡,是正經搞技術的痞子,今天痞子衡給大家介紹的是以i.MXRT的GPIO模塊為例談談中斷處理函式(IRQHandler)的標準流程

  在痞子衡舊文 《串口(UART)自動波特率識別程式設計與實作(中斷)》里,我們利用了 GPIO 模塊內部集成的 I/O 邊沿檢測功能完成了 RXD 信號下降沿的捕捉,這里涉及到了 GPIO 中斷處理函式,中斷處理函式 IRQHandler 是嵌入式里非常特殊的一類函式,它們是嵌入式系統能夠實時完成任務的關鍵所在,任何一個中斷處理函式都需要被謹慎對待,

  上面那篇舊文里,痞子衡寫的 GPIO 中斷處理函式其實是有一點瑕疵的,雖然不影響最終波特率識別功能,但其并不是標準流程寫法,今天痞子衡就和大家聊一聊什么是中斷處理函式的標準流程:

一、GPIO模塊中斷簡介

  GPIO 基本上可以說是 MCU 里最入門級的外設了,我們先來簡單看一下 i.MXRT1011 里 GPIO 模塊功能,

1.1 GPIO 一般設計

  i.MXRT 里每組 GPIO 最大包含 32 個 Pin,正好對應 32bit 暫存器,下面是 GPIO 三大基礎暫存器:

GDIR[31:0] - 配置 Pin 的輸入/輸出方向(僅當 IOMUXC 里配置為 GPIO 模式)
DR[31:0]   - 設定 Pin 輸出電平
PSR[31:0]  - 保存 Pin 輸入電平(以 ipg_clk_s 時鐘來采樣)

  操作上述 GPIO 外設暫存器的前提條件是在 IOMUXC 模塊里已將 Pin 功能模式配為 GPIO (因為每個 Pin 可能被多種外設UART/Timer等復用),比如文章開頭提及的那篇舊文里我們用于波特率檢測的 GPIO_09 引腳,它有如下八種復用功能,其中 Alt5 功能是 GPIO,

  將 GPIO_09 引腳設為 GPIO 功能模式后,還需要根據應用場景進一步配置其 Pad 屬性,下圖是 Pad 內部電路結構,我們可以配置的屬性有很多,比如驅動強度、速度等級、上下拉等,這些也是在 IOMUXC 模塊里完成的,

  在串口波特率識別檢測場景里,我們需要在 IOMUXC 模塊里將 GPIO_09 引腳配置為 GPIO 模式,并且相應配置 Pad 屬性(主要是使能內部上拉,因為串口信號 Idle 狀態是高電平),示例代碼如下:

#include "fsl_iomuxc.h"

void io_pin_config(void)
{
    CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03U */

    IOMUXC_SetPinMux(
        IOMUXC_GPIO_09_GPIOMUX_IO09,            /* GPIO_09 is configured as GPIOMUX_IO09 */
        0U);                                    /* Software Input On Field: Input Path is determined by functionality */

    IOMUXC_SetPinConfig(
        IOMUXC_GPIO_09_GPIOMUX_IO09,            /* GPIO_09 PAD functional properties : */
        0x01B0A0U);                             /* Slew Rate Field: Slow Slew Rate
                                                    Drive Strength Field: R0/4
                                                    Speed Field: fast(150MHz)
                                                    Open Drain Enable Field: Open Drain Disabled
                                                    Pull / Keep Enable Field: Pull/Keeper Enabled
                                                    Pull / Keep Select Field: Pull
                                                    Pull Up / Down Config. Field: 100K Ohm Pull Up
                                                    Hyst. Enable Field: Hysteresis Enabled */
}

1.2 GPIO 中斷設計

  如果僅僅是控制 I/O 輸入輸出電平,那 GPIO 外設功能也太簡陋了,為了讓 GPIO 外設具備更大的應用價值,IC 設計者往往會為其加入邊沿檢測功能,如下圖藍框標出的暫存器(這些暫存器僅在 Pin 方向被配置為輸入時有效):

EDGE_SEL[31:0] - 配置是否使能 Pin 雙邊沿檢測
ICRx[31:0]     - 配置 Pin 低電平/高電平/上升沿/下降沿四種檢測模式(僅當 EDGE_SEL 里沒使能雙邊沿)

IMR[31:0]      - 配置是否使能 Pin 中斷
ISR[31:0]      - 記錄 Pin 中斷狀態

  邊沿檢測功能會涉及中斷回應,在 i.MXRT 里為了節省中斷號資源,將 16 個 Pin 編為一組,這 16 個 Pin 共享一個中斷號,i.MXRT1011 里一共 37 個 GPIO(即GPIO1[31:0]、GPIO2[13:0]、GPIO5[0]),所以你在 MIMXRT1011.h 頭檔案里會看到如下中斷號定義:

typedef enum IRQn {
  /* Core interrupts */
  // ...省略

  /* Device specific interrupts */
  GPIO1_Combined_0_15_IRQn     = 70,
  GPIO1_Combined_16_31_IRQn    = 71,
  GPIO2_Combined_0_15_IRQn     = 72,  // 沒用滿
  GPIO5_Combined_0_15_IRQn     = 73,  // 沒用滿

  // ...省略

} IRQn_Type;

  在串口波特率識別檢測場景里,我們需要在 GPIO 模塊里將 GPIO_09 引腳配置為輸入模式,且開啟下降沿捕獲中斷,示例代碼如下:

#include "fsl_gpio.h"

void io_func_config(void)
{
    // I/O 配置為輸入,下降沿捕獲模式
    gpio_pin_config_t sw_config = {
        kGPIO_DigitalInput,
        0,
        kGPIO_IntFallingEdge,
    };

    // 初始化 GPIO1[9] 管腳
    GPIO_PinInit(GPIO1, 9, &sw_config);

    // 使能 GPIO1[9] 管腳中斷
    GPIO_PortEnableInterrupts(GPIO1, 1U << 9);

    // 配置使能系統 GPIO1 中斷
    NVIC_SetPriority(GPIO1_Combined_0_15_IRQn, 1);
    NVIC_EnableIRQ(GPIO1_Combined_0_15_IRQn);
}

二、中斷處理函式(IRQHandler)的標準流程

  上一節鋪墊那么多,現在終于到了核心的中斷處理函式了,我們在文章開頭提及的那篇舊文關于串口波特率識別場景里繼續聊(上位機設定發送波特率為115200),

2.1 有問題的中斷處理函式

2.1.1 無效中斷執行

  如下代碼即是我們之前的中斷處理函式寫法,串口波特率識別接頭暗號是 0x5A、0XA6,從信號時序上看一共有 7 個下降沿,原理上這個中斷處理函式應該被觸發執行 7 次(也是 s_pin_irq_func 執行次數),我們額外加個輔助除錯變數 s_irqCount,按理說識別結束后這個變數值應該等于 7,但實際上它的值是 12,即多進了 5 次中斷,這顯然不太合理,不過合理的是 s_pin_irq_func 確實只執行了 7 次,

// 輔助除錯變數1
uint32_t s_irqCount = 0;

void GPIO1_Combined_0_15_IRQHandler(void)
{
    // ****輔助除錯1:記錄中斷處理函式觸發執行次數
    s_irqCount++;
    // ****輔助除錯2:翻轉 GPIO1[10]
    GPIO1->DR_TOGGLE = 1U << 10;

    uint32_t interrupt_flag = (1U << 9);
    // 僅當GPIO1[9]中斷發生時
    if ((GPIO_GetPinsInterruptFlags(GPIO1) & interrupt_flag) && s_pin_irq_func)
    {
        // 執行一次回呼函式
        s_pin_irq_func();
        // 清除GPIO1[9]中斷標志
        GPIO_ClearPinsInterruptFlags(GPIO1, interrupt_flag);
    }
}

  為了進一步定位問題,我們用另一個 GPIO1[10] 來輔助,將其配置為 GPIO 輸出模式,初值為高,在中斷處理函式里做一次翻轉,然后用示波器同時抓取 GPIO1[10:9],波形如下,可以看到中間的每個下降沿均連續觸發了兩次中斷處理函式的執行:

  這個問題其實跟 ARM Errata 838869 有關,在Cortex-M4/7 上,如果 CPU 執行速度(此處 i.MXRT1011 作業在 500MHz 主頻下)遠遠高于 GPIO 外設暫存器寫入速度(1/4 主頻),中斷處理函式代碼里在退出前才清中斷標志位 ISR[9] 的話,會導致中斷標志位還沒有真正被清除掉,CPU 立即又再次執行中斷處理函式(只要 ISR 暫存器里標志位仍處于置位狀態),至于功能回呼函式 s_pin_irq_func 沒有被誤執行,是因為中斷處理函式里有中斷狀態位置起判斷陳述句,恰好執行到這里的時候,狀態位 ISR[9] 已經被清除了(但這樣并不可靠),

2.1.2 漏掉有效中斷

  這個中斷處理函式還有其他問題嗎?其實還有,我們知道中斷處理函式的一般原則是快進快出,即在函式里不要執行過多的代碼,導致執行時間過長,影響在此期間發生的同類中斷被回應,為了便于定位問題,我們給第一次下降沿中斷(時間起點)回應執行里增加額外 40us 的延時,故意讓其錯過第二次下降沿中斷(3bit * (1s/115200bit) = 26.04us)但不要錯過第三次下降沿中斷(6bit * (1s/115200bit) = 52.08us),

// 輔助除錯變數1
uint32_t s_irqCount = 0;
// 輔助除錯變數2
uint32_t s_irqDelay = 40;

void GPIO1_Combined_0_15_IRQHandler(void)
{
    // 輔助除錯1:記錄中斷處理函式觸發執行次數
    s_irqCount++;
    // 輔助除錯2:翻轉 GPIO1[10]
    GPIO1->DR_TOGGLE = 1U << 10;

    uint32_t interrupt_flag = (1U << 9);
    // 僅當GPIO1[9]中斷發生時
    if ((GPIO_GetPinsInterruptFlags(GPIO1) & interrupt_flag) && s_pin_irq_func)
    {
        // 執行一次回呼函式
        s_pin_irq_func();

        // ****輔助除錯3:增加一次 40us 的延時
        if (s_irqDelay)
        {
            microseconds_delay(s_irqDelay);
            s_irqDelay = 0;
        }
        // 清除GPIO1[9]中斷標志
        GPIO_ClearPinsInterruptFlags(GPIO1, interrupt_flag);
    }
}

  上述代碼測驗波形圖如下,這種情況下波特率識別功能已經不正常,s_irqCount 值為 11,更關鍵的是 s_pin_irq_func 僅被執行了 6 次,漏掉了 1 次,因為這 40us 的延時,導致第二次下降沿中斷沒有被及時回應,可以理解為第一次中斷處理函式執行退出前清除中斷標志位操作一次性清除了兩次中斷狀態位的置起行為,

2.2 解決中斷處理函式里的問題

2.2.1 避免無效中斷執行

  基于 2.1.1 節最后的分析,我們改進代碼如下:

void GPIO1_Combined_0_15_IRQHandler(void)
{
    // 輔助除錯2:翻轉 GPIO1[10]
    GPIO1->DR_TOGGLE = 1U << 10;

    uint32_t interrupt_flag = (1U << 9);
    if ((GPIO_GetPinsInterruptFlags(GPIO1) & interrupt_flag) && s_pin_irq_func)
    {
        s_pin_irq_func();
        GPIO_ClearPinsInterruptFlags(GPIO1, interrupt_flag);
        // ****改進1:中斷標志清除之后加 DSB 操作或者 poll 狀態暫存器 ISR 確保標志位已被清除
        __DSB();
    }
}

  中斷處理函式代碼改進之后再次用示波器抓取波形,測驗結果就正常了:

2.2.2 避免漏掉有效中斷

  基于 2.1.2 節最后的分析,我們改進代碼如下:

void GPIO1_Combined_0_15_IRQHandler(void)
{
    // 輔助除錯2:翻轉 GPIO1[10]
    GPIO1->DR_TOGGLE = 1U << 10;

    uint32_t interrupt_flag = (1U << 9);
    if ((GPIO_GetPinsInterruptFlags(GPIO1) & interrupt_flag) && s_pin_irq_func)
    {
        // ****改進2:先清除中斷標志,再執行回呼函式
        GPIO_ClearPinsInterruptFlags(GPIO1, interrupt_flag);
        // 改進1:中斷標志清除之后加 DSB 操作或者回讀狀態暫存器 ISR 確保標志位已被清除
        __DSB();
        s_pin_irq_func();

        // 輔助除錯3:增加一次 40us 的延時
        if (s_irqDelay)
        {
            microseconds_delay(s_irqDelay);
            s_irqDelay = 0;
        }
    }
}

  中斷處理函式代碼改進之后再次用示波器抓取波形,測驗結果來看至少沒有漏掉第二次下降沿中斷,當然實時性還是沒能保證(如果要嚴格記錄第二次中斷發生的時刻,顯然無法做到),不過對于本文討論的串口波特率識別應用場景來說倒并不影響功能,但這種解決方法并不是萬能的,如果第一次中斷處理函式執行期間發生兩次及以上同類中斷,那還是會存在漏掉有效中斷的情況,

2.3 標準的中斷處理函式流程

  結合上面的問題展示與分析解決,現在我們來認真探討下什么是中斷處理函式 IRQHandler 的標準流程,痞子衡認為主要分為如下四步:第一步是對中斷狀態位的置起做一次確認(可選項,有些外設不一定有狀態位),第二步是立即清除狀態標志,第三步是確保狀態標志已被清除,第四步才是執行真正的中斷處理任務(這個任務執行時間要越短越好,最好就是僅記錄必要的資訊,等中斷退出后進入主回圈時再具體展開任務),故中斷處理函式標準模板如下:

void xxx_IRQHandler(void)
{
    // Step 1: 檢查狀態標志位是否有效
    if ((xxx_IsInterruptFlagSet() && s_irq_func)
    {
        // Step 2: 清除狀態標志位
        xxx_ClearInterruptFlag();
        // Step 3: 確保狀態標志位已被清除
        __DSB();
        // Step 4: 執行回呼函式,時間越短越好
        s_irq_func();
    }
}

三、番外篇 - 神奇的GPIO1[7:0]

  最后再提一下,在部分 i.MXRT 型號上,關于中斷號資源,GPIO1[7:0] 地位與其他 GPIO 引腳不太一樣,它們還會有專門的中斷號,比如在 MIMXRT1062.h 頭檔案里你可以看到 GPIO1_INTx_IRQn:

typedef enum IRQn {
  /* Core interrupts */
  // ...省略

  /* Device specific interrupts */
  GPIO1_INT0_IRQn              = 72,               /**< Active HIGH Interrupt from INT0 from GPIO */
  GPIO1_INT1_IRQn              = 73,               /**< Active HIGH Interrupt from INT1 from GPIO */
  GPIO1_INT2_IRQn              = 74,               /**< Active HIGH Interrupt from INT2 from GPIO */
  GPIO1_INT3_IRQn              = 75,               /**< Active HIGH Interrupt from INT3 from GPIO */
  GPIO1_INT4_IRQn              = 76,               /**< Active HIGH Interrupt from INT4 from GPIO */
  GPIO1_INT5_IRQn              = 77,               /**< Active HIGH Interrupt from INT5 from GPIO */
  GPIO1_INT6_IRQn              = 78,               /**< Active HIGH Interrupt from INT6 from GPIO */
  GPIO1_INT7_IRQn              = 79,               /**< Active HIGH Interrupt from INT7 from GPIO */
  GPIO1_Combined_0_15_IRQn     = 80,               /**< Combined interrupt indication for GPIO1 signal 0 throughout 15 */
  GPIO1_Combined_16_31_IRQn    = 81,               /**< Combined interrupt indication for GPIO1 signal 16 throughout 31 */
  GPIO2_Combined_0_15_IRQn     = 82,               /**< Combined interrupt indication for GPIO2 signal 0 throughout 15 */
  GPIO2_Combined_16_31_IRQn    = 83,               /**< Combined interrupt indication for GPIO2 signal 16 throughout 31 */
  GPIO3_Combined_0_15_IRQn     = 84,               /**< Combined interrupt indication for GPIO3 signal 0 throughout 15 */
  GPIO3_Combined_16_31_IRQn    = 85,               /**< Combined interrupt indication for GPIO3 signal 16 throughout 31 */
  GPIO4_Combined_0_15_IRQn     = 86,               /**< Combined interrupt indication for GPIO4 signal 0 throughout 15 */
  GPIO4_Combined_16_31_IRQn    = 87,               /**< Combined interrupt indication for GPIO4 signal 16 throughout 31 */
  GPIO5_Combined_0_15_IRQn     = 88,               /**< Combined interrupt indication for GPIO5 signal 0 throughout 15 */
  GPIO5_Combined_16_31_IRQn    = 89,               /**< Combined interrupt indication for GPIO5 signal 16 throughout 31 */

  // ...省略

} IRQn_Type;

  至此,以i.MXRT的GPIO模塊為例談談中斷處理函式(IRQHandler)的標準流程痞子衡便介紹完畢了,掌聲在哪里~~~

歡迎訂閱

文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上,

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/288888.html

標籤:其他

上一篇:痞子衡嵌入式:以i.MXRT1xxx的GPIO模塊為例談談中斷處理函式(IRQHandler)的標準流程

下一篇:通過busybox制作根檔案系統詳細程序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more