• 306查看
  • 0回复

[Autosar] AUTOSAR入门-AS代码运行补充知识2

[复制链接]


该用户从未签到

发表于 3-3-2024 09:02:13 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


AUTOSAR入门-AS代码运行补充知识2

AUTOSAR入门-AS代码运行补充知识2w1.jpg

    Talk is cheap,Show me the code ! 上面图中展示了AS平台中AUTOSAR代码的目录,就是AUTOSAR那一堆规范所对应的代码。说到AUTOSAR开源代码,你有必要了解下ArcCore,当你打开其官网https://www.arccore.com,你会看到一句:ARCCORE HAS BECOME A PART OF VECTOR EFFECTIVE JULY 11, 2018.

    曾经开源AUTOSAR软件的王者ArcCore,也向商业大亨VECTOR公司臣服了,不过其之前开源的代码也是一种财富,就是上面图片目录里面的ArcCore源码。AS作为一个平台的一个核心功能就是把这套ArcCore源码运行起来,所以把其集成进去了。AS平台里面的ArcCore源码虽然不是最新的,但是整体轮廓框架和机制都已经无缺了,可能少了一些业务的实现,如果要研究最新的可以参考:

https://github.com/openAUTOSAR/classic-platform。

书接前文AUTOSAR入门-AS代码运行补充知识1,已经讲完代码编译,下面就是运行代码,调试代码。本文入门级别带你走进代码世界。

5. 代码运行-qemu

编译完代码后,执行scons run命令就可以运行,首先会自动下载编译qemu开源软件,qemu代码路径为:as/release/download/qemu。之后会组装一个shell脚本:
as/build/posix/x86/ascore/qemu.sh,最后执行这个shell脚本qemu.sh。

shell脚本可以简单看作是一堆命令的集合,经常使用Linux需要掌握下,自行百度。

我们执行cat qemu.sh命令看下里面有什么:
/home/XXX/work/as/release/download/qemu/i386-softmmu/qemu-system-i386-fda/home/XXX/work/as/TINIX.IMG-boot a-m 64M-serialtcp:127.0.0.1:1104,server-net nic -net user,hostfwd=tcp::13400-:1234-device pci-ascan-device pci-asnet-device pci-asblk& sh /home/XXX/work/as/build/posix/x86/ascore/telnet.sh
可以看到神秘的qemu虚拟机在这里就是一个可执行文件:qemu-system-i386-fda。这跟你自己用c语言写一个hello world编译出来的可执行程序是一样的,在Linux不用安装,可以直接运行。

下面说说怎么用qemu,其实就是加参数。

    首先是要运行的系统镜像,这里为/home/XXX/work/as/TINIX.IMG

    这个-boot直接看不出来什么意思。一般我们使用的工具程序都会自带一个帮助说明,输入命令:qemu-system-i386-fda --help可以看到:

AUTOSAR入门-AS代码运行补充知识2w2.jpg

a表示从软盘驱动,感觉应该是c硬盘才对,现在都没软盘了。有兴趣的可以修改下这个a改成c,代码在:

as/com/as.application/board.x86/SConscript

AUTOSAR入门-AS代码运行补充知识2w3.jpg


    -m 64M表示需要的内存,这里只有64M,可见十年前的电脑都能腾出来这么点内存运行这个AS代码了。

    -serialtcp:127.0.0.1:1104,server表示接出来了一个虚拟串口,通过网络tcp的形式对外提供串口的数据,server表示是服务端,那么在Ubuntu上再搞个tcp客户端(后面telnet.sh中说明)就可以查看串口打印的数据了。

    -net nic -netuser,hostfwd=tcp::13400-:1234 表示添加了一个网卡,ip是省略了表示本地ip,端口是13400.这样发送网络包的程序(后面发包工具中说明)就可以通过这个ip(本地,就指Ubuntu)和端口13400给AS代码发报文了。

    -device pci-ascan

    -device pci-asnet

    -device pci-asblk

    这三个参数是给虚拟机添加的驱动,其中pci-asnet是一个网络驱动,我们给AS发DoIP网络报文就需要这个驱动。

    & sh/home/XXX/work/as/build/posix/x86/ascore/telnet.sh

    在Linux里面两个命令可以用&连接,一块来执行,这样就变成了一条命令。这里表示执行完qemu命令又执行了一个shell脚本telnet.sh,算是shell脚本引用shell脚本,是可以的。


