我刚刚使用全局变量完成了我的代码。我知道使用全局变量是不受欢迎的,所以我将使用指针代替。
所以最初我的函数是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`
答案 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不受欢迎,但有时候你不能避免使用它们。在你的特殊情况下,坚持使用全局变量并记录下所有内容可能会更好。