打印
[其他产品]

MCU而言代码密度个人的解决办法

[复制链接]
1485|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
meiyaolei|  楼主 | 2023-9-7 21:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
周对于内存受限的MCU而言代码密度非常重要。同样功能的程序如果代码密度过大,就可能导致因ROM空间装载不下而无法使用。你是否有遇到代码密度的难题?你如何来优化这一难题?(欢迎大家分享自己的开发经验或针对该问题进行分析)


我遇到以上的问题是通过以下来解决这个问题的几种方法:

常规的代码审阅和语句优化:
       我会详细的对代码审查,找出任何可以优化更改的地方。包括那些需要删除的未使用的代码、和减少变量的数量、用一些有效的算法替换复杂的算法。
使用更低级别的编程语言:
       利用有些MCU支持C或汇编语言进行汇编语言通常比高级语言(如C++)更简洁,所以个人会考虑使用汇编语言。或者在选择数据结构和算法时,选择适当的数据结构和算法来减少代码大小等。
利用对应的编译器的优化功能:
       编译器优化是为了提高程序性能,通过调整编译过程一 些参数和选项,使生成的机器代码更加高效和优化。从面实现优化代码大小,目的就是在不影响程序的功能和性能情况下,尽可能减小生成的代码大小。需要注意的是,虽然优化代码大小可以提高程序的性能,但过度优化可能会导致代码难以理解和维护,在选择编译器优化选项时,要根据具体情况进行权衡,一般我是不会这样做的,免的带来不必要的麻烦。
避免动态内存分配:
        动态内存分配可能会消耗大量的内存,所以我不怎么用它。
尽量的使用硬件定时功能:
        设备支持硬件定时器,我一会会使用硬件定时器,来减少MCU的使用。
利用中断和代码分割:
        空闲状态时,我会使用中断来执行周期性的任务;程序在设备上装载和运行某小块区,可以避免因代码过大而无法装载的问题。
以上是我个人的一点对这些东西的理解,或者不同的人有不同的理解,和遇到的难点,欢迎评论难点。




使用特权

评论回复
沙发
地瓜patch| | 2023-9-7 22:16 | 只看该作者
现在flash这么大,基本不考虑密度的问题了

使用特权

评论回复
板凳
xinxianshi| | 2023-9-8 08:52 | 只看该作者
上古时候考虑的事情。

使用特权

评论回复
地板
forgot| | 2023-9-8 09:08 | 只看该作者
在小RAM的MCU上确实应该避免动态内存分配,我以前吃过亏的

使用特权

评论回复
5
coody| | 2023-9-8 10:55 | 只看该作者
什么叫“代码密度”?  我从90年代开始用单片机,今年刚好30年了,但是还是不懂什么是代码密度。

使用特权

评论回复
6
William1994| | 2023-9-8 12:19 | 只看该作者
c的代码密度高于汇编。
陆陆续续做了三年左右的汇编,后来用c重做了一下几个大的项目。基本上c编译出来的hex都比汇编的要小很多。
特别通用子函数功能,两个函数转换成二进制之后,有十五六个连续字节是一样的,编译器会给你抽成个子函数。写汇编的人基本做不到。
还有大量的变量分配的复用算法。A函数不调用B函数的实话,他们的变量可以分配在一个地址,而如果B又调用了C,A也调用了C,哪天突然改了一下A调用了B... ... c语言都是瞬间编译出来最佳位置,而汇编要在A1纸上规划半天。
还有就是c默认的库函数的效率,基本手写汇编达不到那个效果。比如 减去128这个运算,编译器会生成为和128进行异或。比如有符号数比较大小,编译器会改为异或最高位后无符号比较大小,比如两个变量的交换,比如各种窥孔优化。

使用特权

评论回复
评论
meeagle 2023-10-16 08:37 回复TA
有没有一种可能,你在写汇编的时候是按C的逻辑思维去写的,写完后编译器却**了没给你优化? 
7
ayb_ice| | 2023-9-8 13:11 | 只看该作者
好的程序框架最管用

使用特权

评论回复
8
eydj2008| | 2023-9-9 10:28 | 只看该作者
RAM 感觉不够用了,因为现在上C++ 上RTOS,FLASH 还是够的。

使用特权

评论回复
9
单片小菜| | 2023-9-9 11:04 | 只看该作者
代码的连续性还是i需要的。

使用特权

评论回复
10
单片小菜| | 2023-9-9 11:04 | 只看该作者
forgot 发表于 2023-9-8 09:08
在小RAM的MCU上确实应该避免动态内存分配,我以前吃过亏的

是的

使用特权

评论回复
11
前功尽弃| | 2023-9-12 13:12 | 只看该作者
ayb_ice 发表于 2023-9-8 13:11
好的程序框架最管用

正解

使用特权

评论回复
12
tpgf| | 2023-10-12 09:20 | 只看该作者
决定代码密度的最关键的因素还是单片机,包括其架构和指令集多少

使用特权

评论回复
13
qcliu| | 2023-10-12 10:13 | 只看该作者
编译器依据单片机的架构指令集等来工作的,故相互比较之后都说某某单片机代码密度高,某某的低

使用特权

评论回复
14
coshi| | 2023-10-12 10:31 | 只看该作者
指令集是代码密度最根本的决定性因素,它决定了一个操作在最优的情况下需要编译成多少位宽的编码

使用特权

评论回复
15
wiba| | 2023-10-12 10:59 | 只看该作者
编译器的使用方法,比如GCC,除了添加-Os之外,还可以添加-ffunction-sections -fdata-sections -Wl,--gc-sections来删除没有用到的函数

使用特权

评论回复
16
kxsi| | 2023-10-12 21:21 | 只看该作者
很多体系结构比如ARM、RISC-V、C-SKY都是16位指令、32位指令混编的,同样的一条指令,如果能够被编译成16位指令,那么它显然比编译成32位指令占用更小的空间

使用特权

评论回复
17
drer| | 2023-10-12 21:59 | 只看该作者
代码密度主要由指令集、ABI、编译器、Runtime库、程序代码五个部分决定

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

163

主题

652

帖子

3

粉丝