[资源分享] CAN UDS升级实现

[复制链接]
28379|79
 楼主| JasonLee27 发表于 2021-6-15 10:53 | 显示全部楼层 |阅读模式
硬件平台:AC7811通用开发板  USB CANFD 200U
软件平台:keil 5.23  ZCANPRO

工程主要有3个,flash工程用于生成动态flash驱动。UDS_Demo是APP,主要实现接收10 02服务后执行复位并设置升级标志功能,里面协议处理没有实时更新,所以协议部分还是以UDSBoot_Demo为准,UDSBoot_Demo是boot,实现了UDS升级的大部分功能,包括安全访问,31,34,36,37服务等。tool里面为ZCANPRO下的ECU刷写设置示例(实测路径改变后会加载内容会变化)。以及算法dll库,算法只是做了个架子,实际应用应该使用自己的算法。
4049160c814dcd0d60.png

7460460c815f51f91a.png


canuds_nm.rar (4.3 MB, 下载次数: 857)

评论

请教 DLL库是怎么调用的,  发表于 2023-2-13 11:58
请问 一下CANTp.c是干什么的,可以简单的说说吗,里面的东西和硬件没有关系吧  发表于 2022-6-9 16:25

评分

参与人数 1威望 +6 收起 理由
infofans + 6 赞一个!

查看全部评分

Linley 发表于 2021-7-5 18:06 | 显示全部楼层
正在做这一块,感谢大神分享

评论

能分享下实现过程嘛,小弟也是第一次接触  发表于 2021-7-16 17:56
guijial511 发表于 2021-7-5 20:46 来自手机 | 显示全部楼层
感谢分享
zwzzq 发表于 2021-7-14 19:22 | 显示全部楼层
这个是什么软件

评论

