首先找到打印此信息的位置,搜索可知在/common/env_cmm.c文件中。
程序如下:
#if !defined(ENV_IS_EMBEDDED)
static void use_default()
{
puts ("*** Warning - bad CRC or MMC, using default environment\n\n");
set_default_env();//使用程序本身的环境变量进行设置
}
#endif
由上述程序可知只要进入上面的程序就会打印出警告信息,现在查看是在什么地方调用了上面的程序。
搜索得到下面程序:
void env_relocate_spec(void)
{
#if !defined(ENV_IS_EMBEDDED)
struct mmc *mmc = find_mmc_device(mmc_env_devno);
if (init_mmc_for_env(mmc))
return;
if (read_env(mmc, CONFIG_ENV_SIZE, CONFIG_ENV_OFFSET, env_ptr))
return use_default();
//从mmc器件中读取对应的环境变量,在配置文件中指明了大小和偏移地址等信息。如果错误将执行use_default();
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();
//对读取的数值进行crc校验,如果不正确将在执行use_default();
gd->env_valid = 1;
#endif
}
从上面程序分析得到,如果在你设置的环境变量保存器件中相应位置没有正确的环境变量信息的时候将会执行use_default();读取程序中的变量数值。
如果数据受到破坏,crc校验通不过也会执行use_default();。
我测试的时候就是没有把相应的环境变量保存到对应的器件中,所以每次启动uboot就会打印警告信息。
本人新手,刚刚接触uboot,还在努力的学习中,虽然问题比较简单,但是我只是把我在调试的过程中发现的问题记录下来,希望高手多家指教。