• 正文
    • 8位MCU也能跑RTOS
    • RTOS支持裁剪
    • 跑RTOS對MCU有什么要求?
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

跑RTOS對單片機(jī)有什么要求?

17小時前
205
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

微信公眾號 | strongerHuang

有初學(xué)的小伙伴問:跑RTOS系統(tǒng),對單片機(jī)有什么要求?

這是一個很寬泛的問題,目前市面上的RTOS大大小小有上百種,你要說對MCU最低要求的話,我覺得要求很低,目前市面上的MCU都能跑RTOS。

但是......

RTOS對MCU的要求越低,它實(shí)現(xiàn)的功能也越簡單,對應(yīng)的一些功能也會受到限制。

這里,對MCU的要求,通常主要指:MCU性能(主頻)和RAM、Flash資源大小。其他像外設(shè)、功耗、引腳數(shù)等這些都是次要的。

8位MCU也能跑RTOS

四十年前的8051也能跑RTOS,但8051的性能和RAM資源,你看看有多少?這種在8051上跑的RTOS,實(shí)現(xiàn)的功能很少,且跑了RTOS之后,應(yīng)用代碼(或者說任務(wù)數(shù))就會受到限制。

現(xiàn)在的 8 位MCU大部分的性能和資源相對都很高了,跑一些常規(guī)的 RTOS 問題不大。

在8位單片機(jī)上跑的RTOS其實(shí)有很多,感興趣的可以網(wǎng)上找找,這里分享一下之前的內(nèi)容:8位單片機(jī)輕松跑RTOS操作系統(tǒng)。

RTOS支持裁剪

什么是系統(tǒng)裁剪?系統(tǒng)裁剪簡單來說就是,把用到的系統(tǒng)組件留下,不用的裁掉(換句話說,需要什么系統(tǒng)資源才配置,不需要的就“屏蔽”),以此來節(jié)省了MCU資源。
大部分嵌入式系統(tǒng)都支持裁剪,包括Linux也是一樣的。市面上大部分的RTOS都有一個“裁剪文件”,通常是 xxOS + Config (系統(tǒng)配置)的文件。

比如:

    FreeRTOS 的 FreeRTOSConfig.h 文件ucos 的 os_cfg.h 文件......

而里面的配置,通常是宏定義開關(guān),比如 os_cfg.h 文件

#ifndef?OS_CFG_H#define?OS_CFG_H
/* --------------------------- MISCELLANEOUS --------------------------- */#define?OS_CFG_APP_HOOKS_EN ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) application specific hooks ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_ARG_CHK_EN ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) argument checking ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_CALLED_FROM_ISR_CHK_EN ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) check for called from ISR ? ? ? ? ? ? ? ? ? */#define?OS_CFG_DBG_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0u ? ? ? ? ??/* Enable (1) or Disable (0) debug code/variables ? ? ? ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_TICK_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Enable (1) or Disable (0) the kernel tick ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_DYN_TICK_EN ? ? ? ? ? ? ? ? ? ? ? ? 0u ? ? ? ? ??/* Enable (1) or Disable (0) the Dynamic Tick ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_INVALID_OS_CALLS_CHK_EN ? ? ? ? ? ? 1u ? ? ? ? ??/* Enable (1) or Disable (0) checks for invalid kernel calls ? ? ? ? ? ? */#define?OS_CFG_OBJ_TYPE_CHK_EN ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Enable (1) or Disable (0) object type checking ? ? ? ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_OBJ_CREATED_CHK_EN ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) object created checks ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_TS_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0u ? ? ? ? ??/* Enable (1) or Disable (0) time stamping ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */
#define?OS_CFG_PRIO_MAX ? ? ? ? ? ? ? ? ? ? ? ? ? 64u ? ? ? ? ??/* Defines the maximum number of task priorities (see OS_PRIO data type) */
#define?OS_CFG_SCHED_LOCK_TIME_MEAS_EN ? ? ? ? ? ? 0u ? ? ? ? ??/* Include code to measure scheduler lock time ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_SCHED_ROUND_ROBIN_EN ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Include code for Round-Robin scheduling ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */
#define?OS_CFG_STK_SIZE_MIN ? ? ? ? ? ? ? ? ? ? ? 64u ? ? ? ? ??/* Minimum allowable task stack size ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */

/* --------------------------- EVENT FLAGS ----------------------------- */#define?OS_CFG_FLAG_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Enable (1) or Disable (0) code generation for EVENT FLAGS ? ? ? ? ? ? */#define?OS_CFG_FLAG_DEL_EN ? ? ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* ? ? Include code for OSFlagDel() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_FLAG_MODE_CLR_EN ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* ? ? Include code for Wait on Clear EVENT FLAGS ? ? ? ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_FLAG_PEND_ABORT_EN ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* ? ? Include code for OSFlagPendAbort() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/

/* ------------------------ MEMORY MANAGEMENT ------------------------- ?*/#define?OS_CFG_MEM_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) code generation for the MEMORY MANAGER ? ? ?*/

/* ------------------- MUTUAL EXCLUSION SEMAPHORES -------------------- ?*/#define?OS_CFG_MUTEX_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) code generation for MUTEX ? ? ? ? ? ? ? ? ? */#define?OS_CFG_MUTEX_DEL_EN ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* ? ? Include code for OSMutexDel() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_MUTEX_PEND_ABORT_EN ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* ? ? Include code for OSMutexPendAbort() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */

