欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    嵌入式系统日志记录的简易方法.docx

    • 资源ID:1531303       资源大小:46.14KB        全文页数:36页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式系统日志记录的简易方法.docx

    很多场景都需要记录日志,在战入式系统中,特别是雎片机这种存储资源有限的环境下,就需要一种轻Sc级的存储方法。系统日志在嵌入式设备应用场景中,系统日志时常可以监控设备软件的运行状态,及时记录问题点以及关键信息,方便开发人先后期定位以及解决问题.本文将讲述一种简易的系统日志记录方法,用下保存设备的系统日志,视具体嵌入式设备情况而定,可存储在MCU内部FIaSh、外部F1.aSh、EEPRoM等,本文采用外部F1.ash作为示例展开介绍“思路分析对于系统日志可以当成文件系统,可以划分为三个重要部分:目录区、参数区、日志区。目录区:根据日期进行归类,记录当天的日志的存储地址、日志索引、日志大小,通过目录可以获取整个日志文件的概况;参数区:存储记录日志写位设、目录项个数、写状态等参数:日志区:这是我们主要的存储区,记录系统的日志,支持环写。这:个区域都需要占用部分内存,可以自行分配大小。实现的效果如卜图所示,设置通过指令可查询到整个日志目录区的概况。查询系统日志目录:AT+CATA1.0G?1.oGD:存储日志按日期分类,该ID用于查询对应日期日志,从1开始计数:1.OGDATE:系统日志存储日期:1.oG_ADDR:系统日志存储外部F1.ASH地址:1.0G>FFSET:系统日志存储偏移垃(各日期日志大小,单位:字节).图片查询指定日期系统日志:AT+CATA1.OG=<1.OG-ID>1.OGD:在查询系统日志目录时获取,当1.oGD为0时,为查询推个系统日志。图片另外提供移除系统日志(消除日志目录)指令:AT+RM1.OG.后面将讲述具体实现。F1.ASH内存划分F1.ASH内存需要看具体设备进行合理划分,目录区、参数区与日志区实现环形存储,延长擦写寿命。defineF1._ASH_SECTOR_SIZE(uint32-t)0x001000)SdefineF1.ASH_B1.OCK_32K_SIZE(Uint32_t)OXOo8000)defineF1._ASH_B1.OCK_64K_SIZE(Uint32_t)OXo1.OoOO)WdefineSECTORMASK(F1.ASH_SECTOR_SIZE-1)扇区掩码一7defineSECTOR_BASE(addr)扇区的基地址-*/WdefineSECTOR_OFFSET(addr)扇区内的偏移-*/defineB1.OCK_32K_BASE(addr)WdefineB1.OCK_64K_BASE(addr)typedefenumF1.ASH_B1.OCK_4K=0,F1.ASH_B1.OCK_32K=1,F1.ASH_B1.OCK_64K=2f1.ash_b1.ock_t;addr&(-SECTOR,MASK)(addr&SECTOR_MASK)(addr&(F1.ASH_B1.OCK_32K_SIZE)(addr&(F1.ASH_B1.OCK_64K_SIZE)*<f1.asheraseb1.ocksize4k/<f1.asheraseb1.ocksize32k/*<f1.asheraseb1.ocksize64k*/*f1.ash空间索引*/typedefenumF1.ASH_CATA1.OG_ZONE=0,F1.ASH_SYS1.OG_PARA_ZONE,F1.ASH_SYS1.OG_ZONE,F1.ASH_ZONEX,f1.ash_zone_e;tpedefstructf1.ash_zone_ezone;uint32_tstart-address;uint32_tend_address;f1.ash_tab1.e_t;*地址划分7staticconstf1.ash_tab1.e_tf1.ash_tab1.e=.zone=F1.ASH_CATA1.OG_ZONE,.startaddress0x03200000,.end-address=OxO32FFFFF,.zone=F1.ASH_SYS1.OG_PARA_ZONE,.startaddress0x03300000,.end-address=OxO33FFFFF,.zone=F1.ASH_SYS1.OG_ZONE,.startaddress0x03400000,.end,address=OxO3FFFFFF),FIaSh底层实现擦除、读写操作接口,由读者自行实现。f1.ash_tab1.e_t"get_f1.ash_tab1.e(f1.ash_zone_ezone)inti=O;for(i0;i<f1.ash_ZOne_count;i+)if(zone=f1.ashjab1.e(i.zone)return(f1.ash_tab1.e_t*)&f1.ash_tab1.ei;)returnNU1.1.;)intf1.ash_erasef1.ash_zone_ezone,uint32-taddress,f1.ash_b1.ock_tb1.ock_type)(f1.ash_tab1.e_t*f1.ash_tab1.e_tmp=get_f1.ash_tab1.e(zone);if(f1.ash_tab1.e_tmp=NU1.1.)return-1;if(address<f1.ash_tab1.e_tmp->start_address11addressf1.ash_tab1.e_tmp->end_address)return-1;returnbsp_spi_f1.ash_eraseaddress,b1.ockjype);intf1.ash_write(f1.ash_zone_ezone,uint32-taddress,constuint8-t*data,uint32-t1.ength)(f1.ash_tab1.e_t*f1.ash_tab1.e_tmp=get_f1.ash_tab1.e(zone);if(f1.ashIab1.e_tmp=NU1.1.)return-1;if(address<f1.ash_tab1.e_tmp->start_address)!(address+1.ength)>f1.ash_tab1.e_tmp->end_address)return-1;returnbsp_spi_f1.ash_buffer_writeaddress,(uint8_t*)data,1.ength);intf1.ash_read(f1.ash_zone_ezone,uint32-taddress,uint8j*buffer,uint32-t1.ength)(f1.ash_tab1.e_t*f1.ash_tab1.e_tmp=get_f1.ash_tab1.e(zone);if(f1.ash_tab1.e_tmp=NU1.1.)return-1;if(address<f1.ash_tab1.e_tmp->start_address)!(address+1.ength)>f1.ash_tab1.e_tmp->end_address)return-1;bsp_spi_f1.a$h_buffer_read(buffer,address,1.ength);returnO;参数与结构体定义日志数据存储时间戳,便丁问题定位,需要实现RTC接口调用.typedefstructuint1.6-tYear;年份:YYYY/uint8-tMonth;*月份:MM*/uint8tDay;*日:DDuint8-tHour;*小时:HH"/uint8-tMinute;/分钟:MM/uint8-tSecond;/*杪:SS*/intbsp_rtc_get_timetime_t*date);参数区应当保证数据的正确性,应加入参数校眩存储,定义校验结构体。#defineSYSTEM_1.OG_MAGIC_PARAM0x87654321*日志参数标识符7typedefstructuint32jmagic;/*参数标识符/uint1.6_tcrc;/*校验值*/uint1.6jIen;/参数长度7sing1.e_sav_t;参数区需记录当前日志记录的写位置,以及目录项个数,还有日志区和目录区环写状态,并且存储最新时间等等./*日志区参数*/tpedefstructuint32-tWrite_pos;写位置*/uint32jcata1.og_num;/目录项个数*/uint8_t1.og_cvc1.ic_status;/*系统日志环形写状态*/uint8_tCataIog_CydiJStatUs;/日志目录环形写状态*/time_t1.og_1.atest_time;/*存储最新时间*/system_1.og_t;/*目录区参数7typedefstructuint32j1.og_id;*日志索引/uint32_t1.og_addr;*日志地址*/uint32j1.og.offset;*日志偏移大小,单位:字节/time_t1.og_time;/*日志存储时间*/system_cata1.og_t;/*系统日志参数*/typedefstructsing1.e_sav_tcrc_va1.;system_1.og_tsystemjog;system_cata1.og_tSYStem.cata1.og;sys_1.og_param_t;typedefstructuint8jsystem_1.og_print_enab1.e;系统日志打印使能/uint1.6_t$vstem_1.og_print_id;*打印指定id系统日志,/uint32jsystem_1.og_param_addr;/当前日志写地址*/sys_ram_t;sys_ram_tSysRam;sys_1.og_param_tSys1.ogParam;sys_ram_tegp_sys_ram=SSysRam;sys_1.og_param_t*gp_sys_1.og=&Sys1.ogParam;实现接口说明CRC校验接口,可以自定义实现."16位CRC校监苗位表7staticconstUint8_tauchCRCHi11=0x00,0xc1.,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,OxcO,0x80,0x41,0x00,0xc1.,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1.,0x81,0x40,0x00,Oxc1.,0x81,0x40,0x01,OxcO,0×80,0x41f0x01,0xc0,0x80,0x41,0x00,0xc1.,0x81,0x40,0x00,0xc1.,0x81,0x40,0x01,0xc0,0x80,0x41f0x00,0xc1.,0x81,0×40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,OxOO,Oxc1.,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1.,0x81,0x40,0x00,Oxc1.,0x81,0x40,0x01,0xc0,0x80,0x41f0x00,Oxc1.,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,OxOO,Oxc1.,0×81,0x40,OxOO,Oxc1.,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,OxcO,0x80,0x41,0x00,Oxc1.,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1.,0x81,0x40,0x00,Oxc1.,0x81,0x40,0x01,0xc0,0x80,0x41f0x01,0xc0,0x80,0×41,OxOO,Oxc1.,0x81,0x40,0x00,Oxc1,0x81,0x40,0x01,OxcO,0x80,0x41,OxOO1OxcI,0x81,0x40,0x01,0xc0,0x80,0×41,0x01,OxcO,0x80,0x41,0x00,Oxc1,0x81,0x40,0x00,0xc1.,0x81,0x40,0x01.,xc,0x80,0x41,0x01,0×c0,0x80,0x41,OxOOzOxc1.,0×81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1.,0x81,0×40,0x00,0xc1.,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1.,0x81,0x40,0x01.,xc,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,Oxc1,0x81,0x40,0x01,0xc0,0x80,0x41,OxOO1OxcI,0x81,0×40,0x00,0xc1.,0x81,0x40,0x01,0xc0,0×80,0x41,OxOIjOxcO,0x80,0x41,0x00,0×c1.,0x81,0x40,0x00,0xc1.,0x81,0×40,0x01,OxcO,0x80,0x41,OXoO,OXC1.QX81,0x40,0x01,0XCOQX80,0x41,0x01,0×c0,0x80,0x41,0x00,Oxc1.,0×81,0x40*16位CRC校验低位表/staticconstuint8_tauchCRC1.o11=0x00,0xc0,0xc1.,0x01,0xc3,0x03,0x02,0xc2,0xc6,0x06,0x07,0xc7,0xs,0×c5,0xc4,0x04,0xcc,0x0c,0x0d,0xcd,0x00xcf,0xce,0x0e,0x0a,0xca,0xcb,0x0b,0xc9,0x09,0x08,Oxc8,0xd8,0x1.8,0x19,0xd9,0xIbzOxdbrOxda1.Ox1.azOx1.e,0xde,0xdf,0x1.t0xdd,0xId,Ox1.c,OXdc,0x1.4,0xd4,0xd5,0x1.5,0×d7,0x17,0x16,0xd6,0×d2,0x1.2,0x1.3,0xd3,0x1.1.,0xd1.,0xd0,0x10,OXfO,0x30,0x31,0xf1.,0x33,0xf3,0xf2,0x32,0x36,0xf6,0xf7,0x37,0xfS,0x35,0x34,0xf4,0x3c,0xfc,0xfd,0×3d,0xff,0x3f,0x3e,0xfe,0xfa,0×3a,0x3b,0xfb,0x39,0xf9,0xf8,0x38/0x28,0xe8,0xe9,0x29,0xeb,0x2b,0x2a,0xea,0xee,0x2e,0x2f,0×ef,0x2d,0xed,0xec,0x2c,0xe4,0x24,0x25,0xe5,0x27,0xe7,0xe6,0x26,0x22,0×e2,0xe3,0x23,0xe1.,0x21,0x20,OxeO,0xa0,0x60,0x61,0xa1.,0x63,0xa3,0xa2,0x62,0x66,0xa6,0xa7,0x67,0xa5,0x65,0x64,0xa4,0x6c,0xac,0xad,0x6d,0xaf,0x6f,0x6e,0xae,0xaa,0x6a,0x6b,0xab,0x69,0xa9,0xa8,0x68,0x78,0xb8,0xb9,0x79,0xbb,0x7b,0x7a,0xba,0xbe,0x7e,0x7f,0xbf,0x7d,0xbd,0xbc,0×7c,0xb4,0x74,Ox75,0xb5,0x77,0xb7,0xb6,0x76,Ox72,0xb2,0xb3,0x73,0xb1.,0x71,Ox7O,OxbO,0x50,0x90,0x91.OX51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9c,0x5c,0x5d,0x9d,0x5f,0x9f,0x9e,0x5e,0x5a,0x9a,0×9b,0x5b,0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4b,0x8b,0x8a,0x4a,0x4e,0x8e,0x8f,0x4f,0x8d,0x4d,0x4c,0x8c,0x44,0x84,0×85,0x45,0x87,0x47,0x46,0x86,0×82,0x42,0x43,0x83,0x41,0x81,0x80,0x40);/*实现CrC功能函数*/staticuint16_tCRC16(uint8j*puchMsg,uint1.6-tUSData1.en)(uint8-tUchCRCHi=Oxff;uit8-tUchCRC1.o=Oxff;uint1.6_tu1.ndex;WhiIe(USData1.en-)u1.ndex=uchCRCHi*(puchMsg+);UChCRCHi=UChCRCWauchCRCHiMndex;uchCRC1.o=auchCRC1.ou1.ndexJ;)returnuchCRCHi<<8uchCRC1.o;)保存系统日志参数,每实现写日志操作后都需要保存当前的参数值,防止意外丢失。voidsave_system_1.og_param(void)(uint32-ti=0;uint32-taddr=O;uint32-tremainbyte=O;uint32_tStarjaddr;intIen=sizeof(sys_1.og_param_t);uint8jwpdata三(uint8_t*)&Sys1.ogParam;f1.ash_tab1.e_t*f1.ash_tmp=get_f1.ash_tab1.e(F1.ASH_SYS1.OG_PARA_ZONE);校验参数7gp_sys_1.og->crc_va1.magic=SYSTEM_1.OG_MAGIC_PARAM;gp_sys_1.og->crc_va1.1.en=sizeof(sys1.ogparamt)sizeof(sing1.e_sav_t);8P_sysog->crc_va1.crc=CRC16(&pdatasizeof(sing1.e_sav_t),gp_sys_1.og->crc_va1.1.en);start_addr=gp_sys_ram->system_1.og_param_addr;剩余内存不筋写,则重新从起始地址开始写,实现环形存储功能*/if(start-addr+1.en)>f1.ash_tmp->end_address)start_addr=f1.ash_tmp->start_address;8P_sys_ram->$ystem_1.og_param_addr=start-addr+en;首地址存储,擦除整个系统日志参数存储区,如果划分的内存较大,可能出现第一次擦写等待时间较长,但实际应用嵌入式设备应该不公占用太多的内存存储系统日志,只当为辅助使用,有额外应用可自行实现*/if(f1.ash_tmp->start_address=start-addr)*for(i=f1.ash_tmp->$tart_address;i<f1.ash_tmp->end_address;i+三F1.ASH_SECTOR_SIZE)f1.ash_erase(F1.ASH_SYS1.OG_PARA_ZONE,SECTOR-BASEi),F1.ASH_B1.oeK_4K);7doif(addr+F1.ASH_B1.OCK_64K_SIZE)<=f1.ash_tmp->end_address)f1.ash_erase(F1.ASH_SYS1.OG_PARA_ZONE,B1.OCK_64K_BASE(i),F1.ASH_B1.OCK_64K);addr=F1.ASH_81.OCK_64K_SIZE;e1.seif(addr+F1.ASH_B1.OCK_32K_SIZE)<=f1.ash_tmp->end_address)f1.ash_era$e(F1.ASH_SYS1.OG_PARA_ZONE,B1.OCK_32K_BASE(i),F1.ASH_B1.OCK_32K);addr=F1.ASH_81.OCK_32K_SIZE;e1.seif(addr+F1.ASH_SECTOR_SIZE)<=f1.ash_tmp->end_address)f1.ash_erase(F1.ASH_SYS1.OG_PARA_ZONE,SECTOR_BASE(i),F1.ASH_B1.OCK_4K);addr=F1.ASH_SECTOR_SIZE;e1.sebreak;whi1.eaddr<f1.ash_tmp->end_address);remainbyte=F1.ASH_SECTOR_SIZE-(start_addr%F1.ASH_SECTOR_SIZE);if(remainbyte>1.en)remainbte=1.en;whi1.e(1)f1.ash_write(F1.ASH_SYS1.OG_PARA_ZONE,StarJaddr,pdata,remainbyte);if(remainbyte=1.en)break;e1.sePdata+=remainbyte;start_addr+=remainbyte;Ien-=remainbyte;remainbyte=(1.en>F1.ASH_SECTOR_SIZE)?F1.ASH_SECTOR_SIZE:1.en;)导入系统日志默认参数接口,初始化默认参数或者移除日志。void1.oad_system_1.og_defau1.t_param(void)(/系统日志默认参数7/«目录环写状态标志*/gp_sys_1.og->system_1.og.cata1.og_cyc1.ic_status=0x00;/目录项个数*/gp_sys_1.og->system_1.og.cata1.og_num=0;/,日志环写标志,1:环写状态7gP_sys_1.og->system_1.og.1.og_cyc1.ic_status=0;/*设置默认值,实际会重新从RTC获取最新时间*/gP-syS-og->system-1.og.1.ogJatest-time.Year=2019;gP_sys_1.og->$y$tem_1.og.1.ogJatest_time.Month=5;gP_sys_1.og->system_1.og.1.og_1.atest_time.Day=8;8P_sys_1.og->system_1.og.1.og_1.atest_time.Hour=13;gP_sys_1.og->system_1.OgJOg_1.atest_time.MinUte=14;8P_sys_1.og->$ystem_1.og.1.og_1.atest_time.Second=10;日志写位置从。开始/gP_sys_1.og->$ystem_1.og.write_pos=0;gP_sysJog->system_cata1.og.1.og_addr=0;gP_sys_1.og->system_cata1.og.1.og_id=0;gP_sys_1.og->system_cata1.og.1.og_offset=0;gP_sys_1.og->system_cata1.og.1.og_time.Year=2019;8P-SysJ8->system-cata1.og.1.ogJime.Month=5;gP_sys_1.og->system_cata1.og.1.og_time.Day=8;8P-SysJ8->system-cata1.og.1.ogJime.Hour=12;gP_sys_1.og->system_cata1.og.1.og_time.Minute=12;8P_sys_1.og->system_cata1.og.1.og_time.Second=14;gp_sys_1.og->crc_va1.magic=SYSTEM_1.OG_MAGIC_PARAM;导入默认参数后进行保存*/save_system_1.og_param();设备开机或者发位都会进行导入系统日志参数操作,恢史日志读写参数,参数区为频繁读写操作区域,每一次写操作都会进行一次偏移,有效的导入参数方法是从参数区结束地址到起始地址进行扫描,扫描不到合法的参数则会导入默认日志参数./*参数初始化,在终端启动时调用*/int1.oad_system_1.og_param(void)(uint32-ti=0;SingIe_sav_tpsav;uint32-tend-addr;Uint32_tintera1.=sizeofsys_1.og_param_t);intdata_1.en=sizeofsys_1.og_param_t)-sizeofsing1.e_sav_t);uint8j"pram=(int8jw)&Sy$1.ogParam;f1.ash_tab1.e_t*f1.ash_tmp=get_f1.ash_tab1.e(F1.ASH_SYS1.OG_PARA_ZONE);f1.ash_tmp->end_addressend_addr=f1.ash_tmp->end_addressf1.ash_tmp->start_addre$s)%intera1.;for(i=end_addr-intera1.;i>f1.ash_tmp->start_address;i-=intera1.)f1.ash_read(F1.ASH_SYS1.OG_PARA_ZONE,i,(uint8j")&psav,sizeof(sing1.e_sav_t);if(psav.magic=SYSTEM_1.OG_MAGIC_PARAM)&&(psav.1.en=datajen)(f1.ash_read(F1.ASH_SYS1.OG_PARA_ZONE,i+SiZeof(SingIe_sav_t),&pramsizeof(sing1.e_sav_t)J,datajen);ifpsav.crcI=CRC16&pramsizeofsing1.e_sav_t),datajen)continue;gp_sy$_ram->system_1.og_param_addr=i;1.ogJnfo("1.oadSystem1.ogParamAddr(0x%08x!",8P_sys_ram->sy$tem_1.og_param_addr);returnO;)扫描不到合法的参数,导入默认系统日志参数”/1.oad_system_1.og_defau1.t_param();/获取日志写地址8P_$ys_ram->$YStem_1.og_param_addr=f1.ash_tmp->start_address;1.ogJnfo("1.oadSystem1.ogParamAddr(Defau1.t)0×%08x!11,gP_sys_ram->system_1.og_param_addr);return1;读写系统日志目录接口,读写指定日志索引目录信息。实际实现会定义最新的目录信息存储在日志参数区,当日期发生改变,则表示当前目录信息已经完结.将圾新的目录信息录入日志目录区保存,最多每天写入一次目录区。/*读取日志目录区指定日志索引目录信息”/intsystem_cata1.og_read($ystem_cata1.og_t*cata1.og,uint32_tid)(uint32_taddr;intr1.en=SiZeof(SYStem_Cata1.Og_t);uint8J*pbuf=(Uint8_t"cata1.og;f1.ash_tab1.e_t"IashJmp=get_f1.ash_tab1.e(F1.ASH_CA-TA1.OG_ZONE);if0=id)return-1;addr=f1.ash_tmp->start_address+(r1.en*(id-1);ifaddr>f1.ash_tmp->end_addre$s)return-1;returnf1.ash_read(FI_ASH_CATA1.OG_ZONE,addr,pbuf,r1.en);/*写日志目录区目录信息,/intsystem_cata1.og_write(svstem_cata1.og_t*cata1.og,uint32_tid)(uit32-tstart_offset;Uint32_tStarJaddr;uint32_tstart-base;Uint32_tremainbyte;intw1.en=SiZeof(SyStem_CataIog_t);uint8j*pdata=(uint8_t*)cata1.og;f1.ash_tab1.e_t*f1ash_tmp=get_f1.ash_tab1.e(F1.ASH_CA7A1.0G_Z0NE);if(O=id)return-1;start-addr=f1.ash_tmp->start_addressw1.en*(id-1);if(start-addr+w1.en)>f1.ash_tmp->end_address)start-addr=f1.a$h_tmp->start_addre$s;本扇区剩余空间大小*/remainbyte=F1.ASH_SECTOR_SIZE-(start_addr%F1.ASH_SECTOR_SIZE);写入数据长度小r本扇区剩余长度,直接写入/ifremainbyte>w1.en)remainbyte=w1.en;)写目录次数不会太频繁.视具体情况改写操作实现7whi1.e(1)Start_base=SECTOR_BASE(Start_addr);start_off$et=SECT0R_0FFSET(start_addr);f1.ash_read(F1.ASH_CATA1.OG_ZONE,start-base,Seetojbuf,F1.ASH_SECTOR_SIZE);f1.ash_erase(F1.ASH_CATA1.OG_ZONE,start_base,F1.ASH_B1.0CK_4K);memcpy(char)sector-bufstart-offset,pdata,remainbyte);f1.ash_write(FI_ASH_CATA1.OG_ZONE,Start_base,sector_buf,F1.ASH_SECTOR_SIZE);if(remainbyte=w1.en)break;e1.sepdata+=remainbyte;start_addr+=remainbyte;w1.en-=remainbyte;remainbyte=(w1.en>F1.ASH_SECTOR_SIZE)?F1.ASH_SECTOR_SIZE:w1.en;returnO;)打印系统日志目录区信息,可实现通过指令查询到目录区信息.intsystem_cata1.og_a1.1._print(void)(inti=0;system_cata1.og_tcata1.og;printf("System1.ogCommand1.nformation:rn");printf("QerySpecifies1.og:AT+CATA1.OG=<1.OGJD><CR><1.F>rn");printf("QueryA1.1.1.og:AT+CATA1.OG=<OxCRx1.F>rnrnM);printf("QueryA1.1.SystemCataIogAAn");printf("1.OGJD1.OG_DATE1.OG_ADDR1.OG,OFFSETrn");for(i=0;i<gp_sys_1.og->system_1.og.cata1.og_num;i+÷)*当前最新目录信息*/if(i=(gp_sy$_1.og->system_cata1.og.1.og_id-1)cata1.og=gp_sys_1.og->system_cata1.og;获取当前最新目录信息/e1.sesystem_cata1.og_read(&cata1.og,i+1);printf("%d%04d-%02d-%02d0x%08X%drn",cata1.og.Iogjd,cata1.og.1.og_time.Year,cata1.og.1.ogJime.Month,cata1.og.1.og_time.Day,cata1.og.1.og_addr,cata1.og.1.og_off$et);memset(char*)&cata1.og,O,sizeof(system_cata1.og_t);)returnO;读取指定日志目录索引信息接口,可指定日志索引或者读取全部日志数据。intsystem_1.og_task(intargc)(intr1.en=0;uint32-toffset,Start_addr,end_addr;SVStemqta1.Og_tcata1.og;f1.ash_tab1.e_ttAashJmp=get_f1.ash_

    注意事项

    本文(嵌入式系统日志记录的简易方法.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开