zoukankan      html  css  js  c++  java
  • 单片机爬坑记-02-资源紧缺

    当下FreeRTOS得到了Keil、STM32Cube MX等开发环境的大力支持,很大程度上无需再考虑移植等底层问题,简单设置后在代码中直接调用即可。

    不得不说,这是激动人心的,RTOS的各项特性所带来的方便给予我们极大的诱惑,总觉得只要用好RTOS,我们能把单片机玩出各种花样,再也不用考虑什么全局变量、轮循顺序、执行时长等恼人的问题,只要设置好优先级、信号量和任务参数,剩下的就可以安心于用代码实现功能。

    现实总是残酷帅毙的!Keil中一堆“……axf: Error: L6406E: No space in execution regions with .ANY selector matching……”错误,能轻易的将人从“安心于用代码实现功能”的美好幻想中拖到现实。

    以Keil环境下,NuTiny-SDK-M051开发板为例,芯片是NuMicro M0516LDN,内核Cortex-M0,片上资源为主频50MHz、Flash 64KB、RAM 4KB,Flash空间地址为0x0000_0000~0x000_FFFF,RAM空间地址为0x2000_0000~0x2000_0FFF(养成查看映射地址的好习惯,IDE环境中常能用上)。

    实际对比Keil环境中NONOS(不用RTOS)、freeRTOS、CMSIS-RTOS(Keil RTX)、CMSIS-RTOS2(Keil RTX5)几种方式下资源占用情况(在各RTOS种启动一个任务,该任务重复执行一条UART输出):

    NONOS:
    Program Size: Code=2672 RO-data=344 RW-data=76 ZI-data=812 
    freeRTOS:
    Program Size: Code=7024 RO-data=344 RW-data=124 ZI-data=4948
    CMSIS-RTOS(Keil RTX):
    Program Size: Code=7268 RO-data=456 RW-data=68 ZI-data=2932
    CMSIS-RTOS2(Keil RTX5):
    Program Size: Code=6264 RO-data=560 RW-data=5128 ZI-data=608

    //稍作解释:Code是代码占用的空间;RO-data是 Read Only 只读常量的大小,如const型;RW-data是(Read Write) 初始化了的可读写变量的大小;ZI-data是(Zero Initialize) 没有初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化

    //FLASH空间占用:(Code) + (RO Data) + (RW Data)

    //RAM空间占用:( RW Dat) + (ZI Dat)

    实际数值可以很容易的看出资源占用情况,当然我们也可以考虑通过对RTOS进行适当裁剪,来达到更小的FLASH和RAM空间占用——当然主要还是注重对RAM空间的占用,FLASH一般来说较为便宜且很容易外扩,不太容易先出现资源短缺的情况——但是很显然对于RAM 4KB的单片机而言,无论采用何种RTOS,片上资源总是吃紧,对于我们想要充分利用单片机外设资源的想法而言,调用RTOS难免导致kernel代码严重挤压功能代码的可用空间,得不偿失。

    ——————————————————————————————————————

    (两、三个小时之后...)闲逛中,顺手点开了VSCode,在PlatformIO的强大威力下,对esp8266(NodeMCU 0.9)的esp8266-NONOS-SDK和esp8266-RTOS-SDK俩例程重新编译了一下,关于代码量得到如下结果:

    NONOS:

    DATA: [=== ] 33.2% (used 27194 bytes from 81920 bytes)

    PROGRAM: [====== ] 60.0% (used 226009 bytes from 376832 bytes)

    RTOS:

    DATA: [==== ] 36.3% (used 29754 bytes from 81920 bytes)

    PROGRAM: [======= ] 73.9% (used 278664 bytes from 376832 bytes)

    ------printf("仿佛被囚禁的时间不知所措的变迁,仿佛未知的可能也已经被发现,迎着狂风手插口袋路过你走过的路,荒诞无稽的残酷也拦不住我的脚步…… "); printf("找过无数的理由试着包装我的残缺,而主动承认自己的懦弱却永远无法妥协…… ");------
  • 相关阅读:
    redis 基础知识
    vue + django 项目部署
    django 的静态资源
    uwsgi 与 supervisor
    django基础之orm(models)初识
    django基础之模板Template
    django基础知识之视图views
    django基础知识之django介绍及url
    django基础之Web框架介绍
    mysql之pymysql模块相关
  • 原文地址:https://www.cnblogs.com/zarlinq/p/10424389.html
Copyright © 2011-2022 走看看