通过.map文件填写XCP标定需要的A2L文件

2023-05-16

首先你得有一个模板,通过python脚本打开编译后的.map文件自动填写到A2L文件对应位置,目前只实现了填写Mesurement 区域,但是这个填写主要是更新变量名和对应的ECU ADRRESS,因为.map文件不包含更多的信息。

  • 首先你得对你得MCU(我的是基于MPC5744)内存进行分区,修改S32DS中的链接脚本(该脚本为GCC格式,与Keil不同),在.sdata后添加这样一个段
 .sdata : AT (__SDATA_ROM)
    {
        . = ALIGN(4);
        __SDATA_RAM = .;
        __sdata_start__ = .; /* Create a global symbol at sdata start. */
        *(.sdata)
        *(.sdata.*)
        . = ALIGN(4);
        __sdata_end__ = .; /* Define a global symbol at sdata end. */
    } > m_data
    __SDATA_END = __SDATA_ROM + (__sdata_end__ - __sdata_start__);

	.mesurement_sec : AT (__SDATA_END)
    {
        . = ALIGN(4);
        __me_start__ = .; /* Create a global symbol at sdata start. */
        *(.mesurement_work_page)
        *(.mesurement_work_page.*)
        . = ALIGN(4);
        __me_end__ = .; /* Define a global symbol at sdata end. */
    } > m_data
    __ME_END = __SDATA_END + (__me_end__ - __me_start__);

这样生成的.map文件中

.mesurement_sec
                0x40001474       0x18 load address 0x0100ccc8
                0x40001474                . = ALIGN (0x4)
                0x40001474                __me_start__ = .
 *(.mesurement_work_page)
 .mesurement_work_page
                0x40001474       0x18 ./Sources/main.o
                0x40001474                test1
                0x40001484                adc_test
                0x40001488                hehe
 *(.mesurement_work_page.*)
                0x4000148c                . = ALIGN (0x4)
                0x4000148c                __me_end__ = .
                0x0100cce0                __ME_END = (__SDATA_END + (__me_end__ - __me_start__))

包含了这样的信息,我在这里定义了test1,adc_test1,hehe三个测试变量,但是变量的类型等是没有信息的,所以你只能通过map file 更新A2L中的变量名和ECU ADRR ,如果你是基于模型的开发,你可以在simulink中定义完整的变量信息,并且通过asap2post函数进行更新(不知道为什么我更新失败,所以才自己写个脚本来完成这样的事)
下面直接上Python code

import re
from copy import  deepcopy

class Map_to_A2L(object):

    def __init__(self):
        self.__mapfile_buf=[]
        self.__a2lfile_buf=[]
        self.mapfile_adrr="C:/Users/wangk/Desktop/S32DS_WORK_PA/busoff/busoff.map"
        self.a2lfile_adrr="C:/Users/wangk/Desktop/S32DS_WORK_PA/busoff/MPC5744P.a2l"
        self.__measurement_vars_list=[]
        self.__a2file_buflen_previous=0
        self.__insert_pos=0
        self.measurement_sec_template="    /begin MEASUREMENT"+"\n"+"      name"+"\n"+"      \"this is for test\""\
                                      +"\n"+"      FLOAT32_IEEE"+"\n"+"      none"+"\n"+"      0"+"\n"+"      0"+"\n"\
                                      +"      0"+"\n"+"      0"+"\n"+"      ECU Address"+"        "+"0X32"+"\n"+\
                                      "    /end MEASUREMENT"+"\r\n"

    def __open_and_get_mapfile(self):
        with open(self.mapfile_adrr, mode="rb") as f:
            while True:
                line = f.readline().decode('ascii', 'ignore')
                if not line:
                    break
                else:
                    self.__mapfile_buf.append(line)

    def __get_info_from_map_file(self):
        row = 0
        buf_measurement_index = []
        while row != len(self.__mapfile_buf):
            if re.findall(r"r*(.mesurement_work_page)", self.__mapfile_buf[row], re.I):
                buf_measurement_index.append(row)
            row = row + 1
        buf_measurement_index = buf_measurement_index[1:]
        measurement_dict = {"Name": None, "ECU Address": None}
        for i in range(len(buf_measurement_index)):
            if i == len(buf_measurement_index) - 1:
                break
            index1 = buf_measurement_index[i]
            index2 = buf_measurement_index[i + 1]
            for j in range(index1 + 2, index2):
                dict_ = deepcopy(measurement_dict)
                data = self.__mapfile_buf[j].replace("\r\n", "").strip().split()
                dict_["Name"] = data[1]
                dict_["ECU Address"] = data[0]
                self.__measurement_vars_list.append(dict_)

    def __open_and_get_a2l_file(self): #store origin a2l file in buf and then rewrite it(I consider to use the default template and create a new a2l file in the same folder as mapfile) 
        with open(self.a2lfile_adrr, mode="r") as f:
            while True:
                line = f.readline()
                if not line:
                    self.__a2file_buflen_previous=len(self.__a2lfile_buf)
                    break
                else:
                    self.__a2lfile_buf.append(line)

    def __del_old_measurement_sec_in_a2l_file(self): #find measurement sectors in origin or default a2l file and delete them (just in buf not in file)
        a2l_buf_index = []
        index=0
        for line in  self.__a2lfile_buf:
            if re.findall(r'/begin MEASUREMENT',line,re.I) or re.findall(r'/end MEASUREMENT',line,re.I): 
                a2l_buf_index.append(index)
            index=index+1
        if len(a2l_buf_index) >=2 and len(a2l_buf_index)%2==0:
            del self.__a2lfile_buf[a2l_buf_index[0]:a2l_buf_index[-1]+1]
        a2file_buflen_change=self.__a2file_buflen_previous-len(self.__a2lfile_buf)-2
        self.__insert_pos=a2l_buf_index[-1] - a2file_buflen_change

    def __update_a2l_buf(self):
        for i in range(len(self.__measurement_vars_list)):
            name=self.__measurement_vars_list[i]["Name"]
            ECU_ADRR=self.__measurement_vars_list[i]["ECU Address"]
            self.__a2lfile_buf.insert(self.__insert_pos+i, self.measurement_sec_template.replace("name",name).replace("0X32",ECU_ADRR))

    def __update_a2lfile(self):
        with open(self.a2lfile_adrr, mode="w") as f:
            for line in self.__a2lfile_buf:
                f.write(line)

    def exchange(self):
        self.__open_and_get_mapfile()
        if len(self.__mapfile_buf) >=1:
            self.__get_info_from_map_file()
        else:
            print("map为空")
        self.__open_and_get_a2l_file()
        if len(self.__a2lfile_buf) >=1:
            self.__del_old_measurement_sec_in_a2l_file()
        else:
            print("a2l文件为空")
        self.__update_a2l_buf()
        if len(self.__a2lfile_buf) >=10:
            self.__update_a2lfile()
        else:
            print("你妈卖批")

