精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

什么是FreeRTOS?什么是CMSIS?

冬至子 ? 來源:ITRelief ? 作者:Sachefgh Xu ? 2023-07-25 15:01 ? 次閱讀

一、理解CMSIS-RTOS

現在網上很多資料和文章實際上都沒有講清楚CMSIS-RTOS這個東西,但理解它的原理構成太重要了,所以我按自己的理解把RTOS這部分的架構整理了一下,如有問題歡迎指正。

1.什么是FreeRTOS?

**目前CubeMX支持的CMSIS-RTOS使用的第三方內核就是FreeRTOS **

FreeRTOS是一個開源的輕量級實時操作系統,目前在我國嵌入式市場占有很大份額。與μC/OS-2/3、embOS等商業系統相比,在進行產品級應用時更加便捷自由。如果你先前接觸過樂鑫的esp模塊的話現在對FreeRTOS一定有比較深入的了解。

2.什么是CMSIS?

CMSIS(Common Microcontroller Software Interface Standard)是ARM提出的一種 Cortex-M /A處理器系列的與供應商無關的硬件抽象層和軟件接口層。

CMSIS的主要組件包含兩個:

  • CMSIS-CORE:提供與 Cortex-M0、Cortex-M3、Cortex-M4、SC000 和 SC300 處理器與外圍寄存器之間的接口
  • CMSIS-RTOS API:用于線程控制、資源和時間管理的實時操作系統的標準化編程接口
    圖片

STM32的CMSIS-RTOS來說,架構圖中的Real Time Kernel 就是FreeRTOS(抽象層); CMSIS-CORE提供了硬件層的映射關系,與芯片型號有對應關系。

圖片

而CMSIS-RTOS API則實現了第三方實時內核API的再封裝,與第三方實時內核有對應關系

綜上,STM32CubeMX的 Middleware雖然使用了FreeRTOS,但部分函數其實已經經過封裝了),※使用的是CMSIS API 及 FreeRTOS的原生API。

CMSIS-RTOS在用戶的應用代碼和第三方的RTOS Kernel直接架起一道橋梁,一個設計在不同的RTOS之間移植,或者在不同Cortex MCU直接移植的時候,如果兩個RTOS都實現了CMSIS-RTOS,那么用戶的應用程序代碼完全可以不做修改。

二、項目文件解析

圖片

其中 Drivers/CMSIS文件夾主要存放Cortex內核及設備文件、微控制器專用啟動代碼/系統文件,即CMSIS-RTOS Core部分的內容。

※而Middleware文件夾中則是FreeRTOS API和封裝的CMSIS API的聲明和定義。

三、啟用FreeRTOS

① 使用CubeMX的情況下配置FreeRTOS非常簡單,生成的代碼相對也比較規整:

圖片

界面選擇CMSIS_V2,移植性更好

圖片

系統時鐘源會與RTOS沖突,需更改。

圖片

②隨后進入config param選項卡或者文件配置參數【保存在FreeRTOSConfig.h中】:

configUSE_PREEMPTION: 調度模式配置。配置為1時為搶占式調度,配置為0時為合作式調度。實時操縱系統為實現其功能,應當設置為1。

configCPU_CLOCK_HZ: CPU時鐘,在Systick為時鐘源情況下應取SystemCoreClock 。

configTICK_RATE_HZ: 每秒系統心跳數。用于osDelay()[CMSIS] 、vTaskDelay()[FreeRTOS] 等延時函數,默認最大值為1000。因此”線程“切換和延時函數分辨率為1ms。

configMAX_PRIORITIES:(※) 最大任務優先級;最高優先級為(該值-1)。

configMINIMAL_STACK_SIZE:最小堆棧值,單位[4 字節]

configTOTAL_HEAP_SIZE:總共堆棧大小

configMAX_TASK_NAME_LEN :最大TASK名稱長度

configUSE_16_BIT_TICKS : 配置心跳計時器數據位長度。0時為32位;配置為1時為16位。

configUSE_MUTEXES:(※) 使用互斥鎖功能(1開) 。 互斥鎖的作用是實現多任務間共享資源的獨占式處理,防止多線程同時訪問操作同一資源發生錯誤。

configUSE_RECURSIVE_MUTEXES:(※) 使用遞歸互斥鎖

configUSE_COUNTING_SEMAPHORES:使用信號計量功能。

對STM32硬件來說,中斷優先級越高值越小。而對FreeRTOS,任務優先級越高值越大。

※中斷屏蔽/分類管理

