Keil IDE 工具学习
前言
学习过近4年的STM32,通过正点原子的视频还有资料入门的,里面的资料很齐全。可是我很少去看除了视频,原理图,中文手册之外的资料。但是最近翻看了一下那些资料发现了许多的宝藏,比如,CM3权威指南,Ucos-ii的讲解,个人对基础比较喜欢,所以没有去看关于界面EmWin等资料。但是在此之前我解决问题基本靠百度,在座不知道有多少和我一样,哈哈哈哈,遇到问题是完全没有任何头绪,而且心里特别浮躁,想着赶紧解决了,有时候想拿起基础,却又发现无法耐下性子。
从上一段描述,不知到有多少和我相似。既然这样,我们就像办法克服它,所以这段时间研究了以下基础,希望能够给只看视频入门的使用keil的朋友一点逻辑思路,提高解决问题的能力。有句话叫面向百度编程,我们的能力难道就是使用搜索引擎吗?
这里不得不提到一个误区,很多人在教授学习技术的时候,非常推崇搜索引擎。每当群里有小白问及问题时,大神们总会告诉他们:自己不会百度?是的,小白的问题百度能解决,但是这对一个新手是很糟糕的开始,网上提供的解决方案只是一些术而已,它无法提供完整的知识链。导致结果是:嗯?啥东西,这样改,试试,诶!好了,卧槽。然后奔走相告,呼朋唤友。当遇到类似的问题时,又抓耳挠腮,头都秃了,百度就没有一个一模一样问题的答案吗?
有段时间心里非常明白自己水平多少,因为我就是比别人更加会筛选信息而已,表面别人夸赞时谦虚:哎呀,没什么,这都是些基础问题。实则内心慌得一批,希望别再遇到此类需求了。
解决问题的能力绝不是简简单单的东拼西凑,它是一种学习新思维方式逻辑思考后产生的能力,当我们学习了数电,我们就需要根据数电的逻辑去思考,当我们学习了编程,我们就要按照编程逻辑去思考。而这种思考的依赖或者说内容则是基础知识,解决能力则是形式而已。有时候会遇到很多搜索不到的情况,所以我们拥有一个相关知识的逻辑异常重要。
Overview
从图片中可以看到有6部分,分别是标题,菜单,工具,导航,工作区,输出。基本所有的软件似乎大致都是这个模式。至少我用UG是这样。
标题:我们可以知道文件位置。
菜单:所有的功能都在里面,包括工具栏。
工具:常用的工具。
导航:快速跳转到某个文件或者模块,符号。
信息输出:打印出结果,信息等
工作区:工作的区域。
通过主界面我们还能得到以下信息:
调试工具是什么:ST-Link。
当前我的行号是多少:17。
我光标具体行开始多少个字:1。这里调到行最开始就是1,所以我们可以用这个来计算我们选择多少字符
当然我觉着下面这些提示不太需要:caps-大小写锁,num-数字键盘锁,scroll-滚动锁。
有用的:OVR-提示我们是插入模式,R/W或者R/O提示我们该文件是否可更改。
我们还能得出,假设那个界面突然不见了,或者界面形式变了,不要慌,都可以在菜单中找到修改。
菜单
接下来,我们来认识下菜单栏,希望你能收获到你想要的功能,文件功能大家都清楚,就跳过:
前后查看:当你使用goto definition,打开新文件时,你希望能够跳到上一次查看的地方,就可以使用向后查看。
插入/移除标记点:可以插入一个类似书签,可以顺序的跳转,方便查看代码逻辑。
结构:显示函数,if,while,#ifdef endif,等范围,如下:
高级功能:
Select Text between matching braces:快速选择一对括号里面的文字,用来Copy非常方便(ctrl+shift+E):
Go to Matching (ctrl+E):跳转到相匹配的括号的另一半。
Tabify selection:未知功能
缩进和取消缩进,注释与取消注释:能够快速缩进某段代码,使用将光标放置该段或者部分选择即可。注释亦然。
Indent/unIdent text with text:使用某段字符缩进代码:
实际上快速注释就是这个功能衍生过来的,只要使用“//”去缩进即可。
Delete trailing space:删除尾巴的空白。嗯?这个功能实际用途在使用“\”时大有用途,在使用“\”有时候因为其后面有space而报错,增加工作量,使用该功能一键除去:
好的,相信你已经学会了一点点小技巧了,无论是快速编辑代码和查看代码了。接下来我们继续深入。
View
这就是开启主界面某些窗口的集合开关。假设界面少了什么别慌。
工程
基本功能不作解释。
管理工程:对工程的组,包安转,运行时的驱动环境,RTOS进行配置,里面可导入官方提供代码进入工程。(使用不大多,大多数人使用ST的cubemax)
option for target 等会单独讲。
批处理工程:里面允许同时建立多个工程,并且支持批处理编译。
Flash
下载:使用配置好的工具进行下载,理论上可以配置自己的工具到这里来一键下载(如51串口下载)。
擦除:擦除片上所有数据。
配置下载工具下面单独讲。
调试
里面还有很多知识讲,打算重新一篇文章讲。
进入调试按钮,有软件和硬件调试两种。
外设
这个只有在Debug里面才能看到
工具类
PC-Lint:这个工具好像很牛逼的样子,据说它声称可以通过不运行代码找出80%的BUG,软件在附件中。配置方法。。。如果有需求在留言中提,配置起来有点麻烦(英文…)。
定制化工具:是不是支持自己写一款工具(exe的)然后在这里运行(没试过)? 比如自动将头文件中声明的函数,直接在对应C文件中添加定义框架。又或者是通信软件。
版本控制工具
版本控制软件,我只会使用git工具,可以是gitlab,或者github。详细配置见附件
窗口
好像没什么了不得的功能,分屏就是这样:
有点骚气而已,骚操作的华丽外表下,体现的是买不起屏幕的实质,哈哈哈哈。
帮助
嗯,这个帮助挺大的,尤其是那个book。
这是一款绿色的软件,不信你看看他的图标,绿油油。在线帮助就不点了,人家不可能给我联线服务的(好像要十几W左右一套)。我们学习用够了。
到了这里,我们就要在认识一点知识,很多小白的误区,错把IDE与编译器混淆,IDE是Integrated Development Environment,集成开发环境,我们看到的界面叫做IDE,而编译时则是使用的编译器。按照这逻辑,IDE只不过是一个界面而已,是不是我可以换一个界面,只要用对应的编译器。答案是肯定的,你可以换成VS,IAR,eclipse。嗯,只要配置好工具就行。当然,能不能换编译工具,可以的,还有一个GCC是支持的ARM,主要是这个免费,armcc要钱(当然现在低级基本功能可以满足日常学习)。
仔细看图中,是不是有很多工具,那我们来了解下这些工具是怎样完成一次从代码到二进制可执行文件的输出:
图片来源:keil中按F1唤出帮助界面,然后在:
另外一个图也能帮助大家认识:
按下编译按钮,keil干了什么?
我们可以看到,在使用过程中,我们有如下工具:armcc,armasm,armlink,fromelf。好的我们来描述下整体的流程:
首先,我们在keil中编辑C,asm(汇编)文件后,交给armcc与armasm来进行翻译,翻译后的文件可在文件夹OBJ中看到:
接着有很多个object文件,然后armlink将其连接起来,组成一个文件得到:
里面还含有调试信息,这就是图中的image。
最后经过fromelf处理成没任何修饰的,意思就是,直接能够使用的文件bin或者hex文件。可直接烧录,运行。
我们再来回顾下整体:先是有两个翻译器,把其他的文字(abC)翻译成中文,但是呢,文字是一段一段翻译(每段一个.O文件),我们需要组织成一篇文章,就请出我们的编辑给文章修改下结构,最后呢,通过机器(fromelf),把不需要的批注啊,冗余啊,去掉,印成文章,这样会中文的人可以直接看了。
那有没有不使用armcc的呢 ? 有。可以使用GUN工具来
图片来自:CM-3权威指南中文版
文本配置
我们发现,如果自己不爱经常按ctrl+s(保存),可以在这里设置自动保存。
跳过两个,因为好像就是界面背景,字体啥的,没什么讲的。
自动补全功能使我们提高开发,我们可以在这里开启它,(美式键盘)使用crtl+空格。
魔术棒工具
这里配置是大家最关心的了,因为很多时候我们工程报错,无法下载,debug出现的东西和我们想的不一样,都是这里出的问题,那我们掰开了这些东西来理解keil是一个怎样的IDE。
这里是选择相应芯片,如果没有的话,那么要去keil官网下载,51的话用flyMCU软件注入就行:
https://www.keil.com/dd2/Pack/
指出一个常常出的错误,当你的system view file没有使用custom file时,debug时是这样的:
所以经常有很多人问:为什么debug system view 没有寄存器。
我们勾上那个就可以,还不可以?确认下有没有那个SVD文件,这个文件为system view提供具体内容。
使用微库能够减少代码容量,但有时也会造成编译错误(我反正没遇到)。
ROM与RAM配置,它帮助编译器定义下ROM,RAM的范围,使得编译时不会把数据放在范围外。当然你也可以将ROM或者RAM切成两部分使用,这里我是特殊使用所以和平常数据不一样。我把ROM分成了4部分,这里没看出来? 我通过scatter文件代码实现的。当使用手动分配的话,这里设置的IROM1和IROM2就失效了。具体在linker这里配置。
这里告诉我们,我们控制通过某些手段,将代码指定到ROM的任何位置,那么我们再次推,是不是数据也是一样。是的,我们可以设置精确到一个字符都能指定到ROM的某个位置(当然支持flash program,STM32基本都支持)。比如我实现了一个小功能将ROM指定某个1K位置空出来给用户平时存配置数据,掉电还能存在,代替EEROM。
怎样,懵逼了?别急这部分不要求掌握,默认设计即可。若是有这部分需求可在评论中告知,我再写一篇文章。
若想自己琢磨,参考官网的armlink手册。
好的,在这里我们能够控制输出了。若我们想要在AXF文件中加入debug信息的话就勾上Debug Information。若你想输出lib你就可以点击下面这个create library,具体使用可参考下附件2。
清单文件:编译器生成出的文件是这样:
链接器生成的文件:
从map文件中,我们可以找到很多有用的信息,比如数据放在ROM中那个位置,函数属于哪个section。
这里是设置armcc的部分,实际核心是使用命令行,而界面的设置只是在编译执行命令行时添加参数而已。如:
上图是关于汇编的设置。
链接器,它的设置基本是默认的,所以我们基本不动除非有特殊需要,去掉勾use memory layout from Target Dialog。(如有需要可在评论提出,我会给出特殊使用)。
数据的RO/RW/ZI等,我在附件的专业词汇有解释。
这里呢设置的是软件仿真,和硬件仿真。有许多的朋友这里会出问题,调试中system view什么都没。主要问题是,在TARSTM.DLL(动态库这个文件中有许多的函数,我使用反编译打开看过,应该是一个程序),然后-p这个指的是parameter(参数),我们再命令行中习惯用“-”来说明是一个程序的输入选项。这里一开始是-pCM3,需要修改,所以我们选择STM32F103ZE(我的芯片),其他按照实际情况来。
跟踪调试,嗯,这里是使用CM3得到内核的trace功能,效果是:
用来追踪异常(中断),比如,我可以看到进入了多少次的SysTick,或者调度程序,又或是查看哪个中断有没有触发,触发多少次。例如:在自己写RTOS时,你可以通过这个来查看PendSV(关于调度的一个异常,查看CM3内核可知)有没有被设置。
很多朋友会遇到:“no algorithm found”,如下:
问题在于你的下载算法没有设置,设置一个算法即可。我不得不解释下全片擦除和扇区擦除:
首先,在STM32上(可能大部分都是)ROM是分扇区(section)的,假设要在某个位置写一个数据,先必须找到该位置所处的扇区,然后擦除整个扇区,最后写入。
所以全片擦除,就是整个ROM都擦掉。
扇区擦除,就是你代码到哪个扇区就擦掉哪个。
应用
好的,以上功能都学会了吗?
我们来练习下:
1.假设我想在代码中使用宏兼容多个设备,但是呢,又想在用户没具体指定某个设备时告诉它需要指定一个设备。
再通过:
指定一个HD(高容量)设备。
2.如果我想实现让部分代码(函数,数据)固定在某个地址。
代码如上写,然后去掉Linker中的默认使用use memory layout from Target Dialog,再按下edit键,在文件写入如下:
好的现在,在LED.map文件中可看到:
固定在0x0800cc08,代码区域。
还有很多方法来划分ROM,可以将某类函数放一起,某类数据放一起等。
以上所有课参考help:
好的,如有疑问,请在下面评论,下篇讲解Keil Debug界面和设置。
相关术语:https://files.cnblogs.com/files/inkhearts/keil-%E7%9B%B8%E5%85%B3%E8%A7%A3%E9%87%8A.rar