当前位置:首页 > > 嵌入式云IOT技术圈
[导读]前阵子开源了一个基于TencentOS tiny物联网操作系统的危险气体探测仪项目,截止目前在Gitee上斩获了24个Star以及8个Fork,该项目也成功被Gitee官方推荐为优质开源项目。

1、问题引出

前阵子开源了一个基于TencentOS tiny物联网操作系统的危险气体探测仪项目,截止目前在Gitee上斩获了24个Star以及8个Fork,该项目也成功被Gitee官方推荐为优质开源项目。

分享的文章如下:

TencentOS tiny危险气体探测仪产品级开发重磅高质量更新

前两天还发了一篇LCD显示曲线的文章,我也把曲线显示这个功能加到这个开源项目进来了,看如下效果:

让传感器数据更直观之LCD曲线显示

但是有个问题,这个项目编译完的信息如下:

这里我们又要来唠一唠之前讲过的基础知识,加强大家的印象:

  • Code:表示程序代码部分
  • RO-Data:表示程序定义的所有常量以及const型数据
  • RW-Data:表示已经初始化的所有静态变量,变量有初值
  • ZI-Data:表示未初始化的所有静态变量,变量无初值

关于MCU ROM和RAM的计算规则如下:

  • ROM(FLASH) Size = Code + RO-Data + RW-Data
  • RAM Size = RW-Data + ZI-Data

我们再来看看这款MCU手册的描述:


由此可见,如果我们再往下继续添加代码的话,很快资源就不够了,但是我还是想继续往下添加更多功能呀,怎么办??如何优化?

2、问题解决

要解决这个问题,就很有必要来瞧瞧xxx.map文件了,我们找到这个MDK-ARM编译目录下的main.map文件:

打开这个文件,然后滑到最底下可以看到如下信息:

通过这个信息,我们可以详细了解我们MCU的资源使用情况,也能基于这个资源使用情况继续评估项目往下做的可行性;然后我们继续从底下往上滑,可以看到这个文件代码占用资源的详细情况:


根据刚刚的编译信息,很显然,RO-Data的占用比较多,那我们就来分析一下这个部分是哪些文件占得比较多,我们就针对这个来进行优化,裁剪一些不必要的功能,最直接有效的方法,我们看到Image component sizes 如下:

cc936.c这个文件包含了对中文支持的一些处理和转换函数,该文件位于fatfs组件的option目录下,我们打开来看一下:

原来最大的罪魁祸首就是它!

接下来我们把这个数组屏蔽掉,然后将用到它的地方做注释并修改以下转换函数ff_convert如下:

WCHAR ff_convert ( /* Converted code, 0 means conversion error */
 WCHAR chr, /* Character code to be converted */
 UINT dir  /* 0: Unicode to OEM code, 1: OEM code to Unicode */
)
{
 #if 0
 const WCHAR *p;
 WCHAR c;
 int i, n, li, hi;


 if (chr < 0x80) { /* ASCII */
  c = chr;
 } else {
  if (dir) {  /* OEM code to unicode */
   p = oem2uni;
   hi = sizeof oem2uni / 4 - 1;
  } else {  /* Unicode to OEM code */
   p = uni2oem;
   hi = sizeof uni2oem / 4 - 1;
  }
  li = 0;
  for (n = 16; n; n--) {
   i = li + (hi - li) / 2;
   if (chr == p[i * 2]) break;
   if (chr > p[i * 2])
    li = i;
   else
    hi = i;
  }
  c = n ? p[i * 2 + 1] : 0;
 }
 #endif
 /*重新改下这个函数*/
 WCHAR c;
 if (chr < 0x80) { /* ASCII */
  c = chr;
 }
 return c;
}

这样的话就把中文处理的这款逻辑给去掉了,我们再对工程编译一下:

这时候可以发现ROM只有不到84KB的大小,成功实现了优化,并且软件可以正常运行,不受影响。

针对RAM的优化方法,和ROM方法一样的分析方法,我们最终发现RAM占用得比较多地方是:tos_global.c这个文件,如下:

这个文件主要定义了一些和TencentOS tiny内核相关的一些核心变量,最终发现RAM占用其实依赖于tos_config.h里的一些配置选项,我们可以根据项目需求动态调整是否需要支持一些OS提供的组件,还可以修改堆栈大小,忽然发现我之前配置的0x8000有点大,所以给它改成了0x4000,然后把一些不必要的模块裁剪掉,最后裁剪结果如下:

