PIC上的指针与全局变量或RAM中的RAM

时间:2016-03-17 17:55:08

标签: c pointers global-variables ram pic

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

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

我测试了两者的RAM使用情况(PIC16F877A),令我惊讶的是,在我使用指针后,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`

2 个答案:

答案 0 :(得分:2)

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

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

将PIC作为静态变量存储在PIC或AVR上需要花费1个字节

在堆上存储一个char会花费你:char为1个字节,指针为2个字节。

去图;)

答案 1 :(得分:0)

  

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

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

一般来说,Globals不受欢迎,但有时候你不能避免使用它们。在你的特殊情况下,坚持使用全局变量并记录下所有内容可能会更好。