TinyThread原始碼分析之中斷

2022-08-13 13:15:15 字數 1725 閱讀 7968

tinythread 是基於cortex-m0的小型的os.

知識儲備:

ipsr(中斷程式狀態暫存器),ipsr包含了當前正在執行的中斷服務程式編號,用於識別當前中斷。

cortex-m0處理器內建中斷控制器,並且支援最多32個中斷請求(irq)和乙個不可遮蔽中斷(nmi).

primask置位(寫1),開啟遮蔽,遮蔽除了nmi和硬體錯誤(hardfault)外的所有中斷。清除此位,關閉遮蔽。

tinythread中斷控制涉及到的檔案主要有:tt_sys.h、tt_sys.c

tinythread中斷控制函式api主要有以下兩個,它們分別是開啟ipsr和關閉ipsr暫存器(中斷遮蔽特殊暫存器).

tt_sys.c

1 #include "

../inc/tt_thread.h"2

3volatile

int g_iirq_disable_count = 0;4

volatile

bool g_birq_real_disable = 0;

tt_sys.h

#ifndef inc_tt_sys_h__

#define inc_tt_sys_h__#ifdef __cplusplus

extern"c

"

#

else

tt_inline

bool tt_is_in_irq (void

)#endif

#elif defined __gnuc____attribute__((always_inline )) tt_inline

bool tt_is_in_irq (void

)#elif defined __iccarm__# pragma diag_suppress=pe940

tt_inline

bool tt_is_in_irq (void

)#endif

tt_inline

bool tt_is_irq_disabled (void) //

檢視 中斷遮蔽特殊暫存器的值 中斷被遮蔽返回true,中斷可用返回false

tt_inline

void tt_enable_irq (void

) g_iirq_disable_count--;

if (g_iirq_disable_count == 0

)

}}tt_inline

void tt_disable_irq (void

)

else

g_iirq_disable_count++;

}

在 void tt_enable_irq (void) 函式中,我們可以知道,在沒有先disable irq的情況下,不允許執行此函式. 如果連續執行此函式,報錯。

在 void tt_disable_irq (void) 函式中,我們可以知道,雖然可以連續執行tt_disable_irq函式,但是當連續執行此函式後, g_birq_real_disable 的值為 false, 那麼當enable irq時是沒有其作用的。

所以使用這對函式,一定要成對出現,而且要先disable,然後enable.

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...