chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是FreeRTOS?什么是CMSIS?

冬至子 ? 來(lái)源:ITRelief ? 作者:Sachefgh Xu ? 2023-07-25 15:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、理解CMSIS-RTOS

現(xiàn)在網(wǎng)上很多資料和文章實(shí)際上都沒(méi)有講清楚CMSIS-RTOS這個(gè)東西,但理解它的原理構(gòu)成太重要了,所以我按自己的理解把RTOS這部分的架構(gòu)整理了一下,如有問(wèn)題歡迎指正。

1.什么是FreeRTOS?

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

FreeRTOS是一個(gè)開(kāi)源的輕量級(jí)實(shí)時(shí)操作系統(tǒng),目前在我國(guó)嵌入式市場(chǎng)占有很大份額。與μC/OS-2/3、embOS等商業(yè)系統(tǒng)相比,在進(jìn)行產(chǎn)品級(jí)應(yīng)用時(shí)更加便捷自由。如果你先前接觸過(guò)樂(lè)鑫的esp模塊的話現(xiàn)在對(duì)FreeRTOS一定有比較深入的了解。

2.什么是CMSIS?

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

CMSIS的主要組件包含兩個(gè):

  • CMSIS-CORE:提供與 Cortex-M0、Cortex-M3、Cortex-M4、SC000 和 SC300 處理器與外圍寄存器之間的接口
  • CMSIS-RTOS API:用于線程控制、資源和時(shí)間管理的實(shí)時(shí)操作系統(tǒng)的標(biāo)準(zhǔn)化編程接口
    圖片

對(duì)STM32的CMSIS-RTOS來(lái)說(shuō),架構(gòu)圖中的Real Time Kernel 就是FreeRTOS(抽象層); CMSIS-CORE提供了硬件層的映射關(guān)系,與芯片型號(hào)有對(duì)應(yīng)關(guān)系。

圖片

而CMSIS-RTOS API則實(shí)現(xiàn)了第三方實(shí)時(shí)內(nèi)核API的再封裝,與第三方實(shí)時(shí)內(nèi)核有對(duì)應(yīng)關(guān)系

綜上,STM32CubeMX的 Middleware雖然使用了FreeRTOS,但部分函數(shù)其實(shí)已經(jīng)經(jīng)過(guò)封裝了),※使用的是CMSIS API 及 FreeRTOS的原生API。

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

二、項(xiàng)目文件解析

圖片

其中 Drivers/CMSIS文件夾主要存放Cortex內(nèi)核及設(shè)備文件、微控制器專用啟動(dòng)代碼/系統(tǒng)文件,即CMSIS-RTOS Core部分的內(nèi)容。

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

三、啟用FreeRTOS

① 使用CubeMX的情況下配置FreeRTOS非常簡(jiǎn)單,生成的代碼相對(duì)也比較規(guī)整:

圖片

界面選擇CMSIS_V2,移植性更好

圖片

系統(tǒng)時(shí)鐘源會(huì)與RTOS沖突,需更改。

圖片

②隨后進(jìn)入config param選項(xiàng)卡或者文件配置參數(shù)【保存在FreeRTOSConfig.h中】:

configUSE_PREEMPTION: 調(diào)度模式配置。配置為1時(shí)為搶占式調(diào)度,配置為0時(shí)為合作式調(diào)度。實(shí)時(shí)操縱系統(tǒng)為實(shí)現(xiàn)其功能,應(yīng)當(dāng)設(shè)置為1。

configCPU_CLOCK_HZ: CPU時(shí)鐘,在Systick為時(shí)鐘源情況下應(yīng)取SystemCoreClock 。

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

configMAX_PRIORITIES:(※) 最大任務(wù)優(yōu)先級(jí);最高優(yōu)先級(jí)為(該值-1)。

configMINIMAL_STACK_SIZE:最小堆棧值,單位[4 字節(jié)]

configTOTAL_HEAP_SIZE:總共堆棧大小

configMAX_TASK_NAME_LEN :最大TASK名稱長(zhǎng)度

configUSE_16_BIT_TICKS : 配置心跳計(jì)時(shí)器數(shù)據(jù)位長(zhǎng)度。0時(shí)為32位;配置為1時(shí)為16位。

configUSE_MUTEXES:(※) 使用互斥鎖功能(1開(kāi)) 。 互斥鎖的作用是實(shí)現(xiàn)多任務(wù)間共享資源的獨(dú)占式處理,防止多線程同時(shí)訪問(wèn)操作同一資源發(fā)生錯(cuò)誤。

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

configUSE_COUNTING_SEMAPHORES:使用信號(hào)計(jì)量功能。

對(duì)STM32硬件來(lái)說(shuō),中斷優(yōu)先級(jí)越高值越小。而對(duì)FreeRTOS,任務(wù)優(yōu)先級(jí)越高值越大。

