www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 技術(shù)讓夢想更偉大
[導(dǎo)讀]STM32CubeIDE在stm32開發(fā)者起著最基礎(chǔ)的作用,在STM32CubeIDE中配置FreeRTOS中間層時需要選擇interface,其中有三個選項:Disable、CMSIS_V1和CMSIS_V2

STM32CubeIDE在stm32開發(fā)者起著最基礎(chǔ)的作用,在STM32CubeIDE中配置FreeRTOS中間層時需要選擇interface,其中有三個選項:Disable、CMSIS_V1和CMSIS_V2

CMSIS定義了通用工具接口,并提供一致的設(shè)備支持,那么CMSIS_V1和CMSIS_V2有什么區(qū)別呢,該怎選擇呢?

微控制器軟件接口標(biāo)準(zhǔn)CMSIS

CMSIS ARM官方定義如下:

Cortex微控制器軟件接口標(biāo)準(zhǔn)(CMSIS)是獨立于供應(yīng)商的硬件抽象層,用于基于Arm Cortex處理器的微控制器,并且CMSIS提供了到處理器和外圍設(shè)備,實時操作系統(tǒng)以及中間件組件的接口,可以說非常實用。

CMSIS軟件接口簡化了軟件重用,減少了開發(fā)周期,而且也不受限操作系統(tǒng)的類型,去耦。

不同之處

  • RTOS v1使得軟件能夠在不同的實時操作系統(tǒng)下運行(屏蔽不同RTOS提供的API的差別)

  • 而RTOS v2則是拓展了RTOS v1,兼容更多的CPU架構(gòu)和實時操作系統(tǒng)。

RTOS v1創(chuàng)建任務(wù)函數(shù)如下:

/*********************** Thread Management *****************************/
/**
* @brief  Create a thread and add it to Active Threads and set it to state READY.
* @param  thread_def    thread definition referenced with \ref osThread.
* @param  argument      pointer that is passed to the thread function as start argument.
* @retval thread ID for reference by other functions or NULL in case of error.
* @note   MUST REMAIN UNCHANGED: \b osThreadCreate shall be consistent in every CMSIS-RTOS.
*/
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
{
  TaskHandle_t handle; #if( configSUPPORT_STATIC_ALLOCATION == 1 ) &&  ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) if((thread_def->buffer != NULL) && (thread_def->controlblock != NULL)) {
    handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
              thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
              thread_def->buffer, thread_def->controlblock);
  } else { if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
              thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
              &handle) != pdPASS)  { return NULL;
    } 
  } #elif( configSUPPORT_STATIC_ALLOCATION == 1 ) handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
              thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
              thread_def->buffer, thread_def->controlblock); #else if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
                   thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
                   &handle) != pdPASS)  { return NULL;
  } #endif return handle;
}

RTOS v2創(chuàng)建任務(wù)函數(shù)如下:

osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) {
  const char *name;
  uint32_t stack;
  TaskHandle_t hTask;
  UBaseType_t prio;
  int32_t mem;

  hTask = NULL; if (!IS_IRQ() && (func != NULL)) {
    stack = configMINIMAL_STACK_SIZE;
    prio  = (UBaseType_t)osPriorityNormal;

    name = NULL;
    mem  = -1; if (attr != NULL) { if (attr->name != NULL) {
        name = attr->name;
      } if (attr->priority != osPriorityNone) {
        prio = (UBaseType_t)attr->priority;
      } if ((prio < osPriorityIdle) || (prio > osPriorityISR) || ((attr->attr_bits & osThreadJoinable) == osThreadJoinable)) { return (NULL);
      } if (attr->stack_size > 0U) {
        /* In FreeRTOS stack is not in bytes, but in sizeof(StackType_t) which is 4 on ARM ports.       */
        /* Stack size should be therefore 4 byte aligned in order to avoid division caused side effects */
        stack = attr->stack_size / sizeof(StackType_t);
      } if ((attr->cb_mem    != NULL) && (attr->cb_size    >= sizeof(StaticTask_t)) &&
          (attr->stack_mem != NULL) && (attr->stack_size >  0U)) {
        mem = 1;
      } else { if ((attr->cb_mem == NULL) && (attr->cb_size == 0U) && (attr->stack_mem == NULL)) {
          mem = 0;
        }
      }
    } else {
      mem = 0;
    } if (mem == 1) { #if (configSUPPORT_STATIC_ALLOCATION == 1) hTask = xTaskCreateStatic ((TaskFunction_t)func, name, stack, argument, prio, (StackType_t  *)attr->stack_mem,
                                                                                      (StaticTask_t *)attr->cb_mem); #endif } else { if (mem == 0) { #if (configSUPPORT_DYNAMIC_ALLOCATION == 1) if (xTaskCreate ((TaskFunction_t)func, name, (uint16_t)stack, argument, prio, &hTask) != pdPASS) {
            hTask = NULL;
          } #endif }
    }
  } return ((osThreadId_t)hTask);
}