我们执行命令cat telnet.sh看下里面都有什么:
Sudomodprobe vcansudoiplink add dev can0 type vcansudoiplink set up can0sudoiplink set can0 mtu 72sleep0.5telnet127.0.0.1 1104
    首先创建了一个vcan0设备,我们可以ls /dev/can*看下是否有这个设备,在linux里面有一个思想:一切皆文件。一个设备的表现形式也是一个文件。通过操作这个文件来操作设备,比如这里创建的vcan0就是qemu接收can报文的can设备。

  sleep 0.5:表示睡眠0.5秒,这里主要是等待qemu程序AS程序初始化完毕,然后使用telnet工具(使用的tcp协议)登录1104端口,就可以让串口的字符串打印出来了。这里对应虚拟网络串口的客户端。

那么网卡的客户端在哪里呢?

后面我们的发包程序会讲到。

到这里AS的代码已经运行起来了,下面我们开始正式进入代码的世界。

6. 代码编辑工具vscode和vim

    面对代码,首先你需要一个得心应手的代码编辑器,就像砍柴要带斧子一样。先讲个笑话,两个程序员去相亲,询问对方使用什么代码编辑器,得知跟自己不一样的时候直接走人了。可见这玩意成见有多深。

    这里推荐两个:一个是vim老掉牙的老头子一样,一个是vscode新生代的小鲜肉。说实话对新手来说都不好用,这东西需要用着用着才能顺手(主要是记住各种快捷键)。主要使用的功能比如:查看函数定义、全局查找、返回上一处、复制粘贴等操作。

    先介绍上手容易点的vscode,可以自己百度怎么使用,这里挑一下难点说明。

首先安装vscode,需要去https://code.visualstudio 下载deb安装包文件,输入下面命令进行安装
sudodpkg-icode_1.35.3-1552606978_amd64.deb
然后就是安装各种插件,例如:

    C/C++,c语言使用

    Rainbow Brackets,彩虹花括号,有助于阅读代码。

    TabNine,一款 AI自动补全插件

    Chinese(Simplified),即中文环境。

然后进入使用,直接打开as文件夹即可直接浏览代码。

AUTOSAR入门-AS代码运行补充知识2w4.jpg

    接下来介绍vim,首先是安装,输入下面命令
sudo apt-get install vimsudo apt-get instll ctagssudo apt-getinstall cscope
然后是配置,可以公众号恢复“工具”获取。使用方法:.vim文件夹和.vimrc文件放用户根目录~下就可以了。

然后在as代码目录执行命令:
ctags -Rctags -Rbq
生成索引文件。具体怎么用可以自己百度。

推荐:有条件就用vscode,没条件比如ssh登陆的服务器只有命令行就用vim了。

7. 发包工具-网络编程

    AS的代码运行起来了,接下来就是要做发诊断报文业务了,就是发DoIP报文给AS。这里我用c语言写一个网络客户端可以运行在Ubuntu上。执行下面的命令就可以:
cd as/socket_toolmake./send_client.sh
用代码编辑器打开as/socket_tool/client.c

AUTOSAR入门-AS代码运行补充知识2w5.jpg

可以看到我们发包的对象是172.18.0.200:13400

这里跟qemu参数中添加网卡的参数里面13400端口是对应的,172.18.0.200是AS网卡的地址。

    因为要发两个报文,所以写一个shell脚本:send_client.sh。会调用make编译出来的程序client进行发包。

    关于网络编程,这里推荐一本书

