当前位置:首页 > 公众号精选 > 嵌入式云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获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

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

虽然嵌入式芯片架构市场上有明确的引领者,但该行业正在快速扩张,预计未来几年将出现许多新的机会。当然,在这样的热门行业中,永远有创新技术和新产品的一席之地。

关键字: 嵌入式 处理器 RISC-V

业内消息,近日马斯克旗下 AI 初创企业 xAI 发布新闻稿,宣布正在开源 3140 亿参数的混合专家模型 Grok-1,该模型遵循 Apache 2.0 协议开放模型权重和架构,号称是“迄今为止全球参数量最大的开源大语...

关键字: 马斯克 大模型 开源 OpenAI ChatGPT xAI Grok-1 Grok

2024年3月8日 – 专注于引入新品的全球电子元器件和工业自动化产品授权代理商贸泽电子 (Mouser Electronics) 即日起供货Advantech的VEGA-P110 PCIe Intel® Arc A37...

关键字: 嵌入式 GPU卡 边缘AI

康佳特采用博世力士乐的 ctrlX OS 操作系统

关键字: 计算机模块 嵌入式 机器人

先楫新一代的仪表显示产品具有高画质、低功耗等特点。

关键字: 嵌入式 GPU 图形处理器

在这篇文章中,小编将为大家带来嵌入式开发的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 嵌入式 嵌入式开发

以下内容中,小编将对嵌入式开发的相关内容进行着重介绍和阐述,希望本文能帮您增进对嵌入式开发的了解,和小编一起来看看吧。

关键字: 嵌入式 嵌入式开发 嵌入式系统

本文中,小编将对嵌入式开发予以介绍,如果你想对它的详细情况有所认识,或者想要增进对嵌入式的了解程度,不妨请看以下内容哦。

关键字: 嵌入式 嵌入式开发

在这篇文章中,小编将为大家带来嵌入式开发的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 嵌入式 嵌入式开发
关闭
关闭