1、设置Include/paths路径
Include paths中需要设置的路径如下;
.\;代表当前目录
..\..\..\..\Library\CMSIS\Include;代表上上上上级目录下的Library目录下的CMSIS\Include
..\..\..\..\Library\Device\Nuvoton\NUC123\Include;代表上上上上级目录下的Library目录下的
..\..\..\..\Library\StdDriver\inc代表上上上上级目录下的Library目录下的StdDriver\inc
特别特别需要注意的是:这个目录是站在工程文件角度来说的,也就是:
这个工程文件所在的路径如下:
D:\project\MIDI\SampleCode\StdDriver\ADC_SingleMode\KEIL
而Library所在的路径如下:
D:\project\MIDI
显然,Library所在的路径比工程文件所在路径高4级,这才有了上面的四个..\。所以,站在工程文件所在路径下,看CMSIS\Include在哪,Device\Nuvoton\NUC123\Include在哪,以及StdDriver\inc在哪,可以用绝对路径,也可以采用相对路径,绝对路径就不需要跟上面那样辛辛苦苦的的找确定多少个..\了,但是坏处就是一旦工程目录发生了变化,这里的路径就都得全部调整。相对路径一次确定终生享用,不管工程路径有什么变更,这里都不需要变化。
2.为什么用户代码划分为inc和src
目的就是为了方便上的路径设置,一次性就可以把用户写的所有的.h文件都包含进来。如果用户按模块来划分,比如;
如果是这样设计目录的话,那么如果外设模块很多或者随时增减的情况下,就必须进入到上面的那个页面中频繁设置路径,很容易出错,所以这样不可取。下面这样才合理:
第三种方式是不是更好呢?
即每个模块都相互独立,不要纠缠在同一个src和inc中,每个模块都有自己的src和inc,即如下:
再改进行一下就变成了下面的这样:
也就是说其实一个功能模块除了有源码(src和inc)之外,还应该有使用说明文档(即doc)以及功能演示工程(即demo)。这样一来的话,src和inc又得放在另一个文件夹中了,思来想去这个文件夹的名称应该与大模块功能同名,比如上面的padkey与PadKey,at24c08与AT24C08。其实很多的第三方模块就是这样做的,不行你看看下面:
在接下来就是将这些模块的src里面的文件以及inc里面的文件添加到工程中去了,在工程中,就真的只需要user/src和user/inc这两个group了。
嵌入式软件设计的分层结构既要做到形式上分层,也要做到逻辑上分层,很多新手仅仅只是做到了形式上分层,逻辑上并没有分层,依然还是相互缠绕在一起,上面调用下面下面调用上面,没大没小的。
3.设置工程所有文件的目录
细心的朋友其实就会发现上面的两个红框的文件图标都有一个箭头的,而下面的这个红框的文件图标是空白的,其实这是一个标志,有箭头的代表路径正确,没有箭头的代表路径有问题,怎么设置?很简单,选择.c文件,然后点击鼠标右键,进入Options for File “xxx.c”对话框,将下面的相对路径调整一下,去掉两个..\,就可以了,这个还是依然站在工程文件路径的角度来设置的。
按照上面的方法逐个修改文件路径之后,这些文件图标就都变成了带箭头的了,一切正常。
编译即可通过。
4.发现大家对这个图标耿耿于怀
这个其实没什么神秘的,它就是用来向工程中添加.c/.s等各种文件的:
其实嘛,我倒觉得这里更方便添加模块名称,比如上面CMSIS、User和Library这些模块名称,然后就可以向其中添加写好的文件。
5.神秘的错误提示:
提示找不到这几个文件的目标文件,貌似这几个文件缺失,后面发现其实并不是这几个文件自己缺失,而是丢失了与他们有关的文件,最后发现竟然是下面这个文件丢失了,这真是折磨人,所以做事要小心认真。