Keil C51 插件 检测所有if语句

news2024/11/18 20:29:17

 此插件解决的问题

Keil 插件 -- Python 代码

import chardet, sys, glob, re
from pathlib import Path

from collections import deque

# 变量名字典 key--数据名 value--数据s类型
variable_dic = {}

# 初始化一个空的二维数组
matrix = []
# 列表的头数据
header_list = []
# 列表的值
value_list = []




# if (V_Data>35&&V_Data<790)     //零上温度校准\r
# if (V_Data==Temp_Tabe[i][1])\r
# if ((Usart1_Receive_Buff[4]==0x01)&&(Usart1_Receive_Buff[Receive_Count-1]==Xor_Data1))\r


# uint AAA
# uint AAA,BBB
# uint code AAA,BBB  -- 变量名和类型添加
def type_variale_name_split(row_text):
    type_header = row_text.split()[0]
    if 'xdata' in row_text or 'code' in row_text:
        type_header = ' '.join(row_text.split()[0:2])

    if ',' in row_text: # uchar data A,B  uint a,c,d
        for item in row_text.split(','):
            T = list(map(str.strip, item.split()))[-1]
            add_key(list(map(str.strip, item.split()))[-1], type_header)

    else: # uchar data A  uint B
        row_text_list = row_text.split()
        if 'xdata' in row_text or 'code' in row_text:
            add_key(row_text_list[2].strip(),type_header)
        else:
            add_key(row_text_list[1].strip(),type_header)

# uint AA=0
# uint AA=0,BB=0
# uint xdata AAA=0
# uint xdata AAA[BBB]={0}  -- 变量名和类型添加
def type_variable_name_equal_split(row_text):
    # 裁剪定义的数组
    if '{' in row_text:
        row_text = row_text.split('{')[0]

    type_header = row_text.split()[0]
    if 'xdata' in row_text or 'code' in row_text:
        type_header = ' '.join(row_text.split()[0:2])

    # uint AA=0,BB=0
    # uint code AA=0,BB=0,CC=1
    # uint code A=0;
    if ',' in row_text:
        for item in row_text.split(','):
            type_header_variable = item.split('=')[0]
            # uint AA
            if type_header in type_header_variable:
                add_key(type_header_variable.split(type_header)[1].strip(), type_header)
            else: # AA
                add_key(type_header_variable.strip(), type_header)
    else: # uint AA=0
        # uchar   xdata B=0
        type_header_variable_else = row_text.split('=')[0]
        type_header_variable_else_list = list(map(str.strip, type_header_variable_else.split()))
        add_key(type_header_variable_else_list[-1],type_header)

# 变量名和类型添加
def add_key(key, value):
    # 若key存在
    if key in variable_dic:
        return
    else:
        variable_dic[key] = value

# 添加if语句 -- if 语句分割添加
def add_variable_list(string):
    # (V_Data>35&&V_Data<790)
    try:
        cut_if_string = string.split('if')[1].strip()
        if '(' not in cut_if_string:
            return

        pattern_header = r'\([^!=|<>]+'
        list_header = re.findall(pattern_header, cut_if_string)[0].split('(')[-1].strip()
        # 若存在, 则添加
        if list_header in variable_dic:
            list_header = variable_dic[list_header] + ' ' + list_header
        else:
            list_header = '未查询到  ' + list_header
        # 若不存在, 则不添加
        wait_list = [list_header, string]

        # 若头文件存在
        for row in matrix:
            if list_header == row[0]:
                row.append(string)
                return

        # 若不存在, 则添加
        matrix.append(wait_list)
    except IndexError:
        print("报错了")


# 获取一个文件的内容
def get_bit_file_content(filename, default_encoding='gb2312'):
    file = ''
    content = ''
    try:
        file = open(filename, 'rb')
        content = file.read()  # 以字节方式读取
    except:
        print("文件" + filename + "打开失败")
    finally:
        file.close()
    source_encoding = chardet.detect(content)['encoding']
    string = content.decode(source_encoding if source_encoding else default_encoding, 'ignore')

    return string

# 获取所有的if语句分割后添加到二维数组中
def get_all_if_matrix(filename):
    string = get_bit_file_content(filename)

    # 正则 if(a==0)
    pattern_type = r"(\bif\b.+)"
    matches = re.findall(pattern_type, string)

    # ['if (V_Data>35&&V_Data<790)     //零上温度校准\r', 'if (V_Data==Temp_Tabe[i][1])\r',]
    for item in matches:
        add_variable_list(item)