正常V1夠用了,普通功能選V1,高級功能選擇V2:

我分別選擇CMSIS_V1和CMSIS_V2編譯了兩次進行對比,CMSIS_V2都要大一些。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開發(fā)領(lǐng)域,STM32CubeIDE憑借其高度集成的開發(fā)環(huán)境與HAL庫的抽象化設(shè)計,已成為STM32系列微控制器開發(fā)的主流工具。從基礎(chǔ)外設(shè)驅(qū)動到低功耗模式優(yōu)化,開發(fā)者需掌握從硬件抽象到能效管理的全鏈路技能。本文以S...

關(guān)鍵字: STM32CubeIDE HAL庫

在STM32平臺移植FreeRTOS時,任務(wù)調(diào)度崩潰是開發(fā)者最常遇到的挑戰(zhàn)。某自動駕駛項目曾因任務(wù)堆棧溢出導(dǎo)致雷達數(shù)據(jù)處理延遲,最終引發(fā)系統(tǒng)死機;另一工業(yè)控制案例中,錯誤的中斷優(yōu)先級配置使安全關(guān)鍵任務(wù)無法及時響應(yīng),造成設(shè)...

關(guān)鍵字: FreeRTOS STM32

FreeRTOS是一個實時操作系統(tǒng)(RTOS),專門為微控制器和小型微處理器設(shè)計。它為在資源受限的設(shè)備上開發(fā)需要精確定時和任務(wù)管理的應(yīng)用程序提供了可靠的基礎(chǔ)。

關(guān)鍵字: 傳感器 FreeRTOS ESP32S3

在實時操作系統(tǒng)(RTOS)中,任務(wù)優(yōu)先級反轉(zhuǎn)是一個常見的問題,它可能導(dǎo)致高優(yōu)先級任務(wù)被不必要地延遲,從而影響系統(tǒng)的實時性能。FreeRTOS作為一個廣泛使用的RTOS,也面臨著任務(wù)優(yōu)先級反轉(zhuǎn)的挑戰(zhàn)。本文將深入分析Free...

關(guān)鍵字: FreeRTOS 實時操作系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,F(xiàn)reeRTOS作為一款輕量級的實時操作系統(tǒng)(RTOS),以其高效的任務(wù)管理和靈活的調(diào)度策略贏得了廣泛的應(yīng)用。本文將深入探討FreeRTOS在單核與多核環(huán)境下的調(diào)度策略,并通過代碼示例展示其實現(xiàn)方式。

關(guān)鍵字: FreeRTOS 嵌入式系統(tǒng) 嵌入式開發(fā)

這次我成功將妹子約到了公司附近的咖啡館,繼續(xù)探討RTOS的heap的技術(shù)特點。當(dāng)我把準(zhǔn)備好的數(shù)據(jù)和動圖展示在她面前,她立馬激動起來了。

關(guān)鍵字: RTOS heap FreeRTOS
關(guān)閉