智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4048|回复: 5
打印 上一主题 下一主题

【跟我学OSKinetis】第2课-固件库构成详解

[复制链接]

59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15163

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11088
贡献
1415
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
跳转到指定楼层
1#
发表于 2013-10-13 12:29:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 洋葱圈 于 2013-10-19 19:20 编辑

上节我们已经正确部署并运行了第1个例程,而且也学会了如何快速新建一个工程。相信在部署固件库的同时,有些同学就开始研究OSKinetis固件库的目录结构了,用过V2版固件库的同学可能会发现,最新的V3版固件库和旧版本有了较大的区别,那么本节我们就来具体讲讲V3版固件库的构成到底是怎么样的。


目录结构

当你按照第1课中的方法部署好固件库和例程包后,你会得到一个名为”LPLD_OSKinetis_V3”的根目录,我们的所有驱动文件以及用户的工程都包含在这个文件夹里,无论你将它移动到何处,都可以直接用开发工具打开其中的工程进行编译,不会出任何错误。
以这个文件夹为根目录,其下的目录结构如图所示:



“lib”和“project”两个文件夹把所有代码和文件分成了两大阵营,前者是OSKinetis的固件库阵营,后者是OSKinetis的用户工程阵营。两个阵营虽然同在根目录下,但是并不是同级关系,用户工程阵营能否正确编译全仰仗于前者固件库阵营!因为固件库包含了所有底层文件,相当于地基。而用户工程相当于地基上的房子,它所实现的各种功能,都是由固件库里的函数打包封装好的。这就是为什么有部分用户只下载了例程包(用户工程阵营),确不能正确编译工程的缘故了!


有些同学可能又会问了,如果我们自己写程序的话,都会把底层驱动和我的main文件放在一个目录下,这样我只要把他们全部打包便可以移动到任何地方使用了,而有些库也是基于这个思路的。这里拉普兰德要告诉大家,该方法虽然适用于一些小的应用,但是一旦我们的工程多了起来,管理底层驱动是一件非常麻烦的事情,试想你如果有10个关于K60的工程,每个工程地下都分别包含了K60的底层驱动,一旦一个驱动出现BUG,那么你需要全部修复每个工程下的该BUG。而且随着驱动文件的增多,你的复制粘贴操作会变得越来越多,单个工程的大小也会越来越臃肿。


采用拉普兰德OSKinetis固件库的阵营分类方法,可以使开发者们不必再关心每个工程下需要包含哪些驱动文件了,因为大家只要把自己的应用文件放在里面即可。所有工程都是共用固件库阵营里的驱动的!这样的话,固件库驱动归拉普兰德的工程师管理,用户工程归开发者自己管理。固件库中的驱动有任何BUG,我们都会进行统一修复,并发布更新包,大家只需要覆盖固件库(lib)阵营即可。


l
ib固件库文件夹

上节最后说了,lib是由拉普兰德管理的固件库阵营,开发者们不必对该目录下的任何文件做修改。除非个别特殊文件,下面会做提到,开发者可能会需要做点小改动。
Lib文件夹下的结构在上图已经展示出来了,下面我们具体介绍下:


–common文件夹
    此文件夹内的所有代码都是与硬件无关的通用函数代码,例如通用输入输出函数、内存管理函数、断言函数等等。


–CPU文件夹
    与上一个文件夹相反,这里的所有代码都是与硬件相关的函数代码,尤其是与CPU类型相关的。我们的固件库是基于MK60D系列单片机开发的,因此这里的代码和函数都是该款单片机限定的。其中MK60DZ10.h*文件,是MK60D单片机的寄存器结构头文件;startup_K60.s*是单片机的启动文件,用汇编语言编写,里面除了有相关的启动命令,还定义了K60的中断向量表;system_MK60DZ10.c*system_MK60DZ10.h*是K60的系统初始化代码,里面对系统时钟、调试信息输出串口等基本模块进行初始化。以上代码均基于CMSIS规范编写,如果开发者要移植OSKinetis固件库到其他Kinetis单片机,需要根据需求修改这几个文件。


–LPLD文件夹
    该文件夹是OSKinetis的核心所在,这里几乎实现了K60单片机的所有外设模块驱动,该文件夹下又包含如下文件夹和文件:
LPLD
  |_ HW
  |_ DEV
  |_ LPLD_Drivers.h

    其中LPLD_Drivers.h*头文件定义了OSKinetis固件库的版本信息、固件库所支持单片机的引脚枚举定义(PortPinsEnum)、并包含了所有底层模块驱动的头文件。
    HW文件夹包含了所有底层驱动模块的代码文件,例如:GPIO.h和GPIO.c等等。
    DEV文件夹包含了常用的外设器件驱动,该驱动是基于HW内的硬件驱动编写的,同时由于不同的用户应用,所用到的器件引脚、参数可能不同,用户在调用DEV中的驱动时,需要根据实际硬件修改.h中的相关定义,这也是lib中唯一可能需要用户自定义修改的地方。


–iar_config_files
    该文件夹下的文件全部为icf格式文件,即IAR开发工具所用到的连接文件,如果用户需要把程序下载到单片机的RAM运行,就要选择xxKB_Ram.icf文件,如果是要下载到ROM运行,就要选择xxKB_FLASH.icf的文件,当然在模板工程中,我们都为开发者配置好了,大家不必关心。


–USB、FatFs、uCOS-II等文件夹
    这些文件夹包含了非拉普兰德编写的第三方通用驱动、系统文件,例如USB协议栈、FatFs文件系统、uCos操作系统等,我们只是在某些工程中需要用到这些代码,因此统一都归类到lib文件夹中了,随着固件库的更新更多好用的第三方驱动。


