bigbaicai

芯方式是以半导体人、电子工程师等电子行业相关领域从业人员为核心的知识经验学习、分享、交流社群。 凭借开放、合作、共赢的运营理念,聚集了来自国内外知名院校和顶尖科技公司的半导体人、电子工程师。 我们致力于营造专业、认真、有温度的分享交流环境,将高质量的内容和方案成规模地生产和分享,帮助个人和团队在芯方式找到有价值的Key。 http://www.icfans.com/

第一次开机assert在 J2ME_sms_load_recv_list

0
阅读(199) 评论(0)

[DESCRIPTION]
该问题一般在产线极小概率出现,现象是download bin档开机后直接在函数J2ME_sms_load_recv_list()中assert。
[SOLUTION]
此FAQ是依賴於JSR120或JSR205是否有被Enable,詳細Platform和Branch的支持信息請參考FAQ04183以確認。
死机原因:sms_queuefile.txt内容错误。
造成问题的原因(如下条件同时满足):
1、 该Flash上存在野数据,可能之前有使用过。
2、 在第一次开机,初始化Java相关文件时,测试人员拔除电池,恰好sms_queuefile.txt已经生成,但尚未初始化
,从而文件中都是野数据icfans
此时再次开机,检查文件已经生成,就直接读取并做后续的操作,导致assert。
解决方法:
当发现J2ME_sms_load_recv_list()中内容不对时,不assert,而是reset这支文件。
"Jwa_sms.c"
1、新建如下接口。
void J2ME_regen_sms_queue_file(void)
{
kal_wchar* WCHARFilename_sms = NULL;
int sms_fd;
kal_uint8 tmp_buf[SMSQUEUE_FILE_HEADER_SIZE];
int position = SMSQUEUE_FILE_HEADER_SIZE;
int i;
int result = 0;
WCHARFilename_sms = (kal_wchar*)jam_listmem_malloc((strlen(j2me_sys_dir_path) +
strlen(SMSQUEUE_FILE) + 3) * 2);
if (WCHARFilename_sms == NULL)
{
goto RET;
}
kal_wsprintf(WCHARFilename_sms, "%s\\%s", j2me_sys_dir_path, SMSQUEUE_FILE);
if (FS_GetAttributes(WCHARFilename_sms) >= 0)
return;
else/* create queue file when the sise doesn't equal to 10k or file doesn't exist
* set size to 10k and set the file header */
{
if ((sms_fd = FS_Open(WCHARFilename_sms, O_BINARY | O_TRUNC | O_RDWR)) >= 0)
{
if (FS_Seek(sms_fd, SMSQUEUE_MAX_FILE_SIZE, SEEK_SET) >= 0)
{
if (FS_Seek(sms_fd, 0, SEEK_SET) >= 0)
{
tmp_buf[0] = (kal_uint8) ((position & 0xff000000) >> 24);
tmp_buf[1] = (kal_uint8) ((position & 0x00ff0000) >> 16);
tmp_buf[2] = (kal_uint8) ((position & 0x0000ff00) >> 8);
tmp_buf[3] = (kal_uint8) (position & 0x000000ff);
tmp_buf[4] = ' ';
if (FS_Write(sms_fd, tmp_buf, SMSQUEUE_FILE_HEADER_SIZE, (kal_uint32 *)&result) >=
0)
{
if (result == SMSQUEUE_FILE_HEADER_SIZE)
{
FS_Close(sms_fd);
sms_init_result = KAL_TRUE;
for (i = 0; i < JAVA_SMS_MAX_PORT_NUM; i++)
{
j2me_sms_recv_num_list[i].port = (kal_uint16)0;
j2me_sms_recv_num_list[i].number = (kal_uint16)0;
}
goto RET;
}
}
}
}
FS_Close(sms_fd);
if (FS_Delete(WCHARFilename_sms) < 0)
{
sprintf(_kvmLogStr,"J2ME_sms_init: delete queue file fail \n");
Kprintf();
}
}
}
RET:
if (WCHARFilename_sms)
{
jam_listmem_free(WCHARFilename_sms);
}
}
2、J2ME_sms_load_recv_list()中在FAIL标志之后新增//begin ... //end之间的部分。
...
FAIL:
FS_Close(sms_fd);
//begin
FS_Delete(WCHARFilename_sms);
J2ME_regen_sms_queue_file();
if (WCHARFilename_sms)
{
jam_listmem_free(WCHARFilename_sms);
}
return;
//end
FAIL1:
ASSERT(0);
if (WCHARFilename_sms)
{
jam_listmem_free(WCHARFilename_sms);
}
return;
...