ob=Map_to_A2L()
ob.exchange()

简单的实现了下功能,后续会添加GUI(基于PYQT5),可以选择文件夹和文件,添加对标定变量,内存分区信息的支持(虽然现在还没搞懂这部分在A2L文件的作用,没办法,没有CANAPE),仅供学习参考交流,python我也是用的时候学一点,不是很熟,但是写OOP真的是完爆C。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过.map文件填写XCP标定需要的A2L文件 的相关文章

随机推荐

  • 移植FreeRTOS到 Xilinx ZYNQ Microblaze IP核

    1 xff0c 运行环境vivado2019 2 xff0c win10 ZYNQ 7000系列 2 xff0c FreeRTOS官网源码下载 https www freertos org 3 xff0c FreeRTOS 是一个迷你的实时
  • linux下网络设备驱动开发

    一 xff0c 网络OSI参考模型分为 从上到下 应 xff0c 表 xff0c 会 xff0c 传 xff0c 网 xff0c 数链 xff0c 物 物理层 gt 数据链路层 gt 网络层 gt 传输层 gt 会话层 gt 表示层 gt
  • freeRTOS系统静态与动态建立任务

    一 xff0c 静态建立任务 1 xff0c 定义任务函数 xff08 一个无限循环且不带返回值的函数 xff09 任务必须是死循环 xff0c 否则任务将经过 LR 返回 xff0c 如果 LR 指向了非法内存就会产生HardFault
  • Ubuntu18.04安装Ceres1.14

    Ubuntu18 04安装Ceres1 14 1 下载Ceres2 安装依赖项3 编译4 安装 1 下载Ceres 链接Github下载地址 2 安装依赖项 sudo apt get install liblapack dev libsui
  • SSH登录出现REMOTE HOST IDENTIFICATION HAS CHANGED故障的解决办法

    今天登录一台交换机 xff0c 出现如图错误 xff1a 原因 该IP分配给过另一台交换机 xff0c 在knows hosts文件中保留了当时的rsa信息 xff0c 将这个IP有分配给新设备 xff0c SSH登录时会提示RSA key
  • 外贸函电常用词汇

    外贸函电常用词汇 xff1a xff08 1 xff09 贵函 Your letter Your favour your esteemed letter Your esteemed favour Your valued letter You
  • 匿名拓空者Pro开源飞控使用介绍-1-飞控特点

    匿名团队 是一个爱好技术 xff0c 爱好创新的团队 做自己 xff0c 发现兴趣 xff0c 追随兴趣 xff0c 分享兴趣 非常欢迎大家关注我们匿名 xff0c 交流群 xff1a 190169595 匿名拓空者Pro 飞控 xff0c
  • 匿名拓空者Pro开源飞控使用介绍-2-硬件配置及拓展接口

    硬件配置 主控 STM32F407 xff1a 1M FLASH xff0c 192K RAM xff0c 运行频率168MHz xff1b 惯性传感器 icm20602 xff1a 3轴陀螺 43 3轴加速度 43 恒温设计 xff08
  • 匿名拓空者Pro开源飞控使用介绍-3-连接上位机及基本测试

    飞控连接上位机方法 飞控可以通过底板上的USB端口连接上位机 xff0c 使用USB线连接飞控和电脑 xff0c 飞控买家版程序会将USB端口初始化成HID设备 xff0c 免安装驱动程序 xff0c 只要打开匿名上位机 xff0c 打开程
  • 匿名拓空者Pro开源飞控使用介绍-4-飞控安装及坐标系定义

    飞控安装 将机架组装好 xff0c 电机安装于机架上 xff0c 飞控安装于机架重心位置 xff08 一般为机架中心板中心位置 xff0c 也就是两条电机对角线交点 注意 xff0c 飞控尽量水平安装于机架上 xff0c 飞行效果最好 xf
  • 匿名拓空者Pro开源飞控使用介绍-5-接收机连接

    确定使用何种接收机连接方式 匿名拓空者PRO飞控支持SBUS PPM PWM型接收机 xff0c 根据推荐程度依次为SBUS gt PPM gt PWM SBUS PPM均可以实现1根信号线传输多通道遥控数据的功能 xff0c SBUS为串
  • 匿名科创--匿名拓空者PRO—TI版全开源飞控使用入门—TM4C123

    1 飞控介绍 匿名团队针对TI芯片的强烈学习需求 xff0c 推出了匿名拓空者PRO飞控的TI版 使用TI公司的 TM4C123G 主控芯片 xff0c 打造了一款完全开源的飞控产品 xff0c 提供完全开源的飞控整体工程文件 xff0c
  • 匿名科创--ANO_OPENMV视觉开发板介绍

    1 ANO OPENMV介绍 官方OPENMV体积大 xff1f 在飞行器上不方便安装 xff1f 串口通过杜邦线容易接触不良 xff1f 不可否认 xff0c OPENMV为大家提供了一个非常方便 易用的视觉开发环境 xff0c 但是在实
  • 匿名科创--匿名拓空者PRO--开源光流融合算法使用教程

    1 总体介绍 为了更好的支持匿名TI飞控买家 xff0c 匿名团队开源了基于优象光流模块的飞控算法 xff0c 光流传感器直接连接至匿名拓空者PRO TI版飞控 xff0c 由飞控读取原始光流传感器的光流数据 xff0c 结合高度传感器以及
  • Linux 设备驱动开发实例

    编译和运行 驱动编译要用到kernel的Makefile文件 也就是源码树的编译系统 因此 xff0c 源码需要被配置和编译 xff0c 以ubuntu自带的源码为例 xff1a 编译外部模块 ko 的编译命令是 xff1a make C
  • 匿名科创-匿名光流V3版对天安装介绍

    安装介绍 光流模块对天安装时 xff0c 方向参考上图 注意 xff0c 只有光流模块对上安装 xff0c 激光或超声波测距模块仍然对地安装 配置介绍 如需使用对天模式 xff0c 硬件安装好后 xff0c USB线连接光流模块至上位机 x
  • 从 C51+uCos-II 近距离了解操作系统任务切换原理

    前言 从 C51 43 uCos II 简单介绍下任务切换的原理 方便大家更形象的理解多任务怎么切换 为后续写 x86 43 Linux 任务切换做铺垫练手吧 参考资料如下 xff1a uCos II 源码 单片机原理与应用及 C51 编程
  • Keil+Simulink生成Xcp标定协议A2L文件

    Keil 43 Simulink生成Xcp标定协议A2L文件 由于最近要为ECU移植XCP协议 xff0c 所以记录一下 xff0c 我使用的MCU为NXP S32K144 IDE选用MDK 官方IDE S32DS无代码联想功能 xff0c
  • 记录一下关于MPC5744P CAN总线学习

    记录一下关于MPC5744P CAN总线学习 主要是针对开发出BUSOFF管理 xff0c NXP感觉都是一个套路 xff0c 无论powerpc xff0c 还是arm m status t span class token functi
  • 通过.map文件填写XCP标定需要的A2L文件

    首先你得有一个模板 xff0c 通过python脚本打开编译后的 map文件自动填写到A2L文件对应位置 xff0c 目前只实现了填写Mesurement 区域 xff0c 但是这个填写主要是更新变量名和对应的ECU ADRRESS 因为