单片机学习小组
直播中

纯纯纯牛奶

13年用户 522经验值
私信 关注

介绍一种嵌入式框架模板的构建方案

介绍一种嵌入式框架模板的构建方案

回帖(1)

姜葳

2022-2-22 10:55:59
嵌入式框架构建方案


关键内容




  • python3.x
  • 真子
  • yaml



实战演习
main.py
import yaml
from mako.template import Template
import os


def deep_merge_dict(dict1, ditc2):
    for key in ditc2:
        if key not in dict1:
            dict1.setdefault(key, ditc2[key])
        else:
            if isinstance(ditc2[key], dict):
                deep_merge_dict(dict1[key], ditc2[key])
            else:
                pass
def load_yaml(dir_):
    fn_dic = {}
    os.chdir(os.getcwd())
    for dir_lst in os.walk(dir_):
        fn_lst = dir_lst[2];
        for fn in fn_lst:
            if fn.endswith('.yml'):
                fn_path = dir_lst[0] + '\' + fn;
                if fn_path not in fn_dic:
                    fn_dic.setdefault(fn, fn_path);
                else:
                    print("- Error: 1");
            else:
                pass
    return fn_dic


yaml_path = load_yaml("src")


data = {}
for key in yaml_path:
    yaml_fs = open(yaml_path[key], 'r', encoding = "utf-8")
    yaml_data = yaml_fs.read()
    yaml_fs.close()
    data1 = yaml.load(yaml_data)
    deep_merge_dict(data, data1)
l_data = data[':RSTMGR']['RST'].copy()


for key in l_data:
    if isinstance(l_data[key]['PRIO'], str):
        if l_data[key]['PRIO'] == 'LOW':
            l_data[key]['PRIO'] = -1
        elif l_data[key]['PRIO'] == 'HIGH':
            l_data[key]['PRIO'] = 0xFFFFFFFF
        else:
            print("err-----")


t_data = sorted(l_data.items(), key=lambda x:x[1]['PRIO'], reverse=True)
t = Template(filename = "test.tpl.c", module_directory = "C:/Python34/tpl")
f = open("test.txt", 'w')
txt = t.render(data = data, t_data = t_data)
txt = txt.replace('r', '')
f.write(txt)
f.close()


资源文件.yml
:RSTMGR:
    RST:
        Test:
            OWNER: Test
            PRIO: 100
            FNCT: Test_vReset
:RESMGR:
    INIT:
        ActiveBios:
            Test:
                OWNER: Test
                PRIO:  100
                FNCT:  Test_vInit
        ActiveIgn:
            Test:
                OWNER: Test
                PRIO:  100
                FNCT:  Test_vInitIgn
               
:CYCMGR:
    CYC:
        CYCMGR_nen100ms:
            Test:
                OWNER: Test
                PRIO: 100
                FNCT: Test_vMain
                DEPCY_RESON: [ActiveIgn]
                DEPCY_RESOFF: []
               
:EVMGR:
    EVENT:
        TestUpdate:
            OWNER: Test


模板
<%def name="print_k(area, i=0)">
    % for k in area:
<%_str = "--" * i%>
        % if isinstance(area[k], dict):
${_str}${k}:
<%print_k(area[k], i+1)%>
        % else:
${_str}${k}: ${area[k]}
        % endif
    % endfor

${print_k(data)}


% for i in range(0, len(t_data)):
    ${t_data[1]['FNCT']}, /* RST_${t_data[1]['OWNER']} */
%endfor
举报

更多回帖

×
20
完善资料,
赚取积分