AUTOSAR入门-AS代码运行补充知识2
原创 thatway 那路谈OS与SoC嵌入式软件 2022-05-16 07:30
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
,后续会继续更新,纯干货分析,无广告,不打赏,欢迎
转载
,欢迎
评论交流
!