※中斷屏蔽/分類管理

RTOS在cortex-M上的實(shí)現(xiàn)是通過(guò)軟件方式實(shí)現(xiàn)的。拿CubeMX生成的代碼來(lái)說(shuō),
main.c中執(zhí)行完初始化代碼后執(zhí)行osKernelStart(),進(jìn)入消息回環(huán)(Scheduler)。

因此,硬件中斷仍然有效;雖然已經(jīng)使用了RTOS,但對(duì)于一些特殊功能,例如運(yùn)動(dòng)急停、避障等還是必須依靠中斷實(shí)現(xiàn)。這引來(lái)了兩個(gè)問(wèn)題;

首先是中斷會(huì)影響任務(wù)執(zhí)行。對(duì)此FreeRTOS提供了中斷屏蔽的方法,采用類似蒙版的方式,利用BASEPRI寄存器對(duì)不同優(yōu)先級(jí)的中斷進(jìn)行分類管理:

configPRIO_BITS: MCU使用的優(yōu)先級(jí)位數(shù) ,STM32有4位所以設(shè)置為4,對(duì)應(yīng)0~15優(yōu)先級(jí);數(shù)值越小,優(yōu)先級(jí)越高。不要修改

另外,系統(tǒng)默認(rèn)使用組4的配置,即16個(gè)優(yōu)先級(jí)均為搶占優(yōu)先級(jí)。

configLIBRARY_LOWEST_INTERRUPT_PRIORITY: MCU的最低優(yōu)先級(jí), STM32為15。不要修改

configKERNEL_INTERRUPT_PRIORITY:*設(shè)置內(nèi)核使用的中斷優(yōu)先級(jí)。默認(rèn)設(shè)置為最低優(yōu)先級(jí)(8位高位填補(bǔ))。*無(wú)必要修改

configMAX_SYSCALL_INTERRUPT_PRIORITY* 優(yōu)先級(jí)閾值轉(zhuǎn)換,不要修改。*

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY:*配置FreeRTOS系統(tǒng)可管理的最大優(yōu)先級(jí)。*對(duì)于cortex-M3取值為 0-15。

本項(xiàng)的意義在于,當(dāng)中斷的優(yōu)先性等于或低于此值時(shí),這類中斷將由RTOS系統(tǒng)托管。 具體包括可被RTOS屏蔽,可以通過(guò)經(jīng)RTOS托管的入口(函數(shù)名稱相同)訪問(wèn)等;此類被接管的中斷可以使用RTOS的部分API(FromISR的安全函數(shù))。

而高于設(shè)定值優(yōu)先級(jí)的中斷則會(huì)照常執(zhí)行,即*裸金屬層的硬件級(jí)中斷。*此類中斷不能使用RTOS的API( 與RTOS系統(tǒng)運(yùn)行平級(jí),執(zhí)行時(shí)中斷了RTOS的運(yùn)行)

圖片

一般使用RTOS時(shí)大部分中斷都應(yīng)由系統(tǒng)托管,使用RTOS不可控的硬件級(jí)中斷容易導(dǎo)致執(zhí)行錯(cuò)誤和其他問(wèn)題。CubeMX配置時(shí)也設(shè)置了限制。

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

圖片

實(shí)際上是通過(guò)了宏定義的方式調(diào)用了RTOS的vPortRaiseBASEPRI()和vPortSetBASEPRI(0).

※延時(shí)函數(shù)的使用

在裸金屬編程的時(shí)候,我們習(xí)慣使用LL_mDelay()和自定義的相似原理函數(shù);而這在引入RTOS后會(huì)產(chǎn)生問(wèn)題:

圖片

可以看到LL_mDelay()使用了SysTick計(jì)數(shù)器,調(diào)用時(shí)還會(huì)清零。而FreeRTOS用的時(shí)鐘源就是SysTick。因此只要使用了CMSIS-RTOS,都不應(yīng)使用利用Systick實(shí)現(xiàn)的延時(shí)函數(shù)。

當(dāng)然 CMSIS和FreeRTOS也提供了相應(yīng)的延時(shí)函數(shù):

CMSIS API:

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

osStatus_t osDelayUntil (uint32_t ticks);//延時(shí)至心跳計(jì)數(shù)為ticks; 基于vTaskDelayUntil();

FreeRTOS API:

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

TickType_t xTaskGetTickCount();//返回系統(tǒng)此時(shí)心跳數(shù)

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

vTaskDelay()和vTaskDelayUntil()效果不同,vTaskDelay()延時(shí)是相對(duì)延時(shí),如果執(zhí)行中發(fā)生中斷將會(huì)導(dǎo)致執(zhí)行周期的延長(zhǎng)等問(wèn)題。而vTaskDelayUntil是絕對(duì)延時(shí),相對(duì)執(zhí)行更嚴(yán)格。

