1.一种优化嵌入式系统诊断打印的方法,其特征在于,包括以下步骤:步骤一:定义诊断函数宏A和函数原型B,设置诊断函数宏A(程序模块ID,过滤类型,格式化字符串);
函数原型B(格式化字符串哈希值,参数内存尺寸,程序模块ID,过滤类型,格式化字符串);
步骤二:定义诊断函数宏A 与函数原型B的引用关系,#define A(程序模块ID,过滤类型,格式化字符串) ,函数原型B(0,0,程序模块ID,过滤类型,格式化字符串,##__VA_ARGS__),函数原型B中的参数若在诊断函数宏A中不存在,则使用缺省定义,包括如下:
1)格式化字符串哈希值:在诊断函数宏A中不存在,缺省使用特征值0,0值表征为启用打印优化功能;
2)参数内存尺寸:在诊断函数宏A中不存在,缺省使用特征值0,0值表征参数内存的大小为0,即,打印函数不存在变参列表;
步骤三:使能编译器在汇编C代码之前生成*.i 文件,读入C文件中的引用文件并进行宏扩展,生成一个高级语言汇编前的临时文件,其次在编译规则里插入代码字符处理脚本,功能为提取函数原型B调用代码串S,根据应用程序传入的“格式化字符串哈希值”规则,若为0,则对“格式化字符串”参数串进行哈希转换为整形值n,并根据格式符‘%’计算参数内存大小为整形m,单位为字,然后修改S中的“格式化字符串哈希值”参数0为n,“参数内存尺寸”参数0为m,得到一个新的代码串S’,最后替换C文件中的函数原型B的调用代码串S为S’,同时每个编译单位文件都要生成一个诊断数据库文件, 编译单位文件的每个item为格式化字符串哈希值与“格式化字符串”参数的一一映射;
步骤四:编译规则对步骤三步骤中的每个编译单位文件重复执行步骤三的任务,直到整个编译项目的所有编译单位都完成了步骤三的任务;
步骤五:函数原型B运行时,获取“格式化字符串哈希值”参数,根据“参数内存尺寸”参数获取参数内存大小m,通过标准C的va_start获取变参列表,并通过标准C的va_arg宏和m快速获取参数内存,接着把参数内存和格式化字符串哈希值按诊断帧格式组织成一个二进制负载;
步骤六:诊断IO任务把流缓存发送到嵌入式系统外设接口;
步骤七:上位机软件接收IO收到的数据流,识别出每个诊断负载的边界,并分拣出一个个完整的诊断负载包,按照诊断帧格式结构化提取出诊断负载的格式化字符串哈希值和参数二进制内存,接着从诊断数据库里寻找该格式化字符串哈希值对应的参数格式化字符串,调用格式化函数对参数二进制内存进行格式化,进而得到诊断打印的格式化串,最后把格式化串输出到终端显示器上。
2.根据权利要求1所述的优化嵌入式系统诊断打印的方法,其特征在于,所述步骤一中,
程序模块ID:整形,指示这个诊断信息的所有者;
过滤类型:整形,用比特域指示该模块的诊断信息分类,用于过滤诊断信息;
格式化字符串:以‘%’来表示格式符,格式符类型同C99中C语言库函数printf的格式化符,并简化了支持的格式符类型,当前为提高打印效率,只支持32bit整形,单精度浮点数,双精度浮点数的格式化。
3.根据权利要求1所述的优化嵌入式系统诊断打印的方法,其特征在于,所述步骤一中,
函数原型B(格式化字符串哈希值,参数内存尺寸,程序模块ID,过滤类型,格式化字符串),
其中,格式化字符串哈希值:把“格式化字符串”转化成一个32bit的整形格式化字符串哈希值;
参数内存尺寸: 指示变参的参数内存大小,计量单位为字。
4.根据权利要求1所述的优化嵌入式系统诊断打印的方法,其特征在于,所述步骤二中,格式化字符串哈希值为:
0:指示编译脚本需要对“格式化字符串”进行格式化字符串哈希值计算,转换后的格式化字符串哈希值重新赋值给“格式化字符串哈希值”参数;
0xFFFFFFFF: 指示编译脚本不需要对“格式化字符串”进行格式化字符串哈希值计算;
编译脚本进行字符串转换时负责对0,0xFFFFFFFF 这两特殊值的散列冲突。