#ifndef _TOS_CONFIG_H_
#define  _TOS_CONFIG_H_

#include "stm32l4xx_hal.h" // 目标芯片头文件,用户需要根据情况更改

#define TOS_CFG_TASK_PRIO_MAX           10u  // 配置TencentOS tiny默认支持的最大优先级数量

#define TOS_CFG_ROUND_ROBIN_EN          1u  // 配置TencentOS tiny的内核是否开启时间片轮转

#define TOS_CFG_OBJECT_VERIFY_EN           1u // 配置TencentOS tiny是否校验指针合法

#define TOS_CFG_TASK_DYNAMIC_CREATE_EN  1u  // TencentOS tiny 动态任务创建功能宏

#define TOS_CFG_EVENT_EN                1u  // TencentOS tiny 事件模块功能宏

#define TOS_CFG_MMBLK_EN                1u  //配置TencentOS tiny是否开启内存块管理模块

#define TOS_CFG_MMHEAP_EN               1u  //配置TencentOS tiny是否开启动态内存模块

#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN  1u  // TencentOS tiny 默认动态内存池功能宏

#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE        0x4000 // 配置TencentOS tiny默认动态内存池大小

#define TOS_CFG_MUTEX_EN                1u  // 配置TencentOS tiny是否开启互斥锁模块

#define TOS_CFG_MESSAGE_QUEUE_EN        0u  // 配置TencentOS tiny是否开启消息队列模块

#define TOS_CFG_MAIL_QUEUE_EN           0u  // 配置TencentOS tiny是否开启消息邮箱模块

#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 0u // 配置TencentOS tiny是否开启优先级消息队列模块

#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN 0u  // 配置TencentOS tiny是否开启优先级消息邮箱模块

#define TOS_CFG_TIMER_EN                0u  // 配置TencentOS tiny是否开启软件定时器模块

#define TOS_CFG_PWR_MGR_EN              0u  // 配置TencentOS tiny是否开启外设电源管理模块

#define TOS_CFG_TICKLESS_EN             0u  // 配置Tickless 低功耗模块开关

#define TOS_CFG_SEM_EN                  1u  // 配置TencentOS tiny是否开启信号量模块

#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN      1u // 配置TencentOS tiny是否开启任务栈深度检测

#define TOS_CFG_FAULT_BACKTRACE_EN      0u  // 配置TencentOS tiny是否开启异常栈回溯功能

#define TOS_CFG_IDLE_TASK_STK_SIZE      64u // 配置TencentOS tiny空闲任务栈大小

#define TOS_CFG_CPU_TICK_PER_SECOND     1000u // 配置TencentOS tiny的tick频率

#define TOS_CFG_CPU_CLOCK               (SystemCoreClock) // 配置TencentOS tiny CPU频率

#define TOS_CFG_TIMER_AS_PROC           1u  // 配置是否将TIMER配置成函数模式

#endif

然后我们继续编译,然后看map文件,看看RAM是否变小了:

在此我们可以发现经过裁剪优化后,确实达到了效果;这样我们就可以继续往下添加新的功能了!

这种分析和优化方法也是我工作乃至平时做项目的时候最常用的一种手段,当然还有其它更好的辅助手段,也希望小伙伴们积极分享,大家一起共同学习、共同成长!


本节代码已同步到码云的代码仓库中,获取方法如下:

1、新建一个文件夹

2、使用git clone远程获取例程存放的代码仓库

项目开源仓库:

https://gitee.com/morixinguan/tencent-os-tiny-hazardous-gas-detector


我还将之前做的一些项目以及练习例程在近期内全部上传完毕,与大家一起分享交流:

公众号粉丝福利时刻

这里我给大家申请到了福利,本公众号读者购买小熊派开发板可享受9折优惠,有需要购买小熊派以及腾讯物联网开发板的朋友,淘宝搜索即可,跟客服说你是公众号:嵌入式云IOT技术圈 的粉丝,立享9折优惠!

往期精彩

让传感器数据更直观之LCD曲线显示

嵌入式软件解决ADC电量显示问题经验分享

有关版本等信息的重要性(以STM32产品开发为例)

STM32硬核DIY机械键盘|蓝牙USB双模|灯控

觉得本次分享的文章对您有帮助,随手点[在看]并转发分享,也是对我的支持。

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