一种基于模板的C代码自动生成方法

北京市中科医院 https://myyk.familydoctor.com.cn/2831/

在做C代码项目标光阴,咱们希冀做到代码的高复用,高复用象征着代码的高设置性,即经过简朴的设置更正抵达复用代码的目标。假设代码高复用,帮助伶俐的设置,那末全面也许在上边做一个更简朴的设置器材,用来更正代码设置,这么做关连于供给也许设置的.c/.h源代码有一些长处:

设置更改为简朴领会的GUI描绘,设置人员不需求深入领会C代码即也许实行设置

假设你不过想封装一个库给你的客户,你也许同时供给如此一个提倡器材,即也许庇护你的重心代码,也也许让客户简朴上手

但是,也许实行基于模板的主动代码的前提是,你的原始C代码要充沛伶俐,余下需求做的便是依据用户的输入消息,调动某些也许更正的参数也许挪用,而这些设置也许储备在一些准则的数据储备格式中(如,xml,json,乃至于数据库等等)结尾剖析设置数据,生成设置关连的.c和.h文献。

在这一篇文章中咱们将经过一个示例,来用一种简化的方法诠释这类代码生成的观点,指望读者能坐井观天,赢得一些灵感,并在劳动中也许运用起来。

舒适提醒

技艺性文章,也许会包含洪量代码和图片,也许拜候原文,也许电脑拜候赢得更好的涉猎呈现,其它代码也可在GitHub上找到,详细见文中链接。

1

方针剖析

咱们将以汽车上普及哄骗到的UDS协定中罕用到的0x31效劳做为主动代码的实行方针,该效劳用于哀求ECU履行特定的函数(效劳代码),而详细函数(效劳)的实质则是由不同的OEM本人界说的,这是一个很模范的也许用主动代码生成来责罚的场景,正常来讲0x31的关连的c代码会长下边这个状态:

constUDS_Routine_Ctrl_TUDS_RountineControl_Services[]={{0xFF00,(UDS_Routine_Ctrl_Func_T)Erase_Flash_Start,(UDS_Routine_Ctrl_Func_T)NULL,(UDS_Routine_Ctrl_Func_T)NULL,0x01},{0xDF00,(UDS_Routine_Ctrl_Func_T)Check_CRC_Start,(UDS_Routine_Ctrl_Func_T)NULL,(UDS_Routine_Ctrl_Func_T)NULL,0x00},{0xFF01,(UDS_Routine_Ctrl_Func_T)Check_Dependencies_Start,(UDS_Routine_Ctrl_Func_T)NULL,(UDS_Routine_Ctrl_Func_T)NULL,0x01}};

时常来讲在协定栈重心代码中,会盘查宛如如此表格中的元素,表格每一个元素代表一个自效劳的关连设置,重心代码会依据收到的子效劳ID(宛如于0xFF00,0xDF00这些)而后在这张表格中找到对应的设置,进而依据这些设置去履行反响的行为。

是以针对不同的OEM需求,协定栈针对0x31效劳的重心责罚算法是一致的,差别只是是子效劳的实质,而子效劳的实质设置,笼统出来便是:

ID–子效劳的ID

startFunc–启动函数,用来启动效劳

stopFunc–中止函数,用来中止效劳

resultFunc–猎取完毕函数

access_level–拜候品级

而后,主动代码生成的关键便是经过一个程序,也许读取设置数据,数据中包含上边这些消息,而后生成须要的.c和.h代码,而在这些.c也许.h中,有许多实质是稳固的,比如UDS_RountineControl_Services这个数组的称号和典型,等等,是以你也许这么设想这个流程,咱们会创立一些模板,模板中含有这些稳固的部份,而可变的部份则留空(宛如于填空题),而留空部份则依据设置数据,动态的填入,终究填完统统的空就产生了完全的C代码实质,将这些实质保管为.c也许.h文献就完结了代码生成的流程。

2

趁手的器材

依据上文的剖析,主动代码生成器材有几个构成部份:

设置数据录入:便是人机界面,也许哄骗PyQt做桌面版(也许参考本站的PyQt系列教程),也也许做成网页运用,这不是本篇文章的重心,是以,咱们本篇文章的代码不会实行这部份

设置数据储备:json,xml,数据库,也许更简简朴点哄骗变量寄放在内存中(假设不需求保管到电脑上供分享也许下次哄骗),本文哄骗json来做为演示

将设置更改为代码:将填空题填完的流程,咱们哄骗Python的第三方模板库实行,有许多可选的好比Mako,Jinja等,这是本篇文章要陈说的重心部份,咱们将哄骗Jinja2模板引擎

代码模板:留有空位的填空题,也是C代码中稳固的部份

Python中的模板引擎主若是协做web框架实行动态生成html,实质上来

说html不过给涉猎器用来做剖析的文本文献,而相同的C源代码实质上来讲是给编译器用来做编译的文本文献,是以哄骗web模板引擎来动态生成C源代码是没有任何题目的。

安设,并导入库

pipinstalljinja2

importjsonfromjinja2importEnvironment,FileSystemLoader,select_autoescape

3

筹备填空题–创立模板

首先咱们要筹备好填空题,所谓填空题便是代码模板文献,模板中再有稳固实质和可变实质,稳固实质为C源代码中不需求动态生成的部份,而可变实质则是依赖于用户给定的设置数据来生成的部份。

针对稳固实质,很简朴的,在模板文献中便是通俗的合适C语言语法的文本。

针对可变实质,在模板文献中则是安设模板引擎语法安顿的占位符,这些实质将由模板引擎连系设置数据(也便是这些空位的谜底)举办衬着生成。

依据咱们在第一章节的剖析,咱们希冀针对一个自效劳,设置5个设置项,而用户也许增加随意个自效劳,同时针对自效劳的效劳函数,他们的典型都是相同的(返回值和参数),是以咱们还也许生成反响的效劳函数框架。

实行一系列高雅的模板,需求把握模板引擎的语法,Jinja的语法也许在这个链接中找到:


转载请注明:http://www.aierlanlan.com/rzgz/1140.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了