<noframes id="fbbb7">

<sub id="fbbb7"></sub>

<track id="fbbb7"></track><address id="fbbb7"></address>

      <track id="fbbb7"></track>
      <cite id="fbbb7"><th id="fbbb7"><ol id="fbbb7"></ol></th></cite>
        創作

        完善資料讓更多小伙伴認識你,還能領取20積分哦, 立即完善>

        3天內不再提示

        RT-Thread記錄(五、RT-Thread 臨界區保護)

        矜辰所致 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-20 16:06 ? 次閱讀

        前言

        為什么要聊臨界區?

        因為在 RT-Thread 中臨界區關系到線程的順序執行,也就是線程同步的問題。

        在使用RTOS的時候,多個運行的線程往往都需要訪問臨界資源,比如一些全局變量,那么如果不進行一定的保護措施,程序運行就可能出現意想不到的結果。

        RT-Thread 提供了多種途徑來保護臨界區,本文主要說明的是:關閉系統調度和禁止中斷的方式 。

        本 RT-Thread 專欄記錄的開發環境:
        RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發環境 及 配合CubeMX開發快速上手)
        RT-Thread記錄(二、RT-Thread內核啟動流程 — 啟動文件和源碼分析
        RT-Thread 內核篇系列博文鏈接:
        RT-Thread記錄(三、RT-Thread 線程操作函數及線程管理與FreeRTOS的比較)
        RT-Thread記錄(四、RT-Thread 時鐘節拍和軟件定時器

        一、臨界區

        經常會聽到臨界區,臨界資源之類的名詞,那么什么叫臨界區,臨界資源?

        1.1 什么是臨界區

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        簡單的概括就是圖中兩句話:

        • 臨界資源
          一次僅允許一個進程使用的共享資源
        • 臨界區
          每個進程中訪問臨界資源的那段代碼稱為 臨界區

        1.2 RTOS中的臨界區

        對于我們的多任務的RTOS而言,除了外部中斷,自身的多線程和系統調度機制,多個線程可能會對共享資源進行訪問,為了保證數據的可靠性和完整性,那么就需要對臨界區進行保護,共享資源要互斥的訪問(比如全局變量)。

        首先是最基礎的示例,外部中斷!這個不僅在RTOS存在,前后臺系統也存在:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        上面的例子中,如果在線程函數中,加入臨界區保護,使得線程對臨界資源 a 的操作沒有結束以前不響應中斷,就不會發生問題。

        再來看一個線程間對臨界資源訪問的例子:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        在上圖的示例中 (可能delay(1)和時鐘節拍一樣可能有點問題,可能需要多一點延時,這里意思到了就行,不糾結了= =?。?,我已經分析了如果沒有臨界區保護會出現的問題(有問題請指出),實際程序結果可能不會是程序本來想要的結果,這種錯誤是需要避免的!

        本小結以下內容包括后面臨界區的保護源碼分析是擴展說明,懂與不懂不影響學會使用 RT-Thread 臨界區保護,因為涉及的 RTOS的調度原理,PendSV異常等知識,需要一定的基礎,這里建議想學習RTOS的小伙伴務必好好看看《Cortex-M3與Cortex-M4權威指南》這個文檔。

        理解上面示例關系到RTOS的調度原理,上面解釋中用到的中斷打斷線程后現場保存,現場恢復,線程調度。得對RTOS的調度原理有一定的理解,在RTOS中除了外部中斷會打斷線程的執行,還有Systick中斷和一個重要的 PendSV 異常。

        PendSV 也稱為可懸起的系統調用,它是一種異常,可以像普通的中斷一樣被掛起,它是專門用來輔助操作系統進行上下文切換的。PendSV 異常會被初始化為最低優先級的異常。每次需要進行上下文切換的時候,會手動觸發 PendSV 異常,在 PendSV 異常處理函數中進行上下文切換。

        詳細理解請參考我另一篇博文:
        FreeRTOS記錄(三、RTOS任務調度原理解析_Systick、PendSV、SVC)

        這里用文中截圖稍微解釋一下:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        總之,對于RTOS而言,在訪問臨界資源的時候,需要特別注意,做好臨界區的保護。

        為了避免出現上面我們所說的問題,RTOS對臨界區采取了一些對應的保護方法,一般來說有:
        關閉系統調度,關中斷,利用信號量,互斥量。

        RT-Thread 信號量,互斥量我們會在下篇博文來說明,本文主要來了解下關閉中斷和系統調度的操作。

        二、RT-Thread臨界區保護

        2.1 禁止調度

        RT-Thread 調度器上鎖 和 調度器解鎖的函數如下:

        void rt_enter_critical(void);//調度器上鎖,進入調度臨界區,不再切換線程
        void rt_exit_critical(void);//調度器解鎖,退出調度臨界區

        注意,調度鎖不會阻止系統的響應中斷,只不過是中斷處理完成退出后,繼續執行被鎖住的線程。如果中斷中有訪問臨界資源的情況,此方式不適用??!

        調度器上鎖和調度器解鎖函數,是成對使用的,切記!

        使用示例:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_16,color_FFFFFF,t_70,g_se,x_16

        禁止調度源碼簡析

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        但是上面的函數只對rt_scheduler_lock_nest變量進行了自增,并沒有別的操作,那么這個變量是如何影響調度器的呢?
        我們查到使用到變量rt_scheduler_lock_nest的地方,找到如下代碼:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        那么同樣的,在rt_exit_critical函數中,當然就是變量自減了:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_17,color_FFFFFF,t_70,g_se,x_16

        仔細看了這段代碼還能發現一個細節,就是這個關閉調度和打開調度是支持嵌套的! 調度器上鎖一次,就要解鎖一次,上鎖2次,就得解鎖2次。

        通過這個也告訴我們,有些時候多看看源碼,會比直接看說明對邏輯的理解更直觀!

        2.2 屏蔽中斷

        RTOS所有的線程調度都是建立在中斷基礎上的,關閉中斷,不僅可以屏蔽,外部中斷,也可以禁止調度,他比上面的禁止調度“更能夠保護”臨界區。

        RT-Thread 屏蔽中斷 和 使能中斷的函數如下:

        /*
        返回值:
        中斷狀態 	rt_hw_interrupt_disable 函數運行前的中斷狀態
        */
        rt_base_t rt_hw_interrupt_disable(void);//屏蔽中斷
        /*
        參數:
        level 	前一次 rt_hw_interrupt_disable 返回的中斷狀態
        */
        void rt_hw_interrupt_enable(rt_base_t level);//中斷使能

        注意,上面的終端所中斷鎖是最強大的和最高效的同步方法,這個方法最主要的問題在于,中斷響應延時會拉長,對于實時性特別極端的場合需要注意,所以實際使用要根據應用場合,合理的使用。

        中斷屏蔽和中斷使能函數也是是成對使用的,切記!

        使用示例:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_18,color_FFFFFF,t_70,g_se,x_16

        中斷鎖源碼簡析

        上面的函數找到申明,但是跳轉不到函數原型:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_13,color_FFFFFF,t_70,g_se,x_16

        那么函數的實現在什么地方呢?如下圖:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        因為使用的是 gcc 編譯器,所以context_gcc.S文件中的函數體前后語句會與 MDK下有一定的區別,但函數實現的匯編語言都是一樣的:

        /*
         * rt_base_t rt_hw_interrupt_disable();
         */
         /*
         .global關鍵字用來讓一個符號對鏈接器可見,可以供其他鏈接對象模塊使用
         前面兩句意思就類似于定義了一個全局可調用的函數rt_hw_interrupt_disable 
         */
            .global rt_hw_interrupt_disable //告訴編譯器rt_hw_interrupt_disable 是一個全局可見的
            .type rt_hw_interrupt_disable, %function//告訴編譯器rt_hw_interrupt_disable是一個函數
        rt_hw_interrupt_disable:
            MRS     R0, PRIMASK   //讀取PRIMASK寄存器的值到r0寄存器
            CPSID   I             //關閉全局中斷,具體原因見博文后續說明
            BX      LR       	//函數返回,通過LR 連接寄存器 返回
        
        /*
         * void rt_hw_interrupt_enable(rt_base_t level);
         */
            .global rt_hw_interrupt_enable   //與上面類似
            .type rt_hw_interrupt_enable, %function
        rt_hw_interrupt_enable:
            MSR     PRIMASK, R0  //將 r0 的值寄存器寫入到 PRIMASK 寄存器
            BX      LR   		//函數返回,通過LR 連接寄存器 返回

        即便上面的代碼我寫了注釋,告訴了意思,但是還是會有問題,為什么 CPSID I就是關閉全局中斷?

        如果好好看了《Cortex-M3與Cortex-M4權威指南》這個文檔,所有東西都能明白了。

        PRIMSK:中斷屏蔽特殊寄存器。利用 PRIMSK,可以禁止除HardFault 和 NMI外的所有異常。在上面推薦文檔中有說明:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        CPSID I就是禁止中斷,CPSIE I就是使能中斷。

        一個細節,為什么 rt_hw_interrupt_enable 函數,不用 CPSIE I恢復中斷?

        答案就是,如果使用CPSIE I使能中斷,那么中斷鎖就無法嵌套。使用R0寄存器將當前的PRIMASK的狀態保存起來,這樣子就必須要關多少次中斷就得開多少次中斷。

        poYBAGKwKpuAU3vuAABFVBO4L08300.png

        另外值得一說的是, 在上面的示例中R0寄存器中保存的值,就是 rt_base_t level這個變量!

        通過上述分析,我們應該完全明白了,RT-Thread 的中斷鎖是如何實現的,那么其他的RTOS是不是都是這個樣子呢? 我們來看看 FreeRTOS 對于中斷鎖是如何實現的。

        與FreeRTOS區別

        FreeRTOS的臨界區,在我的博文介紹過:FreeRTOS記錄(四、FreeRTOS任務堆棧溢出問題和臨界區)

        這里我們就只看一下他的實現代碼來和 RT-Thread 比較一下(同樣是以M3為例,M0與M3又是不同的):

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        這里我們分析就用在任務中屏蔽中斷的函數來分析,在中斷中屏蔽分析類似,只不過稍微復雜一點。

        屏蔽中斷:

        #define portDISABLE_INTERRUPTS()				vPortRaiseBASEPRI()
        /*----------------------------------------------*/
        /*只需要注意操作的寄存器為 basepri*/
        /*----------------------------------------------*/
        
        portFORCE_INLINE static void vPortRaiseBASEPRI( void )
        {
        uint32_t ulNewBASEPRI;
        
        	__asm volatile
        	(
        		"	mov %0, %1												\n" \
        		"	msr basepri, %0											\n" \  
        		"	isb														\n" \
        		"	dsb														\n" \
        		:"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
        	);
        }

        使能中斷:

        //...
        #define portENABLE_INTERRUPTS()					vPortSetBASEPRI(0)
        /*只需要注意操作的寄存器為 basepri*/
        portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
        {
        	__asm volatile
        	(
        		"	msr basepri, %0	" :: "r" ( ulNewMaskValue ) : "memory"
        	);
        }
        ————————————————
        版權聲明:本文為CSDN博主「矜辰所致」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
        原文鏈接:https://blog.csdn.net/weixin_42328389/article/details/123593592

        這里我們通過 FreeRTOS 中斷鎖的代碼可以看出,它操作的是basepri寄存器,而不是PRIMSK寄存器,那么basepri寄存器又是什么呢? 答案還是從《Cortex-M3與Cortex-M4權威指南》文檔中可以找到:

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

        FreeRTOS 在中斷鎖的操作上面,是利用 basepri 寄存器屏蔽特定優先級的中斷。 這個優先級的設置是用戶可以自行設置的。這給非常緊急的中斷留了一條后路。

        但是不管怎樣,在任何時候,臨界區處理的代碼當然是時間越短越好??!

        2.3 實際應用場合

        簡單總結一下,臨界區的保護實際應用中可能需要的場合:

        調用公共函數的代碼(不可重入函數)
        讀取或者修改變量(全局變量)
        使用硬件資源(在操作內存或者flash的時候)
        對時序有精準要求的操作(I2C通訊,但是得注意在通訊中不能使用利用了systick的延時函數,用干等的延時)
        某些用戶不想被打斷的代碼(比如 printf 打?。?/p>

        在一般的場合,普通臨界區的保護使用禁止調度的方式就可以滿足需求了,除非你中斷中有對臨界資源的訪問。
        當然事無絕對,有些時候中斷的發生對某些普通任務(比如ADC采樣)也可能產品影響,所以還是需要根據實際情況,合理的使用 臨界區保護。

        結語

        本文的內容從學會 RT-Thread 臨界區保護的使用來說是比較簡單,只需要掌握幾個函數的調用就可以。但對于了解實現原理來說相對復雜些,需要對內核,對操作系統基本原理有一定的理解。

        我們通過對這幾個函數源碼的簡單分析,讓我們對其原理的實現有了更直觀的理解,養成看源碼是對我們學習有幫助的一個好習慣!

        下一篇 RT-Thread 記錄,就要來學習 RT-Thread 的線程間同步相關的信號量,互斥量,這也是 RT-Thread 對臨界區的另一種保護方式。

        謝謝!

        • FreeRTOS
          +關注

          關注

          10

          文章

          239

          瀏覽量

          55404
        • Studio
          +關注

          關注

          0

          文章

          120

          瀏覽量

          25949
        • 線程
          +關注

          關注

          0

          文章

          197

          瀏覽量

          17280
        • RT-Thread
          +關注

          關注

          27

          文章

          398

          瀏覽量

          33671
        收藏 人收藏

          評論

          相關推薦

          RT-Thread串口使用指南及問題解決方式匯總

          1、這篇文章主要講解如何適配串口V2驅動,下面以STM32F411RE-NUCLEO的BSP為例,講解如何快速適配到該開發板上 ...
          發表于 06-23 15:29 ? 1798次 閱讀

          怎么去解決armv8a移植到rt-smart分支系統中出錯的問題呢

          系統環境 armv8-a 64位 4核cortex-a35 移植到rt-smart分支系統中 由于rt沒有線程支持aarch64 cortex-a35,因此參考cortex-a72...
          發表于 06-23 14:57 ? 905次 閱讀

          NUC980開發板應用 基于NK-980IoT的國學唐詩學習機

          基于NK-980IoT的國學唐詩學習機 1 項目背景 最近一直在陪小孩學習國學精髓,比如唐詩、宋詞這....
          的頭像 RTThread物聯網操作系統 發表于 06-23 14:55 ? 296次 閱讀

          ThreadStacks C/C++進程堆棧追蹤庫

          ./oschina_soft/threadstacks.zip
          發表于 06-23 14:49 ? 6次 閱讀
          ThreadStacks C/C++進程堆棧追蹤庫

          Nuvoton M487開發板環境搭建和程序下載測試入門

          一、開發板介紹1. 前言很感謝RT-Thread 和 新唐給予的這次評測機會,本次評測的開發板是 新唐的 Nuvoton M487,我們拿到手的...
          發表于 06-23 14:36 ? 1012次 閱讀

          基于RT-Thread+RA6M4的智能安防系統詳解

          ??無論是在家里還是在公司,安防都尤為的重要,與其亡羊補牢,更重要的是防患于未然。安全是目的,防范是....
          的頭像 物聯網技術分享 發表于 06-23 14:34 ? 51次 閱讀
          基于RT-Thread+RA6M4的智能安防系統詳解

          在RT-Thread studio + NK-980IOT環境下使用iperf命令測試四種模式帶寬

          測試環境開發板:NK-980IOT V1.0 開發環境:RT-Thread studio 2.2.1 + NuWriter v1.18 RT-Thread版本:4.0.5 開...
          發表于 06-23 14:20 ? 1087次 閱讀

          怎樣對基于NK-980IOT開發板的SPI NAND Flash進行讀寫測試呢

          SPI協議其實是包括:Standard SPI、Dual SPI和Queued SPI三種協議接口,分別對應3-wire, 4-wire, 6-wire。 (1)...
          發表于 06-23 12:05 ? 1185次 閱讀

          Nuvoton M487開發板的PWM驅動評測步驟分享

          一、M487 PWM簡介1、EPWM ? 8個獨立PWM 輸出,16位計數器,12位預分頻,最大時鐘 192MHz ? 12位死區時間 ? 計...
          發表于 06-23 11:56 ? 448次 閱讀

          簡要分析N9H30開發板RTThread框架下的LVGL demo源碼

          續接上一篇文章,分析LVGL的demo源碼。官方的widget例程代碼lv_demo_widgets()函數體如下,下面逐步分析。雖然之前也簡單看過...
          發表于 06-23 11:42 ? 357次 閱讀

          基于NK880IOT和RT-Thread的TIMER硬件使用說明

          1、NK880IOT-NK9TIMER簡介開發環境簡介NK-980IOT V1.0 (NUC980DK61Y)RT-Thread Studio + J-Link ...
          發表于 06-23 11:21 ? 772次 閱讀

          分享一種基于RT-Thread和N32G457的運動姿態解算設計

          1、基于RT-Thread和N32G457的運動姿態解算基本框架如上圖所示,設計框架由硬件和軟件兩部分組成,其中硬件主要包括N32G45...
          發表于 06-23 10:24 ? 1071次 閱讀

          rt-thread 優化系列(五)lwip 裁剪

          很久之前就開始整理下面的優化項列表了,但是有很多問題研究不深,一時不敢冒失推出。
          的頭像 出出 發表于 06-23 10:21 ? 831次 閱讀

          RT-Thread記錄(八、理解RT-Thread內存管理)

          記得最初學習 RT-Thread ,對于內存管理我也是簡單看看然后一筆帶過,當時覺得用不上,在我做的....
          的頭像 矜辰所致 發表于 06-23 10:11 ? 188次 閱讀
          RT-Thread記錄(八、理解RT-Thread內存管理)

          rt-thread 驅動篇(八)hwtimer 重載算法優化

          區別于 rt-thread 內核實現的兩種定時器,這種定時器依賴芯片內置的定時器外設,依靠穩定高速的....
          的頭像 出出 發表于 06-23 10:10 ? 829次 閱讀
          rt-thread 驅動篇(八)hwtimer 重載算法優化

          rt-thread 優化系列(四)信號對 ipc 的影響

          信號 signal,并不是線程間同步的信號量 semaphore。后者是線程間同步機制的一種,而前者....
          的頭像 出出 發表于 06-23 09:51 ? 817次 閱讀

          rt-thread優化系列(三)軟定時器的定時漂移問題分析

          所謂軟定時器,是由一個線程運行維護的定時器列表。由線程調用定時器回調函數。
          的頭像 出出 發表于 06-23 09:35 ? 829次 閱讀

          GD32 RISC-V系列 BSP框架制作與移植

          ? 手把手教你使用RT-Thread制作GD32 RISC-V系列BSP 熟悉RT-Thread的朋....
          的頭像 嵌入式大雜燴 發表于 06-22 19:44 ? 1520次 閱讀
          GD32 RISC-V系列 BSP框架制作與移植

          基于RT-Thread操作系統衍生rt-smart實時操作系統簡介

          1、rt-smart 實時操作系統簡介RT-Thread Smart(簡稱 rt-smart)嵌入式實時操作系統是基于 RT-Thread 操作系統衍生的新分...
          發表于 06-22 17:56 ? 2372次 閱讀

          FreeRTOS-MPU特性說明

          MPU(Memory Protection Unit,內存保護單元)在 Cortex-M內核中是可選....
          的頭像 strongerHuang 發表于 06-22 14:05 ? 79次 閱讀

          RT-Thread記錄(七、IPC機制之郵箱、消息隊列)

          講完了線程同步的機制,我們要開始線程通訊的學習,
          的頭像 矜辰所致 發表于 06-22 10:06 ? 179次 閱讀
          RT-Thread記錄(七、IPC機制之郵箱、消息隊列)

          rt-thread 驅動篇(三) serialX 壓力測試

          本周筆者花了好多天的時間,計劃從多個方面對串口驅動做個比較。下面就從以下幾個角度做個對比測試。
          的頭像 出出 發表于 06-22 09:22 ? 1247次 閱讀

          rt-thread 驅動篇(二) serialX 理論實現

          在前一篇文章里,大致提出了我的串口驅動框架理論。里面做了一些對串口驅動特性的幻想。也在 NUC970....
          的頭像 出出 發表于 06-22 09:03 ? 1345次 閱讀
          rt-thread 驅動篇(二) serialX 理論實現

          GD32407V-START開發板的BSP框架制作與移植

          熟悉RT-Thread的朋友都知道,RT-Thread提供了許多BSP,但不是所有的板子都能找到相應....
          的頭像 嵌入式大雜燴 發表于 06-22 08:54 ? 1286次 閱讀
          GD32407V-START開發板的BSP框架制作與移植

          RT-Thread記錄(六、IPC機制之信號量互斥量事件集)

          上文說到 RT-Thread 對臨界區的處理方式有多種,其中已經分析了關閉調度器和屏蔽中斷的方式, ....
          的頭像 矜辰所致 發表于 06-21 10:40 ? 2213次 閱讀
          RT-Thread記錄(六、IPC機制之信號量互斥量事件集)

          rt-thread 驅動篇(一) serialX 框架理論

          串口驅動三種工作模式:輪詢、中斷、DMA。
          的頭像 出出 發表于 06-21 10:37 ? 2010次 閱讀
          rt-thread 驅動篇(一) serialX 框架理論

          rt-thread 優化系列(二) 之 同步和消息關中斷分析

          書接前文,上篇優化聊的是關中斷操作,在很多地方過保護,導致關中斷時間太久,可能引起其它中斷不能及時響....
          的頭像 出出 發表于 06-21 09:47 ? 1836次 閱讀

          rt-thread 優化系列(一) 之 過多關中斷

          關于優化的話題永遠不過時,沒期限。
          的頭像 出出 發表于 06-21 09:03 ? 1421次 閱讀

          rt-thread 優化系列(0) SysTick 優化分析

          論壇里有人提出了一個疑問,說 STM32 系列 bsp 在初始化系統時鐘的過程中使用到了 tick ....
          的頭像 出出 發表于 06-21 08:55 ? 1246次 閱讀

          usbhost驅動相關疑問與調試記錄

          調試 stm32 的usb host 的艱辛歷程。希望有遇到相同問題的人能從中發現點兒什么。
          的頭像 出出 發表于 06-20 15:24 ? 176次 閱讀

          RT-Thread記錄(四、RTT時鐘節拍和軟件定時器)

          RT-Thread第4課,聽聽 RT-Thread 的心跳,再學習一下基于心跳的軟件定時器使用。
          的頭像 矜辰所致 發表于 06-20 11:50 ? 2066次 閱讀
          RT-Thread記錄(四、RTT時鐘節拍和軟件定時器)

          rt-thread 驅動篇(六)serialX弊端及解決方法

          serialX 作為一個非阻塞串口驅動框架,在遇到一些異常時,需要做一些特殊處理,今天,筆者帶大家來....
          的頭像 出出 發表于 06-20 11:43 ? 239次 閱讀

          HPM6750EVKMINI開發板生成coremark和FreeRTOS工程

          使用先楫,當然就是看上它的高性能,順便了解了一下晶心D45內核,發現華人都有一個特點,要是掌握了一個....
          的頭像 Evanee 發表于 06-20 09:25 ? 130次 閱讀
          HPM6750EVKMINI開發板生成coremark和FreeRTOS工程

          RT-Thread記錄(三、RT-Thread線程操作函數)

          講完了RT-Thread開發環境,啟動流程,啟動以后當然是開始跑線程了,那么自然我們得學會如何創建線....
          的頭像 矜辰所致 發表于 06-20 00:31 ? 1731次 閱讀
          RT-Thread記錄(三、RT-Thread線程操作函數)

          RT-Thread記錄(二、RT-Thread內核啟動流程)

          在前面我們RT-Thread Studio工程基礎之上講一講RT-Thread內核啟動流程.
          的頭像 矜辰所致 發表于 06-20 00:30 ? 1797次 閱讀
          RT-Thread記錄(二、RT-Thread內核啟動流程)

          RT-Thread記錄(一、版本開發環境及配合CubeMX)

          RT-Thread 學習記錄的第一篇文章,RT-Thread記錄(一、RT-Thread 版本、RT....
          的頭像 矜辰所致 發表于 06-20 00:28 ? 1801次 閱讀
          RT-Thread記錄(一、版本開發環境及配合CubeMX)

          基于Select/Poll實現并發服務器(二)

          開發環境: RT-Thread版本:4.0.3 操作系統:Windows10 Keil版本:V5.3....
          的頭像 嵌入式大雜燴 發表于 06-20 00:26 ? 1834次 閱讀
          基于Select/Poll實現并發服務器(二)

          基于Select/Poll實現并發服務器(一)

          ? 開發環境: RT-Thread版本:4.0.3 操作系統:Windows10 Keil版本:V5....
          的頭像 嵌入式大雜燴 發表于 06-20 00:20 ? 1763次 閱讀
          基于Select/Poll實現并發服務器(一)

          棧是什么?棧有什么作用?

          大多數的處理器架構,都有實現硬件棧。有專門的棧指針寄存器,以及特定的硬件指令來完成 入棧/出棧 的操....
          的頭像 一口Linux 發表于 06-17 11:19 ? 176次 閱讀

          MPU6050簡介及rt-thread軟件包使用

          小伙伴們大家好,好久不更新RT-Thread實戰筆記啦,今天來搞一搞MPU6050,話不多說,淦!
          的頭像 RTThread物聯網操作系統 發表于 06-17 10:42 ? 233次 閱讀

          使用memheap內存管理算法對片內RAM和片外SDRAM進行管理的方法

          ??在開發中由于單片機自帶的 RAM 空間比較小,有時候需要擴展片外的 RAM 以供使用,RT-Th....
          的頭像 RT-Thread 操作系統 發表于 06-17 08:53 ? 262次 閱讀
          使用memheap內存管理算法對片內RAM和片外SDRAM進行管理的方法

          RT-Thread自動初始化機制

          ??在分析之前首先查閱 RT-Thread 的官方文檔 [RT-Thread 自動初始化機制](ht....
          的頭像 RT-Thread 操作系統 發表于 06-17 08:52 ? 203次 閱讀
          RT-Thread自動初始化機制

          RT-thread線程切換原理與實現

          RTThread官網看一下,可以發現【rt_thread_suspend】的函數說明中,特意的說明了....
          的頭像 嵌入式應用開發 發表于 06-16 15:12 ? 154次 閱讀
          RT-thread線程切換原理與實現

          rt-thread 驅動篇(五)serialX 小試牛刀

          終于來到了 serialX 的實踐篇,期待很久了。
          的頭像 出出 發表于 06-16 11:29 ? 241次 閱讀
          rt-thread 驅動篇(五)serialX 小試牛刀

          AT組件的實現過程和代碼的調用邏輯

          AT組件的核心處理邏輯是將收到的 AT 模組的應答信息放到 recv_line_buf 緩沖區中,然....
          的頭像 RT-Thread 操作系統 發表于 06-15 09:21 ? 204次 閱讀
          AT組件的實現過程和代碼的調用邏輯

          FreeRTOS配置文件的通用配置

          系統滴答,即系統每秒鐘滴答的次數,可以說是系統的心跳,但需要和主頻區分開來。系統滴答的值要根據CPU....
          的頭像 strongerHuang 發表于 06-15 09:11 ? 138次 閱讀

          想要使用AI卻不會AI建模嗎

          人類經歷了三次工業革命,無論是蒸汽機、電力還是電子信息技術,每一次革命都給人類的生產力帶來了幾十倍的....
          的頭像 科技綠洲 發表于 06-14 14:29 ? 729次 閱讀

          Hippo4J動態可觀測線程池框架

          ./oschina_soft/gitee-hippo4j.zip
          發表于 06-14 11:04 ? 32次 閱讀
          Hippo4J動態可觀測線程池框架

          Streamis流式應用開發管理系統

          ./oschina_soft/gitee-Streamis.zip
          發表于 06-14 10:25 ? 7次 閱讀
          Streamis流式應用開發管理系統

          nr_micro_shell介紹及使用方法

          在進行調試和維護時,常常需要與單片機進行交互,獲取、設置某些參數或執行某些操作,nr_micro_s....
          的頭像 MCU開發加油站 發表于 06-13 16:58 ? 381次 閱讀

          rt-thread 驅動篇(七)GPIO驅動

          一提 GPIO 可能會讓很多人覺得不屑,這么簡單的東西有什么可說的,也就是一個拉低拉高,誰不會呢。
          的頭像 出出 發表于 06-13 09:48 ? 400次 閱讀

          rt-thread 驅動篇(四)serialX 多架構適配

          自筆者提出 serialX 串口驅動到今天近半年了,當初只在 STM32F4 NUC970 兩個系列....
          的頭像 出出 發表于 06-10 10:21 ? 303次 閱讀

          RT-Thread專業版實現對于龍芯全系列處理器支持

          近日,在龍芯中科與睿賽德科技的共同努力下,RT-Thread專業版已實現了對LoongArch32和....
          的頭像 科技綠洲 發表于 06-09 16:45 ? 756次 閱讀

          龍芯中科LoongArch自主指令系統為產業生態保駕護航

          目前,龍芯中科業務已全部轉向 LoongArch 自主指令系統架構,龍芯 2K1000LA 處理器的....
          的頭像 科技綠洲 發表于 06-08 11:10 ? 331次 閱讀

          實時操作系統FreeRTOS信號量應用

          二值信號量通常用于互斥訪問或同步,二值信號量和互斥信號量非常相似,但還是有細微差別,互斥信號量擁有優....
          的頭像 嵌入式技術 發表于 06-08 09:24 ? 1091次 閱讀
          實時操作系統FreeRTOS信號量應用

          實時操作系統FreeRTOS應用之任務調試信息獲取

          FreeRTOS任務調試信息獲取可以很好的作為前期開發調試使用,用于查詢各個任務間的堆??臻g利用率,....
          的頭像 嵌入式技術 發表于 06-08 09:12 ? 951次 閱讀
          實時操作系統FreeRTOS應用之任務調試信息獲取

          FreeRtos入門手冊中文版

          全中文FreeRtos詳解,學習入門精通。
          發表于 06-02 11:13 ? 103次 閱讀

          RT-Thread 4.1.0正式添加對Arm Compiler 6支持

          在 RT-Thread 4.1.0 正式發布版中,添加了對 Arm Compiler 6 的支持,用....
          的頭像 科技綠洲 發表于 06-01 15:20 ? 335次 閱讀
          RT-Thread 4.1.0正式添加對Arm Compiler 6支持

          CC2652R SimpleLink 多標準 CC2652R 無線 MCU

          CC2652R 器件是一款多協議無線 2.4GHz MCU,面向線程、 Zigbee?、低功耗 Bluetooth? 5、IEEE 802.15.4g、支持 IPv6 的智能對象 (6LoWPAN)、 Wi-SUN?和專有系統。CC2652R 是 CC26xx 和 CC13xx 系列中具有成本效益和超低功耗的 2.4GHz 和低于 1GHz 射頻器件。極低的有源射頻和微控制器 (MCU) 電流以及低于 1μA 的睡眠電流和最高 80KB RAM 保持能力可確保卓越的電池壽命,并支持依靠小型紐扣電池在能量采集 應用中長時間的工作。CC2652R 器件在一個支持多個物理層和射頻標準的平臺上將靈活的超低功耗射頻收發器與強大的 48 MHz Arm? Cortex?-M4F CPU 結合在一起。專用無線電控制器 (Arm? Cortex?-M0) 可處理存儲在 ROM 或 RAM 中的低級射頻協議命令,因而可確保超低功耗和極佳的靈活性。CC2652R 器件的低功耗不會影響射頻性能,CC2652R 器件具有優異的靈敏度和耐用(選擇性和阻斷)性能。 CC2652R 器件是高度集成的真正的單芯片解決方案,結合了完整的射頻系統和片上直流/直流轉換器。 通過具有 4KB 程序和數據 SRAM 存儲器的可編程、自主式超低功耗傳感器控制器 CPU,可在...
          發表于 11-02 19:32 ? 1132次 閱讀
          CC2652R SimpleLink 多標準 CC2652R 無線 MCU