作者: GorgonMeducer 傻孩子
首发:裸机思维
忙活了ban
【说在前面的话】
今天一大早醒来,就看到嵌入式大号把最新版本的MDK 5.33给“挂了”出来:
想不到国内嵌入式圈子还有这么多跟我一样天天盯着MDK编译器不放恨不得第一个发现Bug的人——既然被人捷足先登了,就不妨来看看究竟是个怎样的Bug。
在文章的一开头,文章作者直接而清晰的给出了结论:
“用最新版的Keil for ARM 5.33版本做407开发板的开发,自己创建的工程怎么都没法正常编译,不是有错就有几十个警告。 ”gaoyang9992006,公众号:嵌入式ARMKEIL for ARM 5.33最新版无法正常编译,该如何解决?
这里“有错误和几十个警告”显然预示着这是一个MDK的大瓜,看来必须要吃!
这里的错误和警告,对一般程序员来说,应该就是编译结果的 Error和Warning吧?作为一个跟文章作者一样有代码洁癖的处女座(我的确是处女座),Error和Warning绝对不能忍!
MDK居然搞事情,看我们干它就完了!
【复现问题】
既然是要吃瓜,首先第一步当然是复现问题,顺着原作者提供的步骤,首先就是要准备环境:
MDK 5.33,新鲜冒着热气,木毛病。
接着是下载作者所使用的芯片支持包,很遗憾的是,作者使用的芯片支持包无法从MDK自带的Pack Installer里直接下载获得——显然芯片厂家还没有使用MDK作为自己的正式芯片发布渠道——只能去官网下载……
然而……作者提供的链接居然不能直接点开……(是纯文字)
这……还要我自己找……还好问题不大,有www.arterytek.com和AT32F4的两个关键字,很容易找到:
这里,我放下完整的链接:
http://www.arterytek.com/down...\_Keil\_AT32F4xx\_CH\_V1.3.5.zip
【建立工程】
安装好芯片支持包以后,我们开始建立工程。按照,原文,我们需要选择一个AT32F407的芯片:
可惜截图里作者没有提到具体选哪个芯片型号,因为我看到的界面是这样的:
也就是说,在 AT32F407下还有很多子型号……考虑到子型号差异可能跟这个bug关系不大,所以作者省略了这部分信息吧。于是我也随便选了一个,进入到RTE配置环节。
【RTE配置】
在原文中的截图中,我们注意到,RTE配置中,作者只选择了 GPIO模块,由于可能缺失了一些必要的支持库,MDK通过两种方法给出了明确的Warning信息:
- 在列表中给出黄色标注,提示哪个组件有问题
- 在下面的Validation Output中给出了惊叹号,并在Description中给出了明确的说明
这里,我也复现了同样的情况,所以放大一下:
由于我之前对MDK比较熟悉:知道MDK会聪明的给出警告,同时也知道,很多情况下,只要单击 Resolve按钮,MDK就会自己替你解决问题:
果然,在单击Resolve后Warning消失了,所有选中的模块都变成了绿色。
我观察了下原文,没有提到这里的细节,估计是作者也顺手解决了吧。(然而事后证明我大意了,没有闪)
【工程编译】
在加入了main.c后,我也开始了编译。然而……我翻车了?并没有出现严重的编译错误:
什么情况?说好的瓜呢?0 Error 5 Warning(s)?
突然想起来,是不是因为我自作聪明在RTE配置的时候处理了MDK给我的warning——单击了Resovle?
为了验证我的猜想,我重新配置了RTE,编译后结果如下:
我擦,来了来了,4个Error,60个Warning!虽然跟原文88个warning比少了不少……但至少算是复现了问题。
但,说好的瓜呢?这明显是个MDK通过Warning告知了我们随手Resolve就可以解决下的问题,算不上MDK的Bug吧……
【就事论事说Warning】
好吧,瓜没吃成,我们再来看看之前剩下的5个warning,毕竟原文作者说用armcc(arm compiler 5)就可以做到 0 Error 0 Warning。
我突然想起来以前认识的一个大佬对我说过这样的话:
armcc不报告很多warning恰恰是因为armcc其实不是一个很优秀的编译器,很多主流编译器,比如 gcc,llvm,IAR都会注意到的值得warning的问题,armcc都会忽略……
既然可以掩耳盗铃,我们不妨试试看把Arm Compiler 6的warning模式变得跟 armcc一样:
把这里的 All Warnings改为AC5-like Warnings:
编译下看看:
【遗憾的结语】
忙活了半天,没吃上瓜,我内心是很遗憾的。
虽然我常年给MDK找碴,但不管咋说,MDK已经通过颜色和文字把他检测到的问题告知我们了啊?硬要说这是MDK的问题,MDK也在文档里写清楚这种Warning机制啦……
咋说呢……要我说,要解决这类问题,最好的方案是:
- 每个下载了MDK的中国用户,都被强制要求关注一个MDK公众号(可惜还没有)
- MDK必须每天把自己的文档拆成小文章,推送给每个用户,而且有些内容还要常年重复推送,让大家不至于漏掉……
最后关于大家对armcc的谜之信任,我还是想重复下那句话:
armcc不报告很多warning恰恰是因为armcc其实不是一个很优秀的编译器,很多主流编译器,比如 gcc,llvm,IAR都会注意到的值得warning的问题,armcc都会忽略……
专栏推荐文章
如果你喜欢我的思维,欢迎订阅裸机思维
版权归裸机思维(傻孩子图书工作室旗下公众号)所有,
所有内容原创,严禁任何形式的转载。