# 获取所有 变量名和类型 添加到字典中
def get_all_variable_dict(filename):
    string = get_bit_file_content(filename)

    # 正则 int AAA=0
    pattern_int = r"(?:\n\b(?:sbit|bit|uchar|uint|ulong|int|long|float|char|double)\b[^;)]+)"
    matches_int = re.findall(pattern_int,string)

    # 变量名添加
    for m_int in matches_int:
        # 剔除函数
        if '(' in m_int:
            continue
        # 剔除 =0
        m_int = m_int.lstrip('\n').strip()
        if '=' in m_int:
            # uint AAA=0,B=0
            type_variable_name_equal_split(m_int)
        else:
            # uint AA
            type_variale_name_split(m_int)


if __name__ ==  "__main__":
    try:
        filename = sys.argv

        filelist = sum(list(map(glob.glob, filename[1:])), []) #获取所有文件名
        print('检测到的文件:')
        for item in filelist:
            print(item)

        # 获取所有的变量和类型
        list(map(get_all_variable_dict, filelist))

        # 获取所有的if语句
        list(map(get_all_if_matrix, filelist))


        # 获取桌面路径
        desktop_path = Path.home() / "Desktop"
        # print(desktop_path / 'output_all_if.txt')
        with open(desktop_path / 'output_if.txt', 'w') as fp:
            for row in matrix:
                fp.write(row[0]+'\n')
                for a_bit in row[1:]:
                    fp.write('    '+a_bit)
                fp.write('\n')

        print('查询完成,文件保存至:')
        print("  " + str(desktop_path / 'output_all_if.txt'))

    except Exception as e:
        print(str(e))

 需要修改的地方

上面代码,所需要的包,自行导入

 Python 生成 exe

pip install pyinstaller     -- 自行安装包

pyinstaller -Fw .\Select_All_if.py 

Keil C51 插件安装

"$E*.c" "$E*.h" -- 表示当前的所有文件

 效果

 

 不会改的,自行留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2066017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tina5 Linux开发

准备开发环境 首先准备一台 Ubuntu 20.04 / Ubuntu 18.04 / Ubuntu 16.04 / Ubuntu 14.04 的虚拟机或实体机&#xff0c;其他系统没有测试过出 BUG 不管。 更新系统&#xff0c;安装基础软件包 sudo apt-get update sudo apt-get upgrade -y sudo apt-get install build-ess…

保护网站安全,了解常见的几种网络攻击

随着互联网技术的迅猛发展&#xff0c;网站作为信息展示和交互的重要平台&#xff0c;面临着日益复杂的网络攻击威胁。从简单的口令入侵到复杂的分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;网络攻击手段层出不穷&#xff0c;给网站所有者带来了巨大的挑战。今…

sqlilabs less21-25关手工注入

第21关 一.登录页面 二 .Burp Suite 抓包&#xff0c;进入重放器 三.查询数据库 先进行编码 )and updatexml(1,concat(1,database()),1)# 四.查表&#xff0c;先进行编码 )and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where…

王老师 linux c++ 通信架构 笔记(五)编译后生成的 nginx 可执行程序的启动与 nginx 选项

&#xff08;22&#xff09; 启动 nginx &#xff1a; 上网测试一下&#xff1a; 端口号 介绍&#xff1a; &#xff08;23&#xff09; 因为 nginx 监听知名端口号 80 &#xff0c;http 服务。也可以知名端口号&#xff0c;格式如下&#xff1a; 生产环境下可以设置 ngi…

扬中网站建设创建网站

扬中网站建设&#xff1a;打造企业更强大的数字名片 随着互联网的发展&#xff0c;网站已经成为企业不可或缺的一部分。对于扬中市的企业而言&#xff0c;建设一个专业的网站不仅能提升品牌形象&#xff0c;更能拓展市场&#xff0c;提高竞争力。本文将为您介绍扬中网站建设的重…

【jetson交叉编译(1)】nvidia jetson 系列开发板交叉编译方法,CUDA依赖程序

资源 Toolchain Information jetson-linux jetpack 文章目录 资源1 方案1 qemu-aarch64-static和docker 容器编译jetson2 方案2 模拟器交叉编译器2.1 应对库缺失的情况&#xff0c;进行环境准备2.1.1 模拟器(方案1)2.1.2 在jetson上面进行安装&#xff08;方案2&#xff09; 2…

yolov8行人车辆检测与计数系统

yolov8行人车辆检测与计数系统&#xff08;PythonYOLOv8deepsort车辆追踪深度学习模型清新界面&#xff09; &#xff08;1&#xff09;YOL v8算法实现&#xff0c;模型一键切换更新&#xff1b; &#xff08;2&#xff09;检测图片、视频等图像中的各目标数目&#xff1b; &am…

2024数学建模国赛水奖攻略(也可适用其他比赛)

