加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 8位MCU也能跑RTOS
    • RTOS支持裁剪
    • 跑RTOS对MCU有什么要求?
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

跑RTOS对MCU有什么要求?

12/09 11:15
519
阅读需 18 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

微信公众号 | strongerHuang

有小伙伴大概问了这样的问题:跑RTOS系统,对MCU有什么要求?

这是一个很宽泛的问题,目前市面上的RTOS大大小小有上百种,你要说对MCU最低要求的话,我觉得要求很低,目前市面上的MCU都能跑RTOS。

但是......

RTOS对MCU的要求越低,其实现的功能也越简单,对应的一些功能也会受到限制。

这里,对MCU的要求,通常主要指:MCU性能(主频)和RAM、Flash资源大小。其他像外设、功耗、引脚数等这些都是次要的。

8位MCU也能跑RTOS

四十年前的8051也能跑RTOS,但8051的性能和RAM资源,你看看有多少?这种在8051上跑的RTOS,实现的功能很少,且跑了RTOS之后,应用代码(或者说任务数)就会受到限制。

现在的 8 位MCU大部分的性能和资源相对都很高了,跑一些常规的 RTOS 问题不大。

在8位单片机上跑的RTOS其实有很多,感兴趣的可以网上找找,这里分享一下之前的内容:8位单片机轻松跑RTOS操作系统

RTOS支持裁剪

什么是系统裁剪?

系统裁剪简单来说就是,把用到的系统组件留下,不用的裁掉(换句话说,需要什么系统资源才配置,不需要的就“屏蔽”),以此来节省了MCU资源。
大部分嵌入式系统都支持裁剪,包括Linux也是一样的。市面上大部分的RTOS都有一个“裁剪文件”,通常是 xxOS + Config (系统配置)的文件。
比如:

    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

所以,通过系统裁剪,RTOS可以支持很少资源的MCU。

其实,很多RTOS在宣传页面都会有类似的宣传:系统最小可以支持1K RAM、8K ROM的MCU等。

其实不止RTOS这类系统可以裁剪,很多嵌入式的模块都支持裁剪,比如GUI、协议栈等。

跑RTOS对MCU有什么要求?

回头来看,你觉得跑RTOS对MCU有什么要求?

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

性能和资源丰富的MCU,可以运行RTOS自带的各种组件,也就是实现的功能更丰富。

当然,不同RTOS的内核源码不同,裁剪的力度也不同,最低能支持多少,还要看RTOS本身的情况。

但是,就单纯的说跑RTOS,对MCU的要求,可以说很低很低。

最后,你跑过RTOS,最低的MCU的资源是多少?欢迎大家留言讨论。

相关推荐

电子产业图谱

作者黄工,从事嵌入式软件开发工作8年有余,高级嵌入式软件工程师,业余维护公众号『strongerHuang』,分享嵌入式软硬件、单片机、物联网等内容。