使用 ATmega16a 的 CodevisionAVR 构建后的链接器警告
Linker warning after builds with CodevisionAVR for ATmega16a
此代码是 c 语言,应该是为 ATmega16a 构建的
我使用 Codevision 来构建它,但我有这个警告,但我找不到原因。我尝试了不同的方法来测试它,但我仍然发出这个警告。
我该怎么办?
Linker warning: function 'UserIdentify' not used in data stack usage
calculation due to possible recursive calls
void main(void)
{
DDRC = 0x07;
DDRD = 0x78;
PORTD = 0x07;
lcd_init(20);
if (UL == -1)
{
UL = 1;
user[0].role = true;
user[0].username = 123;
user[0].password = 321;
}
while (1)
{
UserIdentify();
}
}
void UserIdentify(void)
{
username = 0;
password = 0;
checker = true;
lcd_clear();
lcd_putsf("Welcome");
lcd_gotoxy(0, 1);
lcd_putsf("Login press 1");
lcd_gotoxy(0, 2);
lcd_putsf("Register press 2");
lcd_gotoxy(0, 3);
lcd_putsf("About this device 3");
switch (ScanKey())
{
case 1:
lcd_clear();
lcd_putsf("Enter Username : ");
lcd_gotoxy(0, 1);
username = ScanKey();
lcd_gotoxy(0, 2);
lcd_putsf("Enter Password : ");
lcd_gotoxy(0, 3);
password = ScanKey();
for (i = 0; i < UL; i++)
{
if (user[i].username == username)
{
if (user[i].password == password)
{
PORTC .0 = 1;
lcd_clear();
lcd_putsf("You Entered !!");
delay_ms(150);
PORTC .0 = 0;
if (user[i].role == false)
{
UserPannel(i);
break;
}
else if (user[i].role == true)
{
AdminPannel(i);
break;
}
}
}
}
if (checker)
{
PORTC .1 = 1;
lcd_clear();
lcd_putsf("Wrong User or Pass !");
delay_ms(150);
PORTC .1 = 0;
}
break;
case 2:
EditUser(5, -1);
UserPannel(UL - 1);
break;
case 3:
EditUser(8, -1);
break;
default:
break;
}
}
void EditUser(int Case, int Code)
{
switch (Case)
{
case 1:
lcd_clear();
lcd_putsf("Enter new Username:");
lcd_gotoxy(0, 1);
user[Code].username = ScanKey();
lcd_gotoxy(0, 2);
PORTC .0 = 1;
lcd_putsf("Username changed.");
delay_ms(150);
PORTC .0 = 0;
break;
case 2:
lcd_clear();
lcd_putsf("Enter new Password:");
lcd_gotoxy(0, 1);
user[Code].password = ScanKey();
lcd_gotoxy(0, 1);
PORTC .0 = 1;
lcd_putsf("Password changed.");
delay_ms(150);
PORTC .0 = 0;
break;
case 3:
lcd_clear();
for (i = Code; i < UL; i++)
{
user[Code] = user[Code + 1];
}
UL--;
PORTC .0 = 1;
lcd_putsf("User Deleted.");
delay_ms(150);
PORTC .0 = 0;
UserIdentify();
break;
case 4:
checker = false;
break;
case 5:
if (UL != 10)
{
do
{
lcd_clear();
lcd_putsf("Enter Username :");
lcd_gotoxy(0, 1);
user[UL].username = ScanKey();
lcd_gotoxy(0, 2);
lcd_putsf("Enter Password :");
lcd_gotoxy(0, 3);
user[UL].password = ScanKey();
} while (user[UL].username == 0 || user[UL].password == 0);
lcd_clear();
if (user[Code].role == true)
{
lcd_putsf("Promote to admin ? ");
lcd_gotoxy(0, 1);
lcd_putsf("Yes press 1");
lcd_gotoxy(0, 2);
lcd_putsf("No press 2");
if (ScanKey() == 1)
{
user[UL].role = true;
}
else
{
user[UL].role = false;
}
lcd_gotoxy(0, 3);
}
UL++;
PORTC .0 = 1;
lcd_putsf("User added !!");
delay_ms(150);
PORTC .0 = 0;
}
else
{
PORTC .1 = 1;
lcd_clear();
lcd_putsf("Users full !!");
delay_ms(150);
PORTC .1 = 0;
}
break;
case 6:
if (user[Code].role == true)
{
lcd_clear();
lcd_putsf("Promote to admin ?");
lcd_gotoxy(0, 1);
lcd_putsf("Yes press 1");
lcd_gotoxy(0, 2);
lcd_putsf("No press 2");
if (ScanKey() == 1)
{
PORTC .0 = 1;
user[Code].role = true;
lcd_gotoxy(0, 3);
lcd_putsf("Promoted !");
delay_ms(150);
PORTC .0 = 0;
}
else
{
PORTC .1 = 1;
lcd_gotoxy(0, 3);
lcd_putsf("Cancelled !");
delay_ms(150);
PORTC .1 = 0;
}
}
break;
case 7:
if (user[Code].role == true)
{
lcd_clear();
lcd_putsf("Demote admin ?");
lcd_gotoxy(0, 1);
lcd_putsf("Yes press 1");
lcd_gotoxy(0, 2);
lcd_putsf("No press 2");
if (ScanKey() == 1)
{
PORTC .0 = 1;
user[Code].role = false;
lcd_gotoxy(0, 3);
lcd_putsf("Demoted !");
delay_ms(150);
PORTC .0 = 0;
}
else
{
PORTC .1 = 1;
lcd_gotoxy(0, 3);
lcd_putsf("Cancelled !");
delay_ms(150);
PORTC .1 = 0;
}
}
break;
case 8:
lcd_clear();
lcd_putsf("DIGITAL PASS LOCK");
lcd_gotoxy(0, 1);
lcd_putsf("Admins & users");
lcd_gotoxy(0, 2);
lcd_putsf("admin can edit users");
lcd_gotoxy(0, 3);
lcd_putsf("Prgrmd & bld Zavosh");
ScanKey();
default:
break;
}
}
void UserPannel(int UserCode)
{
while (checker)
{
lcd_clear();
sprintf(show, "User %d", user[UserCode].username);
lcd_puts(show);
lcd_gotoxy(0, 1);
lcd_putsf("chng Username prs 1");
lcd_gotoxy(0, 2);
lcd_putsf("chng Password prs 2");
lcd_gotoxy(0, 3);
lcd_putsf("Delete 3 - Logout 4");
EditUser(ScanKey(), UserCode);
}
}
void AdminPannel(int AdminCode)
{
while (checker)
{
lcd_clear();
sprintf(show, "%d Users", UL);
lcd_puts(show);
lcd_gotoxy(0, 1);
lcd_putsf("Edit Profile prss 1");
lcd_gotoxy(0, 2);
lcd_putsf("Edit Users prss 2");
lcd_gotoxy(0, 3);
lcd_putsf("Add Users prss 3");
switch (ScanKey())
{
case 1:
UserPannel(AdminCode);
break;
case 2:
lcd_clear();
lcd_putsf("Enter Username :");
username = ScanKey();
for (i = 0; i < UL; i++)
{
if (user[i].username == username)
{
checker = false;
lcd_clear();
lcd_putsf("Username 1, Pass 2");
lcd_gotoxy(0, 1);
lcd_putsf("Logout 4, Delete 3");
if (user[i].role)
{
lcd_gotoxy(0, 2);
lcd_putsf("Demote admin 7");
EditUser(ScanKey(), i);
}
else
{
lcd_gotoxy(0, 2);
lcd_putsf("Promote Admin 6");
user[i].role = true;
EditUser(ScanKey(), i);
user[i].role = true;
}
break;
}
}
if (checker)
{
PORTC .1 = 1;
lcd_clear();
lcd_putsf("User Not Found !!");
delay_ms(150);
PORTC .1 = 0;
}
else
{
checker = true;
}
break;
case 3:
EditUser(5, AdminCode);
break;
default:
break;
}
}
}
Linker warning: function 'UserIdentify' not used in data stack usage
calculation due to possible recursive calls
此消息告诉您编译器无法估计代码的数据堆栈使用情况,因为它检测到可能的递归调用。在递归调用的情况下,堆栈使用取决于 运行 时间的数据值,因此编译器不知道它。
此代码是 c 语言,应该是为 ATmega16a 构建的 我使用 Codevision 来构建它,但我有这个警告,但我找不到原因。我尝试了不同的方法来测试它,但我仍然发出这个警告。 我该怎么办?
Linker warning: function 'UserIdentify' not used in data stack usage calculation due to possible recursive calls
void main(void)
{
DDRC = 0x07;
DDRD = 0x78;
PORTD = 0x07;
lcd_init(20);
if (UL == -1)
{
UL = 1;
user[0].role = true;
user[0].username = 123;
user[0].password = 321;
}
while (1)
{
UserIdentify();
}
}
void UserIdentify(void)
{
username = 0;
password = 0;
checker = true;
lcd_clear();
lcd_putsf("Welcome");
lcd_gotoxy(0, 1);
lcd_putsf("Login press 1");
lcd_gotoxy(0, 2);
lcd_putsf("Register press 2");
lcd_gotoxy(0, 3);
lcd_putsf("About this device 3");
switch (ScanKey())
{
case 1:
lcd_clear();
lcd_putsf("Enter Username : ");
lcd_gotoxy(0, 1);
username = ScanKey();
lcd_gotoxy(0, 2);
lcd_putsf("Enter Password : ");
lcd_gotoxy(0, 3);
password = ScanKey();
for (i = 0; i < UL; i++)
{
if (user[i].username == username)
{
if (user[i].password == password)
{
PORTC .0 = 1;
lcd_clear();
lcd_putsf("You Entered !!");
delay_ms(150);
PORTC .0 = 0;
if (user[i].role == false)
{
UserPannel(i);
break;
}
else if (user[i].role == true)
{
AdminPannel(i);
break;
}
}
}
}
if (checker)
{
PORTC .1 = 1;
lcd_clear();
lcd_putsf("Wrong User or Pass !");
delay_ms(150);
PORTC .1 = 0;
}
break;
case 2:
EditUser(5, -1);
UserPannel(UL - 1);
break;
case 3:
EditUser(8, -1);
break;
default:
break;
}
}
void EditUser(int Case, int Code)
{
switch (Case)
{
case 1:
lcd_clear();
lcd_putsf("Enter new Username:");
lcd_gotoxy(0, 1);
user[Code].username = ScanKey();
lcd_gotoxy(0, 2);
PORTC .0 = 1;
lcd_putsf("Username changed.");
delay_ms(150);
PORTC .0 = 0;
break;
case 2:
lcd_clear();
lcd_putsf("Enter new Password:");
lcd_gotoxy(0, 1);
user[Code].password = ScanKey();
lcd_gotoxy(0, 1);
PORTC .0 = 1;
lcd_putsf("Password changed.");
delay_ms(150);
PORTC .0 = 0;
break;
case 3:
lcd_clear();
for (i = Code; i < UL; i++)
{
user[Code] = user[Code + 1];
}
UL--;
PORTC .0 = 1;
lcd_putsf("User Deleted.");
delay_ms(150);
PORTC .0 = 0;
UserIdentify();
break;
case 4:
checker = false;
break;
case 5:
if (UL != 10)
{
do
{
lcd_clear();
lcd_putsf("Enter Username :");
lcd_gotoxy(0, 1);
user[UL].username = ScanKey();
lcd_gotoxy(0, 2);
lcd_putsf("Enter Password :");
lcd_gotoxy(0, 3);
user[UL].password = ScanKey();
} while (user[UL].username == 0 || user[UL].password == 0);
lcd_clear();
if (user[Code].role == true)
{
lcd_putsf("Promote to admin ? ");
lcd_gotoxy(0, 1);
lcd_putsf("Yes press 1");
lcd_gotoxy(0, 2);
lcd_putsf("No press 2");
if (ScanKey() == 1)
{
user[UL].role = true;
}
else
{
user[UL].role = false;
}
lcd_gotoxy(0, 3);
}
UL++;
PORTC .0 = 1;
lcd_putsf("User added !!");
delay_ms(150);
PORTC .0 = 0;
}
else
{
PORTC .1 = 1;
lcd_clear();
lcd_putsf("Users full !!");
delay_ms(150);
PORTC .1 = 0;
}
break;
case 6:
if (user[Code].role == true)
{
lcd_clear();
lcd_putsf("Promote to admin ?");
lcd_gotoxy(0, 1);
lcd_putsf("Yes press 1");
lcd_gotoxy(0, 2);
lcd_putsf("No press 2");
if (ScanKey() == 1)
{
PORTC .0 = 1;
user[Code].role = true;
lcd_gotoxy(0, 3);
lcd_putsf("Promoted !");
delay_ms(150);
PORTC .0 = 0;
}
else
{
PORTC .1 = 1;
lcd_gotoxy(0, 3);
lcd_putsf("Cancelled !");
delay_ms(150);
PORTC .1 = 0;
}
}
break;
case 7:
if (user[Code].role == true)
{
lcd_clear();
lcd_putsf("Demote admin ?");
lcd_gotoxy(0, 1);
lcd_putsf("Yes press 1");
lcd_gotoxy(0, 2);
lcd_putsf("No press 2");
if (ScanKey() == 1)
{
PORTC .0 = 1;
user[Code].role = false;
lcd_gotoxy(0, 3);
lcd_putsf("Demoted !");
delay_ms(150);
PORTC .0 = 0;
}
else
{
PORTC .1 = 1;
lcd_gotoxy(0, 3);
lcd_putsf("Cancelled !");
delay_ms(150);
PORTC .1 = 0;
}
}
break;
case 8:
lcd_clear();
lcd_putsf("DIGITAL PASS LOCK");
lcd_gotoxy(0, 1);
lcd_putsf("Admins & users");
lcd_gotoxy(0, 2);
lcd_putsf("admin can edit users");
lcd_gotoxy(0, 3);
lcd_putsf("Prgrmd & bld Zavosh");
ScanKey();
default:
break;
}
}
void UserPannel(int UserCode)
{
while (checker)
{
lcd_clear();
sprintf(show, "User %d", user[UserCode].username);
lcd_puts(show);
lcd_gotoxy(0, 1);
lcd_putsf("chng Username prs 1");
lcd_gotoxy(0, 2);
lcd_putsf("chng Password prs 2");
lcd_gotoxy(0, 3);
lcd_putsf("Delete 3 - Logout 4");
EditUser(ScanKey(), UserCode);
}
}
void AdminPannel(int AdminCode)
{
while (checker)
{
lcd_clear();
sprintf(show, "%d Users", UL);
lcd_puts(show);
lcd_gotoxy(0, 1);
lcd_putsf("Edit Profile prss 1");
lcd_gotoxy(0, 2);
lcd_putsf("Edit Users prss 2");
lcd_gotoxy(0, 3);
lcd_putsf("Add Users prss 3");
switch (ScanKey())
{
case 1:
UserPannel(AdminCode);
break;
case 2:
lcd_clear();
lcd_putsf("Enter Username :");
username = ScanKey();
for (i = 0; i < UL; i++)
{
if (user[i].username == username)
{
checker = false;
lcd_clear();
lcd_putsf("Username 1, Pass 2");
lcd_gotoxy(0, 1);
lcd_putsf("Logout 4, Delete 3");
if (user[i].role)
{
lcd_gotoxy(0, 2);
lcd_putsf("Demote admin 7");
EditUser(ScanKey(), i);
}
else
{
lcd_gotoxy(0, 2);
lcd_putsf("Promote Admin 6");
user[i].role = true;
EditUser(ScanKey(), i);
user[i].role = true;
}
break;
}
}
if (checker)
{
PORTC .1 = 1;
lcd_clear();
lcd_putsf("User Not Found !!");
delay_ms(150);
PORTC .1 = 0;
}
else
{
checker = true;
}
break;
case 3:
EditUser(5, AdminCode);
break;
default:
break;
}
}
}
Linker warning: function 'UserIdentify' not used in data stack usage calculation due to possible recursive calls
此消息告诉您编译器无法估计代码的数据堆栈使用情况,因为它检测到可能的递归调用。在递归调用的情况下,堆栈使用取决于 运行 时间的数据值,因此编译器不知道它。