《Linux c一站式编程》http://staff.ustc.edu.cn/~guoyan/os12/LinuxC.pdf可以自己下载。这本书可以带你入门嵌入式Linux开发,里面的部分Ⅲ中第 37 章 socket编程里面有几个例子可以在Ubuntu下练习下,这里关注下下面图里的client部分,因为server部分在AS代码里面。

AUTOSAR入门-AS代码运行补充知识2w6.jpg

当发包的shell脚本执行后,我们就会在串口中看到输出:

AUTOSAR入门-AS代码运行补充知识2w7.jpg

    关于AS中客户端的处理,会另外写一个SoAd模块的文章介绍。

8. 调试技巧

    首先最常用到的调试手段就是打log,例如下面的代码,使用ASLOG宏就可以加log打印:

AUTOSAR入门-AS代码运行补充知识2w8.jpg

运行代码的时候,我们会看到这个打印:

AUTOSAR入门-AS代码运行补充知识2w9.jpg

    下面介绍gdb调试,这个就厉害了,可以在运行时让程序在代码级别停下来进行调试。我们使用的qemu虚拟机是支持gdb进行调试的,运行的时候使用命令:scons run gdb,可以看到AS代码运行后停在哪里了,等待调试

AUTOSAR入门-AS代码运行补充知识2w10.jpg

然后执行下面命令:

AUTOSAR入门-AS代码运行补充知识2w11.jpg

这里说明下i686-elf-gdb是编译器对应的gdb版本,x86是编译出来的目标文件带符号信息的,最后IMG文件会用objcopy -S命令删除符号信息,然后集成到系统镜像IMG文件中,可以参考:AUTOSAR入门-AS开源代码编译过程详解。

然后串口打印停留在了EcuM_Init函数处:

AUTOSAR入门-AS代码运行补充知识2w12.jpg

具体gdb命令的用法,自己百度。主要可以单步执行,查看变量值。

    上面的用法可以看到其原理,那么有更方便的gdb使用方法不?答案是有的,让你感觉爽到家。配合vscode可以实现编辑器图形化界面跟gdb调试工具合一的调试体验:

    首先按F5选择gdb调试,会自动出来launch.json配置。可以看到.vscode目录中多了launch.json文件:

AUTOSAR入门-AS代码运行补充知识2w13.jpg

然后我们修改这个文件三个地方:编译器gdb版本、目标文件带符号信息的、调试端口。如下图:

AUTOSAR入门-AS代码运行补充知识2w14.jpg

(此图为公众号网友罗小罗提供,说的比较清晰,就借用过来了)

配置完毕后,找到代码里面,左边打断点,运行进行调试,效果如下:

AUTOSAR入门-AS代码运行补充知识2w15.jpg

是不是很Amazing,别人有的我们也可以有
AUTOSAR入门-AS代码运行补充知识2w16.jpg


后记:

    把AS的搭建运行入门级别的又讲了下,这下可以对照代码,从公众号开始的文章再看一遍了,标签为:AUTOSAR入门。

   最近有很多读者询问AS环境搭建的问题,这里可以加我微信thatway1989,备注进群。然后拉你进本公众号的交流群:OS与AUTOSAR研究-交流群,可以群策群力搭环境,了解汽车软件最新技术,一起学习。

    Talk is cheap,show me the code,后续会继续更新,纯干货分析,无广告,不打赏,欢迎转载,欢迎评论交流!


该用户从未签到

发表于 14-3-2025 15:23:00 | 显示全部楼层
AUTOSAR是一种汽车电子开放源代码软件架构标准,广泛应用于汽车行业中。ArcCore曾是开源AUTOSAR软件的代表,但现在已成为商业实体Vector的一部分。在AUTOSAR代码运行方面,需深入理解其软件架构、通信机制和模块间的交互。AUTOSAR规范对应的代码目录结构复杂,建议从官方文档和示例代码入手。学习AUTOSAR时,应注重实践,通过实际代码运行来加深理解。同时,关注其开源社区动态,了解最新发展和变化。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 17:18 , Processed in 0.385968 second(s), 37 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.