CAN模块的自动代码生成(Python实现)(1)介绍

CAN模块的自动代码生成(Python实现)(1)介绍

概述

2016.07.23

当前新能源汽车形势大好,商用车更是不得了,很多N年没出货的主机厂都复活了,恨不得明年的市场都圈过来。作为ECU供应商,面对各种恨不得刚签完合同就拿到货的要求,如在保证质量的前提下,尽快完成项目,服务好这么多衣食父母,就成了一个主要问题。

一个软件开发团队,特别是没钱的团队,代码全靠手写。想想当前人家牛X的公司,各种高大上的工具完全没有;就算顶着压力买来了,也不一定用得好,还不如自己造能用的小车,总比走路快点。

找来找去,对于一个稳定的ECU,控制策略基本定型,最大的不同就是控制器对外接口了。写这些代码都是体力劳动,基本没啥技术含量,而且还需要一颗细致的心。我总是想,再看几年这些控制器管脚配置和CAN协议信号,眼花年龄肯定提前。就算不为提高效率,也要为自己的眼睛好好考虑考虑。

需求

跟着当看着很好,但是没钱买的工具学:做配置,写代码的工作交给工具。看起来要做的就是写一个软件,它的功能就是根据配置生成C代码了。

首先就是要看看工具的需求了。当前的情况如下:

  • 有专门的基础软件完成控制器硬件的配置、任务调度和基本服务什么的。这些功能都有相应的接口,使用时只要调用就行了。比如CAN通讯模块:
// 波特率设置 node 0, 250K
CAN_SetBaudrate(NODE0, BAUDRATE_250K);
// ID 0x18FFF1A0, node 0, 100ms, 接收报文
CAN_InitMessageFrame(0x18FFF1A0, NODE0, PRD_100ms, RECIEVED)
  • CAN信号的打包与解包还是要根据协议手动完成
CAN_Unpack_0x18FFF1A0()
{
  uint32_T tmp = 0;
  
  // Bat.BusCurr  startbit: 0, length: 16, factor: 0.1A/bit, offset: -3200A
  tmp = data[0];
  tmp += data[1] >> 8;
  Bat.BusCurr = (float)tmp * 0.1 - 3200;
}
  • 控制策略已与硬件隔离,不受控制器硬件或是管脚与CAN协议变化的制约。
  • 控制器管脚通过一个映射函数,与控制策略需要的信号联系起来
// key start信号接控制器32脚
Body.KeyStart = PIN32_DIH;

看来工具的任务,就是完成上面的三段代码,到时候只要点点鼠标就行了。

工具的输出是C语言的代码,那输入呢,可以分三部分:

  1. CAN协议,可以用DBC
  2. 控制器接口定义
  3. 控制策略需要的信号

实现方案

基本需求确定了,就要开始干活了。

先找找我要的东西有没有现成的,没找到(要是找到了,就不写这个东西了)

再看看有没有什么模块是已有的。

嗯,找到个跟DBC有关的项目:CanMatrix,感谢作者Eduard

别的再找不到了,那就只能自己搞了。

野路子编程,只要能实现功能就行,一个模块一个模块搭起来。

PS: 已半夜,明天起来继续写

posted @ 2016-07-24 00:18  fallcolor  阅读(4864)  评论(0编辑  收藏  举报