• 478查看
  • 0回复

[Autosar] AutoSar的Coding趣闻

[复制链接]


该用户从未签到

发表于 21-1-2024 10:47:05 | 显示全部楼层 |阅读模式

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


01

避免无用变量的编译warning

想必大家编译代码经常能看到这种warning:

AutoSar的Coding趣闻w1.jpg

但是有时候在开发阶段又不想直接删除,ETAS的代码是这么做的:

AutoSar的Coding趣闻w2.jpg

02

位域赋值

咱们平时如何赋初值呢,是单个挨个赋值:
A.isEventTrig = 1;
还是总体赋值呢:

A = {    .isEventTrig  = 1;    .isTriggerIpduSendWithMetadata = 1;    .isGwIpduSend = 1;};
ETAS的代码简单粗暴:

AutoSar的Coding趣闻w3.jpg

03

枚举的拼接

调试NvM的代码时,发现有些枚举值代码中搜索不到,却可以在调试器中显示出来,原来它们是这样被拼接的:

AutoSar的Coding趣闻w4.jpg

定义了如上的service bit list,然后通过##连接符拼接参数生成枚举成员,并且拼接时还有个unused参数(可以用作备注)。

04

二分法循环!

平时咱们写代码不管是for还是while,无非是做变量++来循环,而ETAS则有一种高效的快速查表方法:

AutoSar的Coding趣闻w5.jpg

不过需要注意的是,咱们查询的表里的数值需要从小到大排列或者从大到小排列,才能使用二分法循环。

05

const指针的赋值操作

如图:

AutoSar的Coding趣闻w6.jpg

如果直接写:
BlockData_st.QueueEntry_st.BlockData_pv = NvM_SrcPtr;
编译器会warning,告诉我们const被丢弃了。

AutoSar的Coding趣闻w7.jpg

使用联合体的另一个非const成员规避问题。

不过正常写代码如果需要对指针操作,可以尽量不写成const类型。曾经项目中遇到过matlab生成的代码,对const类型的结构体,使用类型*&的方式强制赋值,最后代码跑飞到没有问题的代码段,然后进入Trap。我们虽然看到的现象有点无解,也确实对没有问题的代码排查了下,但还好当时软件的改动量不大,通过git log及时查到了问题。
AutoSar的Coding趣闻w8.png

快速发帖

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

本版积分规则

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

GMT+8, 1-2-2025 12:49 , Processed in 0.206013 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.