转载:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5247738&bbs_page_no=1&bbs_id=3066
先说说自己的情况:
看过点抢占式实时操作系统的书,但没有真正使用过。最近使用STM32一阵子了,有块火牛开发板,关注了RTT快一年多。
于是这两天基于火牛板开始学习RT-Thread抢占式操作系统。
下载下来后,简单看了看源代码和编程指南。有点小晕,因为书写风格和自己不太样,而且到处都是 rt_ 的 变量、函数、结构体
另外发现一个问题,基于RT-Thread的文件结构,移植起来比较麻烦。bsp——board support package,都是针对特定的板子定制的驱动。
第一个疑问就是,我自己写好的那些底层驱动怎么用啊?放在哪里啊?难道用一块板子就要重写一遍驱动吗?
针对STM32已经有不少现成的底层驱动,系统架构自认为搭建的不错。于是第一步,就先把RT-Thread的代码划分了下,重构了项目的结构。
使用的工具:
uVision V4.20.03.0
火牛开发板 2009版
win7电脑一台,j-link一个。
版本:
rt-thread V0.3.3 (0.3系列的最终版)
STM32F10x_StdPeriph_Driver V3.4.0
重构的结构图
结构图 (原文件名:sshot-1.png)
此结构图的基本思路如下:
STM32工程模板使用了分层。
层次间只允许高层调用低层,不允许低层调用高层。
相同层次的软件可以互相调用,但必须说明调用关系。
这样便于软件模块化,移植维护也会更方便。
其层次结构如下:
--------------- 最高层 ----------------
| |
层一 | Applications (应用层) |
| |
---------------------------------------
| |
层二 | Modules (组件层) |
| |
--------------------------------------------------------
| API (应用程序编程接口) |
--------------------------------------------------------
| |
| OS (系统) |
| |
--------------------------------------- -------RT-Thread的bsp包就是层三和层四
| |
层三 | Drivers (驱动层) |
| |
--------------------------------------------------------
| CMSIS (Cortex软件标准接口) |
--------------------------------------------------------
| |
层四 | Libraries (芯片库) |
| |
--------------- 最低层 ----------------
1. Applications:应用层
- 包含了main文件, 中断处理文件, 系统配置文件
- 不建议直接调用最底层 Libraries
2. Modules:组件层
- 按大功能划分的软件组件。如UI组件、文件系统
- 不建议直接调用最底层 Libraries
- 用户可在此处添加特定工程的组件层
- 用户可在此处添加常用的组件层(完善模板)
- 将RT-Thread 的 filesystem net rtgui移植到了此层
3. OS:操作系统
- 提供 RT-Thread 系统
- 这一层仅包含 RT-Thread src以及libcpu文件,和finsh组件
4. Drivers:PCB板级驱动
- 如按键、EEPROM、模拟I2C等等
- 该层要能对上屏蔽掉最底层 Libraries
这样起到承上启下的作用,方便跨平台移植
- 部分驱动需要针对RT-Thread系统重写
- 用户可在此处添加特定的驱动
- 用户可在此处添加常用的驱动(完善模板)
5. Libraries:MCU外设库
- 此部分由芯片厂商提供,是标准库
- 用户不得修改此层
6. Compiler:编译器
- 方便跨编译器平台的移植
- 提供 RealView MDK 的工程模板
- 用户可在此处添加其它编译器工程模板(完善模板)
7. Documents:文档说明
- 提供 doxygen 注释风格的模板,说明,软件
- STM32工程模板说明
- Libraries 官方用户手册(仅针对Libraries部分,此文档由doxygen生成)
- 用户可在此处添加其它说明性文件
8. API:Application Programming Interface,应用程序编程接口
- API旨在提供软件抽象层,加快项目的开发和移植速度
- 层一、层二的应用都应该基于API函数来使用
- API函数由 Drivers 和 OS 提供, Libraries不得提供函数到应用接口
- API函数必须使用标准C书写,与软件平台和硬件完全无关
9. CMSIS:Cortex Microcontroller Software Interface Standard,Cortex软件标准接口
- CMSIS是ARM公司发布的一个标准接口,旨在提供Cortex-M处理器系列硬件抽象层
- 仅 Drivers 和 OS 可直接调用 CMSIS 的函数
- 目前仅提供了芯片核心部分的CMSIS,芯片外设标准库仍是由ST官方书写的
其中驱动部分的硬件配置都单独隔离出来,统一放到了 stm32f10x_conf.h 中。
硬件配置代码 (原文件名:sshot-1.png)
譬如上图配置了4个硬件LED灯的IO口信息,并将4盏LED灯分别命名为LED1,LED2,LED3和LED4.
这样修改后,必须要重写部分代码。
Driver是文件中,drv_开头的就是通用驱动。rt_开头的就是针对RT—thread系统重写的底层驱动。debug文件用于assert处理。
改动最大的还是Application中。原代码一律rt_开头的风格能让人很快失去方向,不知道那些是rtt的核心代码,哪些其实是应该自己去写的。
现将startup去除,改为了大多数人乐意看到的 main命名方式
main函数 (原文件名:sshot-1.png)
其中:HardwareInit需要用户自己填入要初始化的硬件设备,如LED灯。
ApplicationInit本质是添加RT-Thread线程。
第一次计划写学习笔记,希望能一周一次,坚持下来。。。
多说无益,最后直接上打包后的工程文件。