找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2781|回复: 6
收起左侧

为什么这个单片机程序会占用这么大RAM?

[复制链接]
ID:805132 发表于 2020-7-21 17:03 | 显示全部楼层 |阅读模式
程序如下,我使用的单片机有64字节RAM,这个程序却需要133字节RAM,求解是程序本身这么大还是在哪里出了问题?
2.png
  1. #include <reg51.h>
  2. #include "intrins.h"
  3. #define unchar unsigned char
  4. #define unint unsigned int
  5. #define White 0xFFFFFF  
  6. #define Black 0x000000  
  7. #define Red 0x00fe00  
  8. #define Blue 0x0000fe  
  9. #define Green 0xfe0000  
  10. #define nWs 20
  11. #define NOP()_nop_;
  12. unsigned long idata WsDat[nWs];
  13. unint Mod;
  14. sbit Din = P2^3;   
  15. sbit key = P2^0;

  16. void delay(unint z)  //1ms
  17. {
  18.         unchar a,b;
  19.         while(z--)
  20.         for(b=118;b>0;b--)
  21.         for(a=18;a>0;a--)
  22.         ;
  23. }
  24. void h_dat0()
  25. {
  26.         Din = 1;_nop_;              
  27.         Din = 0;_nop_;_nop_; _nop_;                                                               
  28. }

  29. void h_dat1()
  30. {
  31.         Din = 1;_nop_;_nop_;_nop_;                                                                                                      
  32.         Din = 0;_nop_;               
  33. }

  34. void Reset(void)
  35. {
  36.   Din = 0;
  37.   delay(1);      
  38. }

  39. //发送一个字节
  40. void Send_Data(unsigned long LED_DAT)
  41. {
  42.         unsigned char t;
  43.         
  44.         for(t=0;t<24;t++)
  45.         {
  46.                 if(0x800000 == (LED_DAT & 0x800000) )
  47.                 {
  48.                 h_dat1();
  49.                 }
  50.                 else
  51.                 {
  52.                 h_dat0();
  53.                 }
  54.                 LED_DAT<<=1;
  55.         }
  56. }
  57. //发送所有字节
  58. void WS_SetAll()
  59. {
  60.         unsigned char j;
  61.         
  62.          for(j=0;j<nWs;j++)
  63.         {
  64.                 Send_Data(WsDat[j]);
  65.         }
  66.         Reset();
  67. }

  68. //求绝对值
  69. unsigned char abs0(int num)
  70. {
  71.         if(num<0)
  72.            num = -num;
  73.         return (unsigned char) num;
  74. }
  75. //颜色渐变算法
  76. unsigned long ColorToColor(unsigned long color0, unsigned long color1)
  77. {
  78.         unsigned char  Red0, Green0, Blue0;  
  79.         unsigned char  Red1, Green1, Blue1;  
  80.         int                          RedMinus, GreenMinus, BlueMinus;        
  81.         unsigned char  NStep;                                                         
  82.         float                  RedStep, GreenStep, BlueStep;               
  83.         unsigned long  color;                                                        
  84.         unsigned char i;
  85.         

  86.         Red0   = color0>>8;
  87.         Green0 = color0>>16;
  88.         Blue0  = color0;
  89.         
  90.         Red1   = color1>>8;
  91.         Green1 = color1>>16;
  92.         Blue1  = color1;
  93.         
  94.         RedMinus   = Red1 - Red0;
  95.         GreenMinus = Green1 - Green0;
  96.         BlueMinus  = Blue1 - Blue0;
  97.         
  98.         if( abs0(RedMinus) > abs0(GreenMinus) )
  99.                 NStep=abs0(RedMinus);
  100.         else
  101.                 NStep=abs0(GreenMinus);
  102.         if( NStep < abs0(BlueMinus) )
  103.                 NStep=abs0(BlueMinus);
  104.         
  105.         RedStep   = (float)RedMinus   / NStep;
  106.         GreenStep = (float)GreenMinus / NStep;
  107.         BlueStep  = (float)BlueMinus  / NStep;
  108.         
  109.         for(i=0;i<NStep;i++)
  110.         {
  111.                 Red1   = Red0   + (int)(RedStep   * i);
  112.                 Green1 = Green0 + (int)(GreenStep * i);
  113.                 Blue1  = Blue0  + (int)(BlueStep  * i);
  114.                
  115.                 color  = (((unsigned long)Green1<<16)&0XFF0000) | ((Red1<<8)&0XFF00) | Blue1&0XFF;        
  116.                 WsDat[i] = color;
  117.                 WS_SetAll();                                
  118.                 delay(20);                                                
  119.         }

  120.         
  121.         return color;
  122. }


  123. void main()
  124. {   

  125.         while(1)
  126.         {
  127.         
  128.         ColorToColor(Red,Green);
  129.         }
  130.                         
  131. }
复制代码



回复

使用道具 举报

ID:452950 发表于 2020-7-21 22:40 | 显示全部楼层
#define nWs 20
unsigned long idata WsDat[nWs];
你看嘛,一个long是4字节,这里有20个就80字节了
回复

使用道具 举报

ID:401564 发表于 2020-7-22 00:53 | 显示全部楼层
数据太大了
White 0xFFFFFF,这可是一个24位的数据,参与运算的话,就要用一个32位就是4个字节的空间
尽量使用占用空间小的数据类型
回复

使用道具 举报

ID:478073 发表于 2020-7-22 08:23 | 显示全部楼层
回复

使用道具 举报

ID:298123 发表于 2020-7-22 11:15 | 显示全部楼层
unsigned long idata WsDat[nWs];
回复

使用道具 举报

ID:805132 发表于 2020-7-22 14:31 | 显示全部楼层
懂了,long变量占用太多字节
回复

使用道具 举报

ID:808700 发表于 2020-7-28 16:53 | 显示全部楼层
你设的都是长整形啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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