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  

,后续会继续更新,纯干货分析,无广告,不打赏,欢迎
转载
,欢迎
评论交流

results matching ""

    No results matching ""