當(dāng)處于延時(shí)中時(shí),任務(wù)會(huì)進(jìn)入阻塞狀態(tài),延時(shí)執(zhí)行完畢后轉(zhuǎn)入準(zhǔn)備狀態(tài),等待系統(tǒng)****跳轉(zhuǎn)運(yùn)行(高優(yōu)先先行),所以任務(wù)優(yōu)先級(jí)不高的話執(zhí)行時(shí)序也不能被嚴(yán)格保證。

※有關(guān)線程狀態(tài):

圖片

  • 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.
    ※以上延時(shí)函數(shù)絕對(duì)不能用于中斷,更不可以用于嵌套,否則會(huì)導(dǎo)致錯(cuò)誤。

由此可見(jiàn)在使用RTOS的情況下,利用中斷執(zhí)行時(shí)序?qū)⒆兊梅浅?fù)雜麻煩;中斷延時(shí)一般只能通過(guò)__NOP__實(shí)現(xiàn),嚴(yán)重影響系統(tǒng)效率,因此一般中斷只用于改變標(biāo)志位、狀態(tài)位、硬件操作上,及時(shí)性的時(shí)序操作請(qǐng)利用中斷聯(lián)系信號(hào)機(jī)制實(shí)現(xiàn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    20066

    瀏覽量

    242645
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5493

    瀏覽量

    127725
  • CMSIS
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    12568
  • FreeRTOS
    +關(guān)注

    關(guān)注

    14

    文章

    495

    瀏覽量

    65700
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

    14494
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    求助,關(guān)于CMSIS-OS對(duì)FreeRTOS封裝的問(wèn)題求解

    最近在玩HAL庫(kù)封裝的freeRTOS,因?yàn)?b class='flag-5'>CMSIS-OS是ARM退出的統(tǒng)一RTOS接口,以便可以對(duì)第三方的RTOS進(jìn)行統(tǒng)一無(wú)差別的訪問(wèn)。最近在玩第一個(gè)例子的時(shí)候,發(fā)現(xiàn)
    發(fā)表于 05-11 08:51

    CubeMX創(chuàng)建STM32F1 FreeRTOS選擇新版庫(kù)1.8.6后工程出錯(cuò)是怎么回事?

    /FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c(34): error: 'freertos_os2.h' file not f
    發(fā)表于 03-14 06:31

    3. CMSIS API 2 #硬聲創(chuàng)作季 #FreeRTOS

    API編程語(yǔ)言FreeRTOS
    jf_06209345
    發(fā)布于 :2022年08月16日 20:45:15

    CMSIS RTOS任務(wù)間通信

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

    CMSIS RTOS Timer

    CMSIS函數(shù)
    橙群微電子
    發(fā)布于 :2023年11月27日 16:06:03

    CubeMX FreeRTOS(cmsis os)函數(shù)API一覽

    以下所有資料來(lái)源于cmsis rtos官方說(shuō)明文檔,在keil5本地就有:Function Overview函數(shù)一覽:Kernel Information and Control
    發(fā)表于 01-11 07:22

    STM32CubeIDE+FREERTOS的相關(guān)資料下載

    1. STM32Cube生成的FREERTOS系統(tǒng)是加了CMSIS_RTOS封裝的,該封裝下函數(shù)的調(diào)用要比FREERTOS簡(jiǎn)單一點(diǎn),將中斷調(diào)用和線程調(diào)用綜合到了一起,但又不提示這個(gè)函數(shù)支不支持中斷
    發(fā)表于 02-09 07:57

    FreeRTOS如何針對(duì)使用xTaskCreate創(chuàng)建的那些任務(wù)進(jìn)行調(diào)度?

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

    GD32_CMSIS_DAP

    GD32_CMSIS_DAP,有需要的下來(lái)看看
    發(fā)表于 07-29 17:08 ?99次下載

    使用與MQX CMSIS-DSP算法

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

    MQX CMSIS-DSP算法應(yīng)用

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

    基于MQX CMSIS-DSP算法應(yīng)用

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

    FreeRTOS 隊(duì)列 信號(hào)量 互斥量

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

    CMSIS_V1和CMSIS_V2有什么區(qū)別呢,該怎選擇呢?

    STM32CubeIDE在stm32開(kāi)發(fā)者起著最基礎(chǔ)的作用,在STM32CubeIDE中配置FreeRTOS中間層時(shí)需要選擇interface,其中有三個(gè)選項(xiàng):Disable、CMSIS_V1和CMSIS_V2
    的頭像 發(fā)表于 09-06 09:26 ?3579次閱讀

    CMSIS-RTOS是什么?

    我們?cè)谑褂肧TM32CubeMX配置FreeRTOS時(shí)有一個(gè)CMSIS_V1和CMSIS_V2的選項(xiàng),你知道CMSIS_V1和CMSIS_V
    的頭像 發(fā)表于 04-11 10:53 ?1991次閱讀