微信公眾號 | strongerHuang
有小伙伴大概問了這樣的問題:跑RTOS系統(tǒng),對MCU有什么要求?
這是一個很寬泛的問題,目前市面上的RTOS大大小小有上百種,你要說對MCU最低要求的話,我覺得要求很低,目前市面上的MCU都能跑RTOS。
但是......
RTOS對MCU的要求越低,其實現(xiàn)的功能也越簡單,對應的一些功能也會受到限制。
這里,對MCU的要求,通常主要指:MCU性能(主頻)和RAM、Flash資源大小。其他像外設、功耗、引腳數(shù)等這些都是次要的。
8位MCU也能跑RTOS
四十年前的8051也能跑RTOS,但8051的性能和RAM資源,你看看有多少?這種在8051上跑的RTOS,實現(xiàn)的功能很少,且跑了RTOS之后,應用代碼(或者說任務數(shù))就會受到限制。
現(xiàn)在的 8 位MCU大部分的性能和資源相對都很高了,跑一些常規(guī)的 RTOS 問題不大。
在8位單片機上跑的RTOS其實有很多,感興趣的可以網(wǎng)上找找,這里分享一下之前的內容:8位單片機輕松跑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 文件......
而里面的配置,通常是宏定義開關,比如?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。
其實,很多RTOS在宣傳頁面都會有類似的宣傳:系統(tǒng)最小可以支持1K RAM、8K ROM的MCU等。
其實不止RTOS這類系統(tǒng)可以裁剪,很多嵌入式的模塊都支持裁剪,比如GUI、協(xié)議棧等。
跑RTOS對MCU有什么要求?
回頭來看,你覺得跑RTOS對MCU有什么要求?
絕大部分RTOS都支持裁剪,MCU性能和資源不充足的情況下,可以裁剪只保留主要的功能。
性能和資源豐富的MCU,可以運行RTOS自帶的各種組件,也就是實現(xiàn)的功能更豐富。
當然,不同RTOS的內核源碼不同,裁剪的力度也不同,最低能支持多少,還要看RTOS本身的情況。
但是,就單純的說跑RTOS,對MCU的要求,可以說很低很低。
最后,你跑過RTOS,最低的MCU的資源是多少?歡迎大家留言討論。