最近有位小伙伴大概问了这样一个问题:跑RTOS系统,对MCU有什么要求?这是一个很宽泛的问题,目前市面上的RTOS大大小小有上百种,你要说对MCU最低要求的话,我觉得要求很低,目前市面上的MCU都能跑RTOS。RTOS对MCU的要求越低,其实现的功能也越简单,对应的一些功能也会受到限制。这里,对MCU的要求,通常主要指:MCU性能(主频)和RAM、Flash资源大小。其他像外设、功耗、引脚数等这些都是次要的。
四十年前的8051也能跑RTOS,但8051的性能和RAM资源,你看看有多少?这种在8051上跑的RTOS,实现的功能很少,且跑了RTOS之后,应用代码(或者说任务数)就会受到限制。
现在的 8 位MCU大部分的性能和资源相对都很高了,跑一些常规的 RTOS 问题不大。
什么是系统裁剪?
系统裁剪简单来说就是,把用到的系统组件留下,不用的裁掉(换句话说,需要什么系统资源才配置,不需要的就“屏蔽”),以此来节省了MCU资源。大部分嵌入式系统都支持裁剪,包括Linux也是一样的。市面上大部分的RTOS都有一个“裁剪文件”,通常是 xxOS + Config (系统配置)的文件。- FreeRTOS 的 FreeRTOSConfig.h 文件
而里面的配置,通常是宏定义开关,比如 os_cfg.h 文件:#ifndef OS_CFG_H
#define OS_CFG_H
#define OS_CFG_APP_HOOKS_EN 1u
#define OS_CFG_ARG_CHK_EN 1u
#define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u
#define OS_CFG_DBG_EN 0u
#define OS_CFG_TICK_EN 1u
#define OS_CFG_DYN_TICK_EN 0u
#define OS_CFG_INVALID_OS_CALLS_CHK_EN 1u
#define OS_CFG_OBJ_TYPE_CHK_EN 1u
#define OS_CFG_OBJ_CREATED_CHK_EN 1u
#define OS_CFG_TS_EN 0u
#define OS_CFG_PRIO_MAX 64u
#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u
#define OS_CFG_SCHED_ROUND_ROBIN_EN 1u
#define OS_CFG_STK_SIZE_MIN 64u
#define OS_CFG_FLAG_EN 1u
#define OS_CFG_FLAG_DEL_EN 1u
#define OS_CFG_FLAG_MODE_CLR_EN 1u
#define OS_CFG_FLAG_PEND_ABORT_EN 1u
#define OS_CFG_MEM_EN 1u
#define OS_CFG_MUTEX_EN 1u
#define OS_CFG_MUTEX_DEL_EN 1u
#define OS_CFG_MUTEX_PEND_ABORT_EN 1u
#define OS_CFG_Q_EN 1u
#define OS_CFG_Q_DEL_EN 1u
#define OS_CFG_Q_FLUSH_EN 1u
#define OS_CFG_Q_PEND_ABORT_EN 1u
#define OS_CFG_SEM_EN 1u
#define OS_CFG_SEM_DEL_EN 1u
#define OS_CFG_SEM_PEND_ABORT_EN 1u
#define OS_CFG_SEM_SET_EN 1u
#define OS_CFG_STAT_TASK_EN 1u
#define OS_CFG_STAT_TASK_STK_CHK_EN 1u
#define OS_CFG_TASK_CHANGE_PRIO_EN 1u
#define OS_CFG_TASK_DEL_EN 1u
#define OS_CFG_TASK_IDLE_EN 1u
#define OS_CFG_TASK_PROFILE_EN 1u
#define OS_CFG_TASK_Q_EN 1u
#define OS_CFG_TASK_Q_PEND_ABORT_EN 1u
#define OS_CFG_TASK_REG_TBL_SIZE 1u
#define OS_CFG_TASK_STK_REDZONE_EN 0u
#define OS_CFG_TASK_STK_REDZONE_DEPTH 8u
#define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u
#define OS_CFG_TASK_SUSPEND_EN 1u
#define OS_CFG_TLS_TBL_SIZE 0u
#define OS_CFG_TIME_DLY_HMSM_EN 1u
#define OS_CFG_TIME_DLY_RESUME_EN 1u
#define OS_CFG_TMR_EN 1u
#define OS_CFG_TMR_DEL_EN 1u
#define OS_CFG_TRACE_EN 0u
#define OS_CFG_TRACE_API_ENTER_EN 0u
#define OS_CFG_TRACE_API_EXIT_EN 0u
#endif
所以,通过系统裁剪,RTOS可以支持很少资源的MCU。其实,很多RTOS在宣传页面都会有类似的宣传:系统最小可以支持1K RAM、8K ROM的MCU等。其实不止RTOS这类系统可以裁剪,很多嵌入式的模块都支持裁剪,比如GUI、协议栈等。
回头来看,你觉得跑RTOS对MCU有什么要求?
绝大部分RTOS都支持裁剪,MCU性能和资源不充足的情况下,可以裁剪只保留主要的功能。性能和资源丰富的MCU,可以运行RTOS自带的各种组件,也就是实现的功能更丰富。当然,不同RTOS的内核源码不同,裁剪的力度也不同,最低能支持多少,还要看RTOS本身的情况。但是,就单纯的说跑RTOS,对MCU的要求,可以说很低很低。最后,你跑过RTOS,最低的MCU的资源是多少?欢迎大家留言讨论。