很多同学私信我&#xff0c;问学校要求参加数模比赛&#xff0c;但对建模和编程不太擅长&#xff0c;又不想浪费时间&#xff0c;该怎么办。今天我想和大家分享一些关于数学建模比赛的经验&#xff0c;特别是如何水奖的攻略。 一、选题技巧 有句话说得好&#xff0c;选择比努力…

彻底解决win7系统文件夹选项高级设置是空白

需求背景 win7系统的文件夹选项-高级设置里面是空白的,效果图如下。 解决方法 1、新建txt文本文档 2、文档内容 复制下面的内容到txt文件中,然后保存。 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Ad…

第七届强网杯-PWN-【WTOA】

文章目录 参考WebAssemblyWasmtime调试逆向源码exp 参考 WebAssembly实践指南——C和Rust通过wasmtime实现相互调用实例 WebAssembly WebAssembly是一种可移植的二进制指令集格式&#xff0c;其本身与平台无关&#xff0c;类似于Java的class文件字节码。 WebAssembly本来的…

Springsecurity中的Eureka报错:Cannot execute request on any known server

完整报错信息&#xff1a; com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 报错体现&#xff1a; 访问eureka控制面板&#xff1a; 访问测试地址&#xff1a; 控制台报错&#xff1a; 可能的报错原因&#xff…

Python之列表解析和用matplotlib模块绘制图形

列表解析用matplotlib模块绘制成图形导入模块numpy阵列将列表转为阵列arrange函数创建阵列广播 使用matplotilib将阵列绘制成图 列表解析 列表解析式用紧凑的方式来构造列表。 语法&#xff1a; [表达式 for循环 条件] 例如&#xff1a;要得到0-20的偶数列表。需要在0-20中循环…

CyberScraper-2077+simple-one-api:使用大模型爬虫

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 swift与Internvl下的多模态大模型分布式微调指南&#xff08;附代码和数据&#xff…

IT6113: 高速MIPI DSI 4通道转8通道转接芯片资料

1、产品概述&#xff1a; 芯片将 SOC输出的4通道高速 Mipi DSI 视频转换为8通道半速 DSI 显示器&#xff0c;用于平板电脑、智能手机、笔记本电脑、 VR、智能手表等应用&#xff0c;分割器模式也可用。 2、产品说明 &#xff1a; IT6113 MIPI DSI 视频桥是一个4通道进、8通道出…

2024安卓iOS免签封装源码/解决APP误报毒/可打包和上传APP/自动实现5分钟随机更换签名

源码简介&#xff1a; 2024全新安卓iOS免签封装源码&#xff0c;它可处理apk报毒&#xff0c;解决APP误报毒。不仅可打包APP&#xff0c;也可上传APK。自动实现5分钟随机更换包名和签名系统源码。 解决app误报毒&#xff0c;可打包APP可上传APK&#xff0c;并且自动实现5分钟…

ShardingSphere导致的NPE

1. 项目背景 工程内使用shardingsphere支持分库分表&#xff0c;上层使用的MybatisPlus&#xff0c;有一张表的操作总是报NullPointException。 2. 异常堆栈 ### SQL: INSERT INTO t_tg_message ( update_id, from_id, from_user_name, chat_id, type, data, text, create_…

领夹麦克风哪个品牌音质最好?一文揭秘国内最好的麦克风品牌

在数字化直播与Vlog盛行的今天&#xff0c;无线领夹麦克风凭借其便捷性与高音质&#xff0c;成为了内容创作者们的必备好物。但随着市场的迅速扩张&#xff0c;无线领夹麦克风领域也悄然滋生了一系列乱象。品牌众多&#xff0c;质量却良莠不齐&#xff0c;消费者稍有不慎便可能…

Ollama是什么?安装部署指南

Ollama是什么&#xff1f; 一个本地部署运行大模型的工具&#xff0c;一行命令一键启动&#xff0c;支持linux、windows和mac操作系统的安装。 Ollama支撑哪些大模型&#xff1f; 访问&#xff1a;https://ollama.com/library&#xff0c;列表下的大模型&#xff0c;它都支持…

centos7 redis安装+开机启动(6379+6380)

redis安装 步骤1-下载 下载地址&#xff1a;Index of /releases/ 步骤2-安装 Centos安装Redis-CSDN博客 下载包到 /usr/local/redis解压 tar -zxvf redis-7.0.0.tar.gz切路径 /usr/local/redis/redis-7.0.0编译 make切路径 /usr/local/redis/redis-7.0.0/src安装make instal…

Transformer动画讲解 - Softmax函数

Transformer的Softmax函数 Transformer的Softmax函数&#xff1a; 用于将原始注意力分数转换为输入标记的概率分布。这种分布将较高的注意力权重分配给更相关的标记&#xff0c;并将较低的权重分配给不太相关的标记。Transformers通过Softmax在生成输出时&#xff0c;使用注意…