RTOS在cortex-M上的實現是通過軟件方式實現的。拿CubeMX生成的代碼來說,
main.c中執行完初始化代碼后執行osKernelStart(),進入消息回環(Scheduler)。

因此,硬件中斷仍然有效;雖然已經使用了RTOS,但對于一些特殊功能,例如運動急停、避障等還是必須依靠中斷實現。這引來了兩個問題;

首先是中斷會影響任務執行。對此FreeRTOS提供了中斷屏蔽的方法,采用類似蒙版的方式,利用BASEPRI寄存器對不同優先級的中斷進行分類管理:

configPRIO_BITS: MCU使用的優先級位數 ,STM32有4位所以設置為4,對應0~15優先級;數值越小,優先級越高。不要修改

另外,系統默認使用組4的配置,即16個優先級均為搶占優先級。

configLIBRARY_LOWEST_INTERRUPT_PRIORITY: MCU的最低優先級, STM32為15。不要修改

configKERNEL_INTERRUPT_PRIORITY:*設置內核使用的中斷優先級。默認設置為最低優先級(8位高位填補)。*無必要修改

configMAX_SYSCALL_INTERRUPT_PRIORITY* 優先級閾值轉換,不要修改。*

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:*配置FreeRTOS系統可管理的最大優先級。*對于cortex-M3取值為 0-15。

本項的意義在于,當中斷的優先性等于或低于此值時,這類中斷將由RTOS系統托管。 具體包括可被RTOS屏蔽,可以通過經RTOS托管的入口(函數名稱相同)訪問等;此類被接管的中斷可以使用RTOS的部分API(FromISR的安全函數)。

而高于設定值優先級的中斷則會照常執行,即*裸金屬層的硬件級中斷。*此類中斷不能使用RTOS的API( 與RTOS系統運行平級,執行時中斷了RTOS的運行)

圖片

一般使用RTOS時大部分中斷都應由系統托管,使用RTOS不可控的硬件級中斷容易導致執行錯誤和其他問題。CubeMX配置時也設置了限制。

CMSIS-RTOS控制中斷開啟關閉的函數為portDISABLE_INTERRUPTS()和portENABLE_INTERRUPTS(),兩者定義在 portmacro.h中:

圖片

實際上是通過了宏定義的方式調用了RTOS的vPortRaiseBASEPRI()和vPortSetBASEPRI(0).

※延時函數的使用

在裸金屬編程的時候,我們習慣使用LL_mDelay()和自定義的相似原理函數;而這在引入RTOS后會產生問題:

圖片

可以看到LL_mDelay()使用了SysTick計數器,調用時還會清零。而FreeRTOS用的時鐘源就是SysTick。因此只要使用了CMSIS-RTOS,都不應使用利用Systick實現的延時函數。

當然 CMSIS和FreeRTOS也提供了相應的延時函數:

CMSIS API:

osStatus_t osDelay (uint32_t ticks);  //延時ticks個心跳;基于vTaskDelay();

osStatus_t osDelayUntil (uint32_t ticks);//延時至心跳計數為ticks; 基于vTaskDelayUntil();

FreeRTOS API:

void vTaskDelay( const TickType_t xTicksToDelay );//定時(相對心跳數),并阻塞task

TickType_t xTaskGetTickCount();//返回系統此時心跳數

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );
//定時(相對心跳數),并阻塞task.

vTaskDelay()和vTaskDelayUntil()效果不同,vTaskDelay()延時是相對延時,如果執行中發生中斷將會導致執行周期的延長等問題。而vTaskDelayUntil是絕對延時,相對執行更嚴格。

當處于延時中時,任務會進入阻塞狀態,延時執行完畢后轉入準備狀態,等待系統****跳轉運行(高優先先行),所以任務優先級不高的話執行時序也不能被嚴格保證。

※有關線程狀態:

圖片

  • RUNNING: The thread that is currently running is in the RUNNING state. Only one thread at a time can be in this state.
  • READY: Threads which are ready to run are in the READY state. Once the RUNNING thread has terminated, or is BLOCKED , the next READY thread with the highest priority becomes the RUNNING thread.
  • BLOCKED: Threads that are blocked either delayed, waiting for an event to occur or suspended are in the BLOCKED state.
  • TERMINATED: When osThreadTerminate is called, threads are TERMINATED with resources not yet released (applies to joinable threads).
  • INACTIVE: Threads that are not created or have been terminated with all resources released are in the INACTIVE state.
    ※以上延時函數絕對不能用于中斷,更不可以用于嵌套,否則會導致錯誤。

