【问题标题】:Pointers vs Global Variables in terms or RAM on a PIC [closed]PIC上的指针与全局变量或RAM [关闭]
【发布时间】:2016-03-17 17:55:08
【问题描述】:

我刚刚使用全局变量完成了我的代码。我知道使用全局变量是不受欢迎的,所以我打算改用指针。

所以最初我的函数是void time (void),在函数中调用了全局变量。 在我将程序更改为void time (unsigned char *xp, unsigned char *yp, unsigned char *zp, unsigned char *ap)

我测试了两者 (PIC16F877A) 的 RAM 使用率,令我惊讶的是,在我使用指针后,ram 使用率上升了。在不再调用该函数并且我已正确使用它们(这不是问题)后,这些指针将被删除。有人可以向我解释为什么会这样吗? 我是在指针的影响下使你的程序的效率更好。

附加信息(4个变量在变成指针之前都是全局变量)。

人们要求我发布我的代码,所以它就在这里(这个有指针,我使用的是 PIC16F877A)

`void time (unsigned char *time1p, unsigned char *time2p, unsigned char *time3p, unsigned char *finishp){
unsigned char i, j=0;
unsigned char timer [] = {"Time has expired"};    //Memory saver
 if (*time1p == 0 && *time2p == 0 && *time3p == 0)   //if all the time is 0 finish the sequence
                               *finishp = 1;

                           if (*time1p != 0)              //Checking to see if the first digit is NOT at 0
                              *time1p = *time1p - 1;             //  subtract time 1 by 1
                           else {*time2p = *time2p - 1;            //When time1 is 0
                                *time1p = 9;}                    //Time1 going back to it's original value

                           if (*time2p == 0 && *time1p == 0){        //if time1 and time2 are 0s
                           LCD_cursor(14,0);
                           LCD_display_value(*time2p);               //Display its value
                          Delay_ms(200);                          //Use the delay


                           if (*time3p != 0){                        //The minute value (time3)
                              *time2p = 5;                             //60 SECONDS
                              *time3p = *time3p - 1;
                              *time1p = 9;  }  }                      //Put time 1 to its original value


                                                                   //Puting the correct numbers in order
                LCD_cursor(15,0);
                LCD_display_value(*time1p);
                LCD_cursor(14,0);
                LCD_display_value(*time2p);
                LCD_cursor(13,0);
                LCD_putch(':');
                LCD_cursor(12,0);
                LCD_display_value(*time3p);
                Delay_ms(300);
        /*Memory saver*/
                        if (*finishp == 1){
                        LCD_clear();
                              while (timer[j] > 0x00)
                              {
                               LCD_putch(timer[j]); //Print the string
                                j=j+1;
                                }
                        for (i=0; i < 10; i++){
                        i=0;                   }
                                        }

   ////////////End of memory saver

}         //end of time function`

【问题讨论】:

  • 指针在哪些方面与全局变量相反?以及指针指向什么?你的问题还远没有说清楚。哪张图? PIC32?图16/18? dsPIC? PIC24?
  • 您为动态分配预留了多少/多少空间?
  • @user3528438:希望 OP 没有在 PIC16 上使用动态内存分配,我想)。
  • 点是“指针”与“全局变量”并不相反。 (您没有明确地说出这一点,但您的问题文本很好地暗示了这一点。)所以这个问题无法回答!
  • @user3528438:64k 池?不。上面提到的 PIC 有 368 字节的 RAM....

标签: c pointers global-variables ram pic


【解决方案1】:

在小型和非常小型的嵌入式设备上,内存消耗的可预测性比整洁的代码重要得多,并且绝对应该优先。静态分配的内存为您提供了这种可预测性。程序运行或不运行,但不会因为内存耗尽而在 2 小时后崩溃。这就是为什么在小型设备上您不应该真正使用动态分配的原因之一。

另一个原因是动态内存分配不是免费的 - 内存管理需要一些内存用于其自身的内部工作,并且 指针 通常具有架构的所有标量类型的最大大小.

将 char 作为静态变量存储在 PIC 或 AVR 上会花费您:1 个字节

在堆上存储一个 char 需要花费:1 个字节用于 char,2 个字节用于指针。

去看看;)

【讨论】:

  • 这没有回答问题。使用指针并不意味着动态内存分配,也不是。您的计算做出了也没有给出的假设。如果无论如何都必须为本地人保留内存,则本地指针不需要占用额外的内存。
  • 我认为它回答了 OP 想问的问题。但我和你在一起,他本可以问更好
  • 非常好的答案,您已经很好地解释了它。我觉得第 22 条,如果我不使用指针,我有 40 个全局变量,但如果我使用指针,我会占用太多内存。我选择了指针选项,只用了 50% 的 ROM。非常感谢@tofro 先生,我很感激。
  • 哦,你是千里眼!问题不能问;只是没有提供足够的信息。此外,您最初的陈述是完全错误的。可读性/可维护性通常是一个主要因素。在涉及安全相关编程时更是如此。静态分配和动态分配都不矛盾。
  • @Olaf:如果我们谈论任何至少有老式 Commodore 64 大小的东西,我会完全支持你。我们不是。相反,我们讨论的是具有 384 字节 RAM 的系统。在我看来,anything 是允许从那里保存的。不过,我确实同意您可以在 14K 闪存中弄乱很多代码。所以可读性/可维护性应该是第二的。
【解决方案2】:

所以最初我的函数是 void time (void),在函数内调用全局变量。在我将程序更改为无效时间后(unsigned char *xp、unsigned char *yp、unsigned char *zp、unsigned char *ap)

这就是您看到 RAM 使用率上升的原因;您创建了四个 unsigned char * 类型的 new 对象,而您之前没有它们。函数参数的存储将在函数入口分配并在函数出口释放。

全局变量通常不受欢迎,但有时您无法避免使用它们。在您的特定情况下,最好坚持使用全局变量并记录所有内容。

【讨论】:

  • 这取决于使用最多局部变量的调用链。使用额外的局部变量并不一定会导致更多的内存使用。现代工具链很可能将局部变量存储在全局空间中,而不是堆栈中。
  • 这并没有真正反驳 John 在引用上下文中所说的话 - 无论编译器将它们放在哪里,unsigned char* 将使用两倍于 unsigned char 的内存。并且“指向的东西”必须始终存在。如果指针完全没有必要(如本例所示),这将更加重要
猜你喜欢
  • 2021-11-11
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多