Project用户工程文件夹

如果你按照第1节的内容,只部署了固件库,而没有部署例程包,那么看到的/project目录下就是空的。当你部署了例程包后,就会发现n都个用户工程在其中。打开每一个用户工程文件夹都会发现里面的布局是一样的,例如打开“01-LPLD_HelloWorld”工程,该工程目录下有两个文件夹,分别是“app”和“iar”:


–app文件夹
    这里包含的全部是用户工程的代码文件.c和.h,当然还有每个工程必须包含的k60_card.h头文件,这是一个重要文件,下面会讲到。一般情况下,如果用户是用“K60快速建立工程_Vx.x.x.exe”软件新建的工程 ,那么这里包含main()函数的文件就是“你的工程名.c”文件,如果你还需要包含其他代码文件,均可以添加到此目录。


–iar文件夹
    这里包含的是IAR工具的工程文件,这里所有的文件都是“K60快速建立工程_Vx.x.x.exe”软件自动创建的,用户在打开一个工程时,只需选择他的工作空间文件即可,即“你的工程名.eww”文件。


如果用户想要移植OSKinetis固件库到其他开发环境,也可以照猫画虎,新建一个包含开发环境工作空间文件的文件夹,再在里面新建工程文件。例如CodeWarrior开发环境,你可以在工程文件夹下新建一个与iar平级的cw目录,再在里面新建CW的各种工程文件,最后将app中的相关代码添加到工程中,当然这里只是简略说一下移植思路,我们会在以后的课程中具体讲解。


K60_card.h工程参数定义头文件

也许老用户已经发现了,原来包含在lib中的k60_card.h文件,现在已经包含在每个用户工程的app目录下了。这也是V3库的改进之一,原来的k60_card.h文件定位模糊,例如开发者如果需要修改单片机内核频率的话,那么其他所有工程的内核频率都会改变。现在由于每个工程都包含了自己的k60_card.h文件,那么每个工程都可以有自定义的一些功能。你可以在k60_card.h中修改工程的内核频率、总线频率等各种模块时钟,也可以修改该工程是否允许打印一些调试信息到串口,也可以定义该工程是否调用uCos或FatFs等其他第三方驱动。

一些的参数定义及修改方法我们已经在OSKinetis的在线wiki中有记录,请移步查看:http://wiki.lpld.cn/index.php?title=K60_card.h


IAR工程空间结构

上述说的都是windows目录下的文件夹及文件结构,下面我们说说打开IAR开发工具后,你所看到的的workspace工作空间窗口下的结构。

这里的结构与我们的windows目录结构基本一致,只是多了一个“Output”组,这个是IAR自动生成的组,里面包含的是开发工具编译后生成的.out二进制文件以及.map空间分配映射文件。.out用户不必关心,.map是一个比较有意思的文件,你可以从里面看到用户工程生成了哪些连接文件,有哪些是只读的,有哪些是可读写的,他们分别被分配到了单片机的哪些空间,有兴趣的用户可以自行百度下。

上面我们提到了“Output”组这个概念,与windows目录不同,你在IAR工作空间下看到的类似文件夹的东西叫做“组”(Group),因此在IAR开发环境下我们不管“app”叫app文件夹,而是叫app组。这里看到的app组合lib组下的所有结构都与固件库lib文件夹下的结构一样,因此不用再过多介绍。

还是关注例程“01-LPLD_HelloWorld”,因为它只是一个简单例程,因此它的lib组下只包含common、CPU和LPLD这3个基本组,这是所有OSKinetis工程都必须包含的3个组。如果你的工程需要用到USB或者uCos,那么还需要包含USB组或者uCos组,具体包含情况可以参见例程“31-(USB)LPLD_VirtualSerialComm”或例程“(uCos)LPLD_uCosOSSem”。


注:本文中我们提到了不同Kinetis平台移植固件库的概念,所有带*的文件都是在移植过程中需要用户自己修改的。这里只是简单提及一下移植概念,深入步骤和方法请期待后续课程。


拉普兰德OSKinetis V3固件库:http://www.znczz.com/thread-207411-1-1.html

跟我学OSKinetis系列教程(持续更新):http://www.lpld.cn/?tag=%e8%b7%9f%e6%88%91%e5%ad%a6oskinetis

OSKinetis固件库专业讨论群,有机会和固件库开发者一对一交流。QQ群:184156168(入群请输入“LPLD固件库”)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

20

主题

801

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4967

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2934
贡献
605
兑换币
1966
注册时间
2012-9-13
在线时间
714 小时
毕业学校
上海海事大学
2#
发表于 2013-10-13 12:35:00 | 只看该作者
NICe啊
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
110
威望
60
贡献
36
兑换币
38
注册时间
2013-7-2
在线时间
7 小时
毕业学校
哈理工
3#
发表于 2013-10-13 12:58:33 | 只看该作者
好 支持!!
回复 支持 反对

使用道具 举报

59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15163

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11088
贡献
1415
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
4#
 楼主| 发表于 2013-10-14 09:27:42 | 只看该作者
:lol
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

高级会员

Rank: 4

积分
812
QQ
威望
489
贡献
217
兑换币
205
注册时间
2016-5-16
在线时间
53 小时
毕业学校
东北大学
5#
发表于 2016-7-30 21:01:15 | 只看该作者
可以做个视频,让我们学习吗?
回复 支持 反对

使用道具 举报

1

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
429
威望
219
贡献
120
兑换币
139
注册时间
2016-10-18
在线时间
45 小时
毕业学校
天津大学
6#
发表于 2017-1-13 19:55:51 | 只看该作者
写的太棒了
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 13:27 , Processed in 0.090812 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表