@zwzzq :你可以把UDS理解成一个简单的互联网协议,15765就是TCP/IP,14229就是基于TCP/IP之上的协议,说白了就是对一串数据进行解析,然后标准里面定义了一些状态等等,比如会话状态,比如通信状态等等。  发表于 2021-7-20 10:08
@JasonLee27 :typedef struct { uint8_t curSessionState:3; uint8_t SecurityAccessState:2; UdsCCCtrlType CCCtrlType; UdsCCComType CCComType; UdsDTCSettingType DTCSettingType; uint8_t EC  发表于 2021-7-16 18:20
@JasonLee27 :typedef struct { uint8_t curSessionState:3; uint8_t SecurityAccessState:2; UdsCCCtrlType CCCtrlType; UdsCCComType CCComType; UdsDTCSettingType DTCSettingType; uint8_t EC  发表于 2021-7-16 18:18
周立功的ZCANPRO  发表于 2021-7-15 13:24
TomyStark 发表于 2021-7-16 12:14 | 显示全部楼层
本帖最后由 TomyStark 于 2021-7-16 12:22 编辑

有一点疑问,在Flash驱动的工程中,编译链接后导出的bin文件除了包括eFLASH_EraseSector、eFLASH_Program、eFLASH_ProgramCheck这3个函数外,相应的还包括了其它被这3个函数调用的子函数,通过反汇编查看这些函数的地址,都是位于0x00000XXX的地址上,而到了Bootloader的工程中,只对那3个函数的地址重定向到了RAM的实际地址,即对bin文件开头的12个字节的函数向量表中的3个函数指针的值加上0x2000F800变成RAM中的实际地址,而其它被这3个函数调用的子函数却没有重定向(例如EFLASH_PageErase、EFLASH_PageProgram、EFLASH_UnlockCtrl、EFLASH_LockCtrl……),实际在Bootloader中调用那3个函数应该会出问题吧
@JasonLee27

QQ截图20210716120457.png
flash驱动工程的map文件:
QQ截图20210716121938.png


flash驱动工程编译链接后的hex文件(bin文件内容也一样):
QQ截图20210716122100.png

评论

flash.map里面的三个函数的地址偏移分别为0x0000077C,0x000007aa,0x000007c8,hex文件中开始的地址为0x0000077D,0x000007aB,0x000007c9,为什么不是一致的呢?  发表于 2023-1-6 10:59
@TomyStark :都是一样的,我也可以用宏来实现,只是我用了结构体  发表于 2021-8-6 16:44
@JasonLee27 :原来如此,我之前看了NXP的UDS实现,他们将Flash Driver工程中的擦、写函数中调用的子函数都改成了宏函数的形式(这就意味着不会有函数的跳转),我当时的猜测是在nxp gcc编译器环境下,编译后函数之间跳转是按照绝对地址来的,所以作为Flash Driver导出hex文件给Bootloader使用时需要更改为单级函数。  发表于 2021-8-6 16:05
@TomyStark :代码还会逐渐完善,你的建议会考虑一下  发表于 2021-8-6 13:22
@TomyStark :不用的,arm的相对跳转地址范围很宽,同一个工程里面的函数之间相互调用都不会涉及到绝对地址  发表于 2021-8-6 13:22
@JasonLee27 :另外您提供的这份UDS实现相比之前原厂提供的那一份完善了很多,请问贵公司有在gitee或者Github开源维护的计划否?  发表于 2021-7-21 13:47
@JasonLee27 :请问要实现编译链接后函数的调用是采用相对跳转的方式,需要在Keil中做其它的设置吗,我目前只是看到了启动文件(.s文件)和分散加载文件(.sct文件)有做修改  发表于 2021-7-21 13:45
flash驱动工程内部的调用会使用相对跳转的方式,只要相互之间的偏移地址不变,放哪里都能跳转  发表于 2021-7-20 10:06
里面有晴雨 发表于 2021-7-17 08:50 | 显示全部楼层
感谢分享,话说什么叫UDS升级?
csjedi 发表于 2021-7-22 11:12 | 显示全部楼层
这个很赞
lzwujun 发表于 2021-7-23 12:53 | 显示全部楼层
不错,支持国产芯片!
 楼主| JasonLee27 发表于 2021-8-6 13:20 | 显示全部楼层
WJY19950827 发表于 2021-7-29 16:43
楼主,请教个问题,我将你的工程移植到7801的MCU上,发现这么一个问题,当App初始化运行到UpdateFlagAddr地 ...

#define UpdateFlagAddr  0x2000F700这个是通过宏定义了一个指向SRAM某一个空间的地址,7801的SRAM没那么大,所以这个地址是无效的,你要改小
这里注释错了,应该是64K,最开始是划了200K,因为UDS升级是先擦除app,区域设的太大,擦起来太久,为了省事就改小了。

评论

请问用RAM 来存储标志位。从app跳转到boot,ram不会重新初始化丢失吗?  发表于 2021-10-20 14:41
单片小菜 发表于 2021-9-1 09:28 | 显示全部楼层
正在做这部分,有了楼主的帖子,学习了,很棒。
zuoluoting 发表于 2021-9-5 01:05 | 显示全部楼层
请问下Flash工程没有main函数怎么编译的?
zuoluoting 发表于 2021-9-6 10:43 | 显示全部楼层
请问下flash驱动,没有main函数怎么编译?能说下具体操作吗?多谢
chenjun89 发表于 2021-9-8 20:47 来自手机 | 显示全部楼层
谢谢楼主分享,下载看看。
Bobby13 发表于 2021-9-12 18:57 来自手机 | 显示全部楼层
哥哥,放gitee嘛,不用放github,方便分享,一起维护改进。
 楼主| JasonLee27 发表于 2021-9-14 10:15 | 显示全部楼层
zuoluoting 发表于 2021-9-6 10:43
请问下flash驱动,没有main函数怎么编译?能说下具体操作吗?多谢

sct分散加载文件里面把root段注释掉,启动文件去掉了__main,所以不需要有main函数
 楼主| JasonLee27 发表于 2021-9-14 10:15 | 显示全部楼层
Bobby13 发表于 2021-9-12 18:57
哥哥,放gitee嘛,不用放github,方便分享,一起维护改进。

没搞过,可以学习了解下先
baoyingbin1989 发表于 2021-10-20 14:39 | 显示全部楼层
JasonLee27 发表于 2021-8-6 13:20
#define UpdateFlagAddr  0x2000F700这个是通过宏定义了一个指向SRAM某一个空间的地址,7801的SRAM没那么 ...

请问用RAM 来存储标志位。从app跳转到boot,ram不会重新初始化丢失吗?
WJY19950827 发表于 2022-3-28 15:17 | 显示全部楼层
楼主,请教下,上位机将flashdriver的bin文件下载到RAM区域时,文件中是有地址的,但是是怎样指定长度的呢,只是找到地址但是也得需要读RAM区域读到什么地方结束吧
skyred 发表于 2022-4-6 15:28 | 显示全部楼层
uds是什么
chenjun89 发表于 2022-4-7 08:23 来自手机 | 显示全部楼层
感谢分享,下载看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部