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

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可以看到:

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

-
-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看下里面都有什么:
Sudo modprobe vcan
sudo iplink add dev can0 type vcan
sudo iplink set up can0
sudo iplink set can0 mtu 72
sleep 0.5
telnet 127.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安装包文件,输入下面命令进行安装
sudo
dpkg
-i
code_1
.35
.3-1552606978_amd64
.deb
然后就是安装各种插件,例如:
-
C/C++,c语言使用
-
Rainbow Brackets,彩虹花括号,有助于阅读代码。
-
TabNine,一款 AI自动补全插件
-
Chinese(Simplified),即中文环境。
然后进入使用,直接打开as文件夹即可直接浏览代码。

接下来介绍vim,首先是安装,输入下面命令
sudo apt-get install vim
sudo apt-get instll ctags
sudo apt-get install cscope
然后是配置,可以公众号恢复“工具”获取。使用方法:.vim文件夹和**.vimrc文件放用户根目录~**下就可以了。
然后在as代码目录执行命令:
ctags -R
ctags -Rbq
生成索引文件。具体怎么用可以自己百度。
推荐:有条件就用vscode,没条件比如ssh登陆的服务器只有命令行就用vim了。
7. 发包工具-网络编程
AS的代码运行起来了,接下来就是要做**发诊断报文**业务了,就是发DoIP报文给AS。这里我用**c语言**写一个**网络客户端**可以运行在Ubuntu上。执行下面的命令就可以:
cd as/socket_tool
make
./send_client.sh
用代码编辑器打开as/socket_tool/client.c

可以看到我们发包的对象是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代码里面。

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

关于AS中客户端的处理,会另外写一个**SoAd模块**的文章介绍。
8. 调试技巧
首先最常用到的调试手段就是**打log**,例如下面的代码,使用**ASLOG宏**就可以加log打印:

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

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

然后执行下面命令:

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

具体gdb命令的用法,自己百度。主要可以单步执行,查看变量值。
上面的用法可以看到其**原理**,那么有更方便的gdb使用方法不?答案是**有的**,让你感觉**爽到家**。配合vscode可以实现编辑器**图形化**界面跟gdb调试工具**合一**的调试体验:
首先按**F5**选择gdb调试,会自动出来**launch.json**配置。可以看到.vscode目录中多了launch.json文件:

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

(此图为公众号网友罗小罗提供,说的比较清晰,就借用过来了)
配置完毕后,找到代码里面,左边打断点,运行进行调试,效果如下:

是不是很Amazing,别人有的我们也可以有
。
后记:
把AS的搭建运行**入门级别**的又讲了下,这下可以对照代码,从公众号开始的文章再看一遍了,标签为:**AUTOSAR入门**。
最近有很多读者询问AS环境搭建的问题,这里可以加我微信thatway1989,备注进群。然后拉你进本公众号的交流群:OS与AUTOSAR研究-交流群,可以群策群力搭环境,了解汽车软件最新技术,一起学习。
Talk is cheap,show me the code,后续会继续更新,纯干货分析,无广告,不打赏,欢迎转载,欢迎评论交流!
公众号:“那路谈OS与SoC嵌入式软件”,欢迎关注!
个人文章汇总:https://thatway1989.github.io
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)