找回密码
 注册
搜索
查看: 2681|回复: 8

[讨论] NVRAM初始化问题

[复制链接]
发表于 2010-5-6 11:02:41 | 显示全部楼层 |阅读模式
刚才想做一个事情,就是在手机设置里添加一项
主菜单类型设置  MATRIX /PAGE/LIST等等,然后用户只要选一下就可以设置自己喜欢的类型了

然后设计到NVRAM保存的问题

我的想法是这样的,开机,进行变量初始化,(单独一个文件,里面全部是手机用到的全部初始化值,包括默认语言,默认输入法等等,多少个客户,对应多少个这样的文件,然后根据不同的客户,选择不同的初始化文件),然后把变量的值写到NVRAM里。
类似

void MApp_Torch_Init_TorchSetting(void)
{
        g_phnset_torch_cntx_p->TorchLevel = DEFAULT_TORCH_LIGHT_LEVEL;
        g_phnset_torch_cntx_p->TorchTime  = DEFAULT_TORCH_LIGHT_TIME;
       
        MApp_Torch_Save_TorchSetting();
}

void MApp_Torch_Save_TorchSetting(void)
{
    S16 error;

        WriteValue(NVRAM_BYTE_TORCH_SETTING_LEVEL, &(g_phnset_torch_cntx_p->TorchLevel), DS_BYTE, &error);
        WriteValue(NVRAM_BYTE_TORCH_SETTING_TIME,  &(g_phnset_torch_cntx_p->TorchTime),  DS_BYTE, &error);
}
但是我发现MTK不是这么做的,比如currentCity,
开机初始化执行InitPhoneSetupCntx函数。
这个函数里是这么执行关于默认城市的
g_phnset_cntx_p->currentCity = 0;

        ReadValue(CURRENT_CITY, &(g_phnset_cntx_p->currentCity), DS_BYTE, &Err);
    if (g_phnset_cntx_p->currentCity == 0xff)
    {
        g_phnset_cntx_p->currentCity = 0;
        WriteValue(CURRENT_CITY, &g_phnset_cntx_p->currentCity, DS_BYTE, &Err);
    }
将NVRAM里的数据赋值给g_phnset_cntx_p->currentCity 变量。
然后具体进入日期菜单的时候
又调用PhnsetReadNvmHomeCityIdxNStoreCityName,
里面做了什么呢?

    ReadValue(CURRENT_CITY, &(g_phnset_cntx_p->currentCity), DS_BYTE, &error);
    if (error != NVRAM_READ_SUCCESS)
    {
        g_phnset_cntx_p->currentCity = 0;
    }
    else if (g_phnset_cntx_p->currentCity > NUM_CITYS)
    {
        g_phnset_cntx_p->currentCity = 0;
    }
将NVRAM里的数据赋值给g_phnset_cntx_p->currentCity 变量。

我觉得非常不好,干吗赋值两次?

高手帮忙解释下我的疑问
 楼主| 发表于 2010-5-6 11:05:58 | 显示全部楼层
问题二:MTK很多时候,要用变量的时候,都用ReadValue函数,重新把NVRAM的值赋给变量,虽然这样做比较保险

但是我好奇一下,如果我用变量的时候,我不从NVRAM重新取值,可能会出现什么结果?

我个人想到的是,其他方面都不会有问题,我们改变变量后,会立即保存到NVRAM里。除非是我们该变变量,但是存NVRAM的时候出现异常,导致无法存进去,但是什么时候会发生异常呢?异常怎么产生的呢
点评回复

使用道具 举报

 楼主| 发表于 2010-5-6 11:29:34 | 显示全部楼层
有兄弟这么回答我了

以下是引用ly85206559在2010-5-6 11:12:30的发言:
我是个新手哦,我认真看了楼主的帖子,以下是我的看法:
第一,InitPhoneSetupCntx这个函数在初始化的时候给g_phnset_cntx_p->currentCity 变量赋值,当然这里有可能是0,但也有可能不是0,所以这里不一定是赋值为0。
第二,g_phnset_cntx_p->currentCity 是一个全局变量,除了进入日期菜单会用到外,还有地方会用到,甚至会影响到这个值,比如我如果修改了时区,MTK会将修改了的值写入NV(这是必须的),但不一定修改g_phnset_cntx_p->currentCity (当然也有可能会修改),但如果你自己写了一个功能需要修改g_phnset_cntx_p->currentCity所对应的NV,你不一定会修改g_phnset_cntx_p->currentCity里面的值,所以MTK这么做保证了g_phnset_cntx_p->currentCity的值是最新的(因为涉及到NV里的值 大家都是严谨的)。
不知道我这么解释楼主能不能明白,呵呵!个人见解[em12]