由此可見在使用RTOS的情況下,利用中斷執行時序將變得非常復雜麻煩;中斷延時一般只能通過__NOP__實現,嚴重影響系統效率,因此一般中斷只用于改變標志位、狀態位、硬件操作上,及時性的時序操作請利用中斷聯系信號機制實現。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    18930

    瀏覽量

    227293
  • 寄存器
    +關注

    關注

    31

    文章

    5254

    瀏覽量

    119217
  • CMSIS
    +關注

    關注

    0

    文章

    39

    瀏覽量

    11826
  • FreeRTOS
    +關注

    關注

    12

    文章

    483

    瀏覽量

    61733
  • 串口中斷
    +關注

    關注

    0

    文章

    64

    瀏覽量

    13798
收藏 人收藏

    評論

    相關推薦

    求助,關于CMSIS-OS對FreeRTOS封裝的問題求解

    最近在玩HAL庫封裝的freeRTOS,因為CMSIS-OS是ARM退出的統一RTOS接口,以便可以對第三方的RTOS進行統一無差別的訪問。最近在玩第一個例子的時候,發現
    發表于 05-11 08:51

    3. CMSIS API 2 #硬聲創作季 #FreeRTOS

    API編程語言FreeRTOS
    jf_06209345
    發布于 :2022年08月16日 20:45:15

    CMSIS RTOS任務間通信

    通信CMSIS
    橙群微電子
    發布于 :2023年09月28日 15:48:23

    CMSIS RTOS Timer

    CMSIS函數
    橙群微電子
    發布于 :2023年11月27日 16:06:03

    你們有沒有誰用過freeRTOS

    你們有沒有誰用過的freeRTOScmsis_os.c#define osThread(name)\&os_thread_def_##name 這是什么意思
    發表于 06-18 04:35

    CubeMX FreeRTOS(cmsis os)函數API一覽

    以下所有資料來源于cmsis rtos官方說明文檔,在keil5本地就有:Function Overview函數一覽:Kernel Information and Control
    發表于 01-11 07:22

    STM32CubeIDE+FREERTOS的相關資料下載

    1. STM32Cube生成的FREERTOS系統是加了CMSIS_RTOS封裝的,該封裝下函數的調用要比FREERTOS簡單一點,將中斷調用和線程調用綜合到了一起,但又不提示這個函數支不支持中斷
    發表于 02-09 07:57

    FreeRTOS如何針對使用xTaskCreate創建的那些任務進行調度?

    我正在使用 FreeRTOS v10.2.1、CMSIS RTOS v1 main.c(由 CubeMX 生成)有:...osThreadDef(defaultTask
    發表于 01-10 06:20

    GD32_CMSIS_DAP

    GD32_CMSIS_DAP,有需要的下來看看
    發表于 07-29 17:08 ?99次下載

    使用與MQX CMSIS-DSP算法

    CMSIS DSP庫與Freescale MQX RTOS的結合。還包括CMSISCMSIS DSP庫介紹。應用程序注釋基于CMSIS DSP庫版本2.10,使用IAR ARM工作臺
    發表于 09-07 17:33 ?5次下載
    使用與MQX <b class='flag-5'>CMSIS</b>-DSP算法

    MQX CMSIS-DSP算法應用

    MQX CMSIS-DSP算法應用
    發表于 09-29 16:47 ?20次下載
    MQX <b class='flag-5'>CMSIS</b>-DSP算法應用

    基于MQX CMSIS-DSP算法應用

    基于MQX CMSIS-DSP算法應用
    發表于 10-09 08:56 ?11次下載
    基于MQX <b class='flag-5'>CMSIS</b>-DSP算法應用

    FreeRTOS 隊列 信號量 互斥量

    FreeRTOS的工程, 細心的同學可能發現, 已創建任務的函數為例, FreeRTOS官方是xTaskCreate(), 到之前CubeMX生成cmsis_os中的osThreadCreate, 再到最...
    發表于 12-09 09:51 ?0次下載
    <b class='flag-5'>FreeRTOS</b> 隊列 信號量 互斥量

    CMSIS_V1和CMSIS_V2有什么區別呢,該怎選擇呢?

    STM32CubeIDE在stm32開發者起著最基礎的作用,在STM32CubeIDE中配置FreeRTOS中間層時需要選擇interface,其中有三個選項:Disable、CMSIS_V1和CMSIS_V2
    的頭像 發表于 09-06 09:26 ?2595次閱讀

    CMSIS-RTOS是什么?

    我們在使用STM32CubeMX配置FreeRTOS時有一個CMSIS_V1和CMSIS_V2的選項,你知道CMSIS_V1和CMSIS_V
    的頭像 發表于 04-11 10:53 ?1133次閱讀