/* -------------------------- MESSAGE QUEUES -------------------------- ?*/#define?OS_CFG_Q_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) code generation for QUEUES ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_Q_DEL_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* ? ? Include code for OSQDel() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_Q_FLUSH_EN ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* ? ? Include code for OSQFlush() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_Q_PEND_ABORT_EN ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* ? ? Include code for OSQPendAbort() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */

/* ---------------------------- SEMAPHORES ----------------------------- */#define?OS_CFG_SEM_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) code generation for SEMAPHORES ? ? ? ? ? ? ?*/#define?OS_CFG_SEM_DEL_EN ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* ? ? Include code for OSSemDel() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_SEM_PEND_ABORT_EN ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* ? ? Include code for OSSemPendAbort() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_SEM_SET_EN ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* ? ? Include code for OSSemSet() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */

/* -------------------------- TASK MANAGEMENT -------------------------- */#define?OS_CFG_STAT_TASK_EN ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) the statistics task ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_STAT_TASK_STK_CHK_EN ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* ? ? Check task stacks from the statistic task ? ? ? ? ? ? ? ? ? ? ? ? */
#define?OS_CFG_TASK_CHANGE_PRIO_EN ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Include code for OSTaskChangePrio() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_TASK_DEL_EN ? ? ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Include code for OSTaskDel() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_TASK_IDLE_EN ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Include the idle task ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_TASK_PROFILE_EN ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Include variables in OS_TCB for profiling ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_TASK_Q_EN ? ? ? ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Include code for OSTaskQXXXX() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_TASK_Q_PEND_ABORT_EN ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Include code for OSTaskQPendAbort() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_TASK_REG_TBL_SIZE ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Number of task specific registers ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */
#define?OS_CFG_TASK_STK_REDZONE_EN ? ? ? ? ? ? ? ? 0u ? ? ? ? ??/* Enable (1) or Disable (0) stack redzone ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_TASK_STK_REDZONE_DEPTH ? ? ? ? ? ? ?8u ? ? ? ? ??/* Depth of the stack redzone ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/
#define?OS_CFG_TASK_SEM_PEND_ABORT_EN ? ? ? ? ? ? ?1u ? ? ? ? ??/* Include code for OSTaskSemPendAbort() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */#define?OS_CFG_TASK_SUSPEND_EN ? ? ? ? ? ? ? ? ? ? 1u ? ? ? ? ??/* Include code for OSTaskSuspend() and OSTaskResume() ? ? ? ? ? ? ? ? ? */

/* ------------------ TASK LOCAL STORAGE MANAGEMENT ------------------- ?*/#define?OS_CFG_TLS_TBL_SIZE ? ? ? ? ? ? ? ? ? ? ? ?0u ? ? ? ? ??/* Include code for Task Local Storage (TLS) registers ? ? ? ? ? ? ? ? ? */

/* ------------------------- TIME MANAGEMENT -------------------------- ?*/#define?OS_CFG_TIME_DLY_HMSM_EN ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Include code for OSTimeDlyHMSM() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_TIME_DLY_RESUME_EN ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Include code for OSTimeDlyResume() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/

/* ------------------------- TIMER MANAGEMENT -------------------------- */#define?OS_CFG_TMR_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) code generation for TIMERS ? ? ? ? ? ? ? ? ?*/#define?OS_CFG_TMR_DEL_EN ? ? ? ? ? ? ? ? ? ? ? ? ?1u ? ? ? ? ??/* Enable (1) or Disable (0) code generation for OSTmrDel() ? ? ? ? ? ? ?*/

/* ------------------------- TRACE RECORDER ---------------------------- */#define?OS_CFG_TRACE_EN ? ? ? ? ? ? ? ? ? ? ? ? ? ?0u ? ? ? ? ??/* Enable (1) or Disable (0) uC/OS-III Trace instrumentation ? ? ? ? ? ? */#define?OS_CFG_TRACE_API_ENTER_EN ? ? ? ? ? ? ? ? ?0u ? ? ? ? ??/* Enable (1) or Disable (0) uC/OS-III Trace API enter instrumentation ? */#define?OS_CFG_TRACE_API_EXIT_EN ? ? ? ? ? ? ? ? ? 0u ? ? ? ? ??/* Enable (1) or Disable (0) uC/OS-III Trace API exit ?instrumentation ? */
#endif

所以,通過系統(tǒng)裁剪,RTOS可以支持很少資源的MCU。

其實(shí),很多RTOS在宣傳頁面都會有類似的宣傳:系統(tǒng)最小可以支持1K RAM、8K ROM的MCU等。

其實(shí)不止RTOS這類系統(tǒng)可以裁剪,很多嵌入式的模塊都支持裁剪,比如GUI、協(xié)議棧等。

跑RTOS對MCU有什么要求?

回頭來看,你覺得跑RTOS對MCU有什么要求?

絕大部分RTOS都支持裁剪,MCU性能和資源不充足的情況下,可以裁剪只保留主要的功能。

性能和資源豐富的MCU,可以運(yùn)行RTOS自帶的各種組件,也就是實(shí)現(xiàn)的功能更豐富。

當(dāng)然,不同RTOS的內(nèi)核源碼不同,裁剪的力度也不同,最低能支持多少,還要看RTOS本身的情況。

但是,就單純的說跑RTOS,對MCU的要求,可以說很低很低。

最后,你跑過RTOS,最低的MCU的資源是多少?歡迎大家留言討論。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

作者黃工,從事嵌入式軟件開發(fā)工作8年有余,高級嵌入式軟件工程師,業(yè)余維護(hù)公眾號『strongerHuang』,分享嵌入式軟硬件、單片機(jī)、物聯(lián)網(wǎng)等內(nèi)容。