谢谢这位兄弟的回答

MTK的程序我还没读熟,可能MTK的做法和我的思路有点出入,我不太理解,为什么“写了一个功能需要修改g_phnset_cntx_p->currentCity所对应的NV,你不一定会修改g_phnset_cntx_p->currentCity里面的值",我的思路是待用户确定要修改时(比如按LSK确定),就应该立即执行变量值保存进NVRAM对应的项。


我做程序是这样的,变量分两种,
一种就是单独的全局变量,比如我这个TORCH程序里,关于当前TORCH是否亮着的变量g_bCurrentTorchStatus,
另外一种全局变量,它有对应的NVRAM里的项,变量改变,我一定会第一时间存变量的值进NVRAM。

举个例子,


左右键改变TORCH的亮度
void MApp_Torch_Adjust_Level(S32 index)
{
        switch(index)
        {
                case 1:                g_phnset_torch_cntx_p->TorchLevel = LED_LIGHT_LEVEL1 ;                break;
                case 2:                g_phnset_torch_cntx_p->TorchLevel = LED_LIGHT_LEVEL2 ;                break;
                case 3:                g_phnset_torch_cntx_p->TorchLevel = LED_LIGHT_LEVEL3 ;                break;
                case 4:                g_phnset_torch_cntx_p->TorchLevel = LED_LIGHT_LEVEL4 ;                break;
                case 5:                g_phnset_torch_cntx_p->TorchLevel = LED_LIGHT_LEVEL5 ;                break;
                default:                g_phnset_torch_cntx_p->TorchLevel = DEFAULT_TORCH_LIGHT_LEVEL;        break;
        }
        MApp_Torch_TurnOn();//
}


按LSK保存设置
void MApp_Torch_Setting_LSK_Handler(void)
{
    MApp_Torch_Save_TorchSetting();
//popup success menu   
    mmi_display_popup((UI_string_type)GetString(STR_GLOBAL_DONE), MMI_EVENT_SUCCESS);
    DeleteScreenIfPresent(SCR_ID_PHNSET_TORCH_SETTING);
}
按RSK不保存改变的值,把NVRAM的质,重新赋给变量
void MApp_Torch_Setting_RSK_Handler(void)
{
        MApp_Torch_Load_TorchSetting();
        custom_cfg_gpio_set_level(GPIO_DEV_TORCH, g_phnset_torch_cntx_p->TorchLevel);       
    GoBackHistory();
}
点评回复

使用道具 举报

发表于 2010-5-6 16:30:03 | 显示全部楼层
你的全局变量只会用在你写的功能模块里,所以你这么做可以的,但MTK有的全局变量很多.c要用到,所以你不知道什么时候这个全局变量的值是新的,所以每次都要从NV里读出来。
点评回复

使用道具 举报

发表于 2010-5-6 19:10:27 | 显示全部楼层
楼主做的这个功能MTK有的,什么CHANGE EN的那个宏
点评回复

使用道具 举报

发表于 2010-5-6 22:29:27 | 显示全部楼层
我的理解,写入NV的地方只有一个,或者很少,基本上可以保证是正确的,而内存里的值有可能有问题,相对而言从NV读入,可靠性高些。但是有的这种处理方式的代码也有漏洞,例如Profile的初始化,仅判断了是否为0xff,还是不够。
点评回复

使用道具 举报

发表于 2010-5-8 00:42:01 | 显示全部楼层
我也感觉,MTK本来就带这个功能的
点评回复

使用道具 举报

发表于 2010-5-8 07:45:04 | 显示全部楼层
真是高科技啊,既然MTK平台支持XML,所有的参数为啥不以XML的形式存储呀.
高科技呀,无语.
点评回复

使用道具 举报

发表于 2010-5-10 14:08:15 | 显示全部楼层
XML效率太低了吧? 需要多少flash空间啊
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2025-2-26 03:58 , Processed in 0.047818 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表