搜索
bottom↓
回复: 19

c51数组定义时初始化很耗时,大神帮忙解读一下

[复制链接]

出0入0汤圆

发表于 2021-7-30 09:54:08 | 显示全部楼层 |阅读模式
void test(void)
{
        uint8_t tmp[100] = {0};

        tmp[0] = 1;
}
这个测试代码对应汇编如图:
实测耗时:

void test1(void)
{
    uint8_t i;
    uint8_t tmp[100];

    for (i = 0; i < 100; i++)
    {
        tmp[0] = 0;
    }
}

这个测试代码的汇编如图:

实测耗时如下:


结论:
    定义时初始化,耗时700多us是定义时不初始化,通过for循环初始化耗时(160us)的几倍。
    看汇编是因为定义时初始化,做了一系列的寄存器操作(看似无关),请大神指教一下,这个时候在干什么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入33汤圆

发表于 2021-7-30 10:10:22 | 显示全部楼层
C代码跟汇编代码看起来对不上,把优化关掉再看一下。

出1310入193汤圆

发表于 2021-7-30 10:11:19 | 显示全部楼层
  1. uint8_t tmp[100] = {0};
  2. void test(void)
  3. {
  4.         tmp[0] = 1;
  5. }
复制代码


不同的ide软件  会有不同的编译算法   一般是预编译的时候进行滴
如果很在意这160us   那么  编程风格  经验等等都需要慢慢去磨哦

出90入372汤圆

发表于 2021-7-30 10:12:41 | 显示全部楼层
如楼上所说,感觉和编译器设置有关,很明显你的第一个图片有PWM 和urat相关的指令,和你的C代码对不上

出0入0汤圆

 楼主| 发表于 2021-7-30 11:04:58 | 显示全部楼层


编译器关掉优化之后的汇编如图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2021-7-30 11:06:46 | 显示全部楼层
keshipt 发表于 2021-7-30 10:12
如楼上所说,感觉和编译器设置有关,很明显你的第一个图片有PWM 和urat相关的指令,和你的C代码对不上 ...

我上传了关掉优化的汇编,您看一下,我感觉优化只对for循环起了效果。char buf[100] = {0};这种方式,好像是初始化前先进行了现场保护,所以耗费了一些时间。

出110入26汤圆

发表于 2021-7-30 11:07:12 来自手机 | 显示全部楼层
我也发现这个问题,c51的变量在定义时初始化耗时更多,但没深究。目前都是在临时变量使用前赋初值。

出0入0汤圆

 楼主| 发表于 2021-7-30 11:07:30 | 显示全部楼层
lb0857 发表于 2021-7-30 10:11
不同的ide软件  会有不同的编译算法   一般是预编译的时候进行滴
如果很在意这160us   那么  编程风格   ...

不想把buf放到外面去,这样它就一直占着内存了

出0入16汤圆

发表于 2021-7-30 11:14:01 | 显示全部楼层
可以再对比下memset速度

出1310入193汤圆

发表于 2021-7-30 11:32:06 | 显示全部楼层
MegaHealth 发表于 2021-7-30 11:07
不想把buf放到外面去,这样它就一直占着内存了

有时候  砸门的想法和编译器有差异哦
buf不好到外面  有时候 还不是占用内存  
不同编译器不同环境有差异
真的很在乎  高效   汇编是很好的选择
只可惜 这门编程技术慢慢失传啦  等楼主发扬光大

出0入8汤圆

发表于 2021-7-30 11:36:46 | 显示全部楼层
51 data 才多少,你就要了100 Bytes

出90入372汤圆

发表于 2021-7-30 11:43:29 | 显示全部楼层
MegaHealth 发表于 2021-7-30 11:06
我上传了关掉优化的汇编,您看一下,我感觉优化只对for循环起了效果。char buf[100] = {0};这种方式,好 ...

在这个测试代码之前有没有开其他中断?

出0入0汤圆

 楼主| 发表于 2021-7-30 13:17:13 | 显示全部楼层
keshipt 发表于 2021-7-30 11:43
在这个测试代码之前有没有开其他中断?

timer中断是常开的

出0入0汤圆

 楼主| 发表于 2021-7-30 13:18:44 | 显示全部楼层
lindabell 发表于 2021-7-30 11:36
51 data 才多少,你就要了100 Bytes

用了外部的

出0入0汤圆

发表于 2021-7-30 13:51:56 | 显示全部楼层
第二个for循环并没有初始化数组

出90入372汤圆

发表于 2021-7-30 13:58:05 | 显示全部楼层
modbus 发表于 2021-7-30 13:51
第二个for循环并没有初始化数组

还真是,不注意看都没有发现,只初始化了 tmp[0] = 0;

出0入0汤圆

 楼主| 发表于 2021-7-30 14:31:40 | 显示全部楼层
modbus 发表于 2021-7-30 13:51
第二个for循环并没有初始化数组

大意了,所以优化的时候可能直接把for的循环优化掉了,不开优化之后两个时间接近

出0入0汤圆

发表于 2021-7-30 15:47:07 来自手机 | 显示全部楼层
uint8_t tmp[100] = {0};
看汇编似乎是把rom里面连续100个0拷贝到tmp里面了,因为我看到LCALL C?COPY的函数调用。

而用for循环就是直接向tmp所在地址填0

出0入0汤圆

发表于 2021-8-6 11:26:49 | 显示全部楼层
.A51里面有初始化RAM的代码,汇编的。精简得很,加载就好了。

出200入2554汤圆

发表于 2021-8-6 11:37:26 来自手机 | 显示全部楼层
看到 C?COPY 函数没,清理的寄存器是这个函数的参数
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 11:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表