嵌入式实时操作系统tinios 在keil 平台的移植开发 · 2019-10-14 ·...
TRANSCRIPT
嵌入式实时操作系统 TiniOS在 keil平台的移植开发
——使用 STM32F103C8芯片
1.概述
嵌入式实时操作系统 TiniOS 是一个源代码开放的、易于移植的、面向嵌入式应用的实时操
作系统(RTOS),具有轻量级、低功耗、启动快、可裁剪、可分散加载等优点。主要应用领域
为工业控制,智能传感器开发,智能终端,物联网,机器人等。
TiniOS遵循 BSD‐3 开源许可协议,可以免费在商业产品中使用,不需要公布应用源码,没有
任何潜在商业风险。
目前 TiniOS 提供的源码中已适配好 Cortex‐M0/M3/M4/M7 等型号的多种芯片,官方网站上
(http://www.tinios.com/)提供了不同芯片类型在 keil、IAR等平台上的示例工程,如果您使
用的芯片(开发板)未在其中,可以参照本文档从零开始创建自己的开发工程,并验证移植的
结果。
2环境准备
基于 TiniOS开发前,我们首先需要准备好单板运行的环境,包括软件环境和硬件环境。
硬件环境:
所需硬件 描述
开发板 基于 Cortex‐M0,Cortex‐M3,Cortex‐M4 或 Cortex‐M7 内核的芯片开发板。
PC机 用于编译、加载并调试镜像。
电源 开发板供电。
软件环境:
软件 描述
Window7操作系统 安装 Keil和相关调试驱动的操作系统。
Keil(5.18以上版本) 用于编译、链接、调试程序代码
uVision V5.18.0.0 MDK‐Lite
Link驱动 开发板与 pc连接的驱动程序,用户加载及调试程序代码。
说明
Keil工具需要开发者自行购买,Link驱动程序需根据具体使用的开发板芯片来确定,开发板
配套的资料中会提供,或者从使用的芯片官网下载。
3获取 TiniOS源码
首先下载 TiniOS开发包,步骤如下:
‐ 官方网站:http://www.tinios.com/
‐ 点击“内核下载”菜单,下载官方最新版 TiniOS内核源代码。
代码树中各个目录存放的相关内容如下所示:
‐ Doc: 此目录存放的是嵌入式实时操作系统 TiniOS的简明教程和 API使用说明等文档。
‐ Kernel:此目录存放的是与平台无关的内核代码,包含核心提供给外部调用的接口的头文
件以及内核中进程调度、进程通信、内存管理等等功能的核心代码。用户一般不需要修改此
目录下的相关内容。
‐ CPU:此目录以及以下目录存放的是与体系架构紧密相关的适配 TiniOS的代码。比如目前
我们适配了 arm/cortex‐m0,arm/cortex‐m3,arm/cortex‐m4 及 arm/cortex‐m7系列对应的初
始化内容。用户只需要根据所使用的芯片类型及开发平台选择对应的代码文件即可。
‐ Preset:此目录存放嵌入式实时操作系统 TiniOS的预设参数示例,用户可根据芯片类型进
行调整修改。
获取 TiniOS源代码之后,我们就可以开始创建自己的 project 开发工程了。
4创建 TiniOS工程
4.1 创建工程
在安装好 Keil等开发工具后,我们使用 Keil集成开发环境创建 TiniOS工程,步骤如下:
‐ 打开 Keil uVision5, 然后点击 project‐>New uVision Project...创建一个新的工程
‐ 新建保存工程的文件夹“CORTEX_M3_STM32F103C8_KEIL”,保存工程名,比如 TiniuxDemo
‐ 保存后会立即弹出芯片型号选择的窗口,根据实际的开发板的芯片进行选择,比如
STM32F103C8 芯片。
‐ 然后选择要包含的开发基础库,比如 CMSIS、DEVICE两个选项可以选择平台提供的支持包
和启动汇编文件。我们会在后面对相关类库进行手动添加,此处选择"OK"直接跳过。
至此,我们的工程已经创建完成,如下图所示:
完成上面的芯片和支持包选择之后,可以将内核源代码添加到工程中。
4.2 添加 kernel 代码到工程
‐ 为工程创建分组信息,分组如下所示
为工程创建完分组信息后,在工程所在的文件夹中创建对应的目录树。创建完目录树之后,
我们添加源代码到对应的目录中,添加的步骤如下所示:
‐ 将从官网网站下载的 TiniOS 软件包(TiniOS_V3.3.0.zip)解压,把解压后的文件夹更名为
TiniOS,并复制到工程所在的文件夹,如本例程的 CORTEX_M3_STM32F103C8_KEIL文件夹下。
‐ 将从 ST官网下载的软件支持包“en.stm32cubef1.zip”解压,把 Drivers目录下的 CMSIS及
其下的所有文件复制到工程中的 CMSIS文件夹下;把Drivers目录下的 STM32F1xx_HAL_Driver
文件夹及其下的所有文件复制到工程的 Driver文件夹下。
‐ 将工程中 TiniOS\CPU\ARM\KEIL\Cortex_M3\src 及 TiniOS\Kernel\src 目录下的所有 C 文件添
加到工程中的 TiniOS分组中。
‐ 将工程中 CMSIS\Device\ST\STM32F1xx\Source\Templates 下的文件“system_stm32f1xx.c”
及 CMSIS\Device\ST\STM32F1xx\Source\Templates\arm下的文件“startup_stm32f103x6.s”添
加到工程中的 CMSIS分组中。
‐ 将 Driver\STM32F1xx_HAL_Driver\Src中必要的驱动文件添加到工程的 Driver分组中。
‐ 在工程中的 User 文件夹下,为工程添加必要的中断服务函数(参照 ST 示例工程中的
“stm32f1xx_it.c”文件),并将此文件添加到工程中的 User分组中。
‐ 在工程中的 User 文件夹下,为工程编写必要的 main 函数,并将此文件添加到工程中的
User分组中。
完成代码添加后的工程目录如下图
‐ 配置头文件搜索路径,可参考图片中所示内容
.\TiniOS\CPU\ARM\KEIL\Cortex_M3\inc;
.\TiniOS\Kernel\inc;
.\TiniOS\Preset\ARM\Cortex_M3\inc;
.\Library\CMSIS\Include;
.\Library\CMSIS\Device\ST\STM32F1xx\Include;
.\Library\STM32F1xx_HAL_Driver\Inc;
.\User
‐ 通过宏定义为工程指定具体的驱动
ST 官方提供的驱动文件适用多种芯片类型,需要通过宏定义为当前的工程指定具体的芯片
类型,具体宏定义参数为:USE_HAL_DRIVER,STM32F103x6
上述几步设置完毕之后,工程具体配置如下图所示:
‐ 配置 debug使用的驱动,比如您使用的是 STM32F103C8 芯片,调试工具我们选择 J‐LINK。
‐ 如果需要使用 printf输出调试 log,可以使用软件仿真的方式。 此处我们使用硬件在线调
试运行的方式,不对软件仿真进行配置。
4.4 验证移植后的工程
‐ 打开工程后,菜单栏 Project→Clean Targets、Build target、Rebuild All target files,可编译文
件。点击 Rebuild All target file,编译全部文件
编译成功,则上述移植基本完成。若编译失败,则需按照编译器的提示信息进行对应的调整。
5使用 TiniOS开发
TiniOS中提供的功能包括如下内容: 任务创建与删除、任务同步(信号量、互斥锁)、动态
中断注册机制等等内容,更详细的内容可以参考“嵌入式实时操作系统 TiniOS 简明教程”
中描述的相关内容。下面章节将对任务和中断进行说明。
5.1 创建任务
‐ 用户使用 OSTaskCreate(...)等接口函数来进行任务的创建。具体可以参考《嵌入式实时操作
系统 TiniOS简明教程》中的使用方法来创建管理任务。
5.2 系统 tick中断配置修改
芯片运行时钟频率(主频)也是通过预置文件“OSPreset.h”来配置的,其宏定义为
SETOS_CPU_CLOCK_HZ,在示例工程中,我们采用系统默认配置 SystemCoreClock,即 72MHz;
在系统启动时,通过调用系统函数 SystemClock_Config()来配置芯片运行频率;
TiniOS操作系统 ticks运行频率通过预置文件“OSPreset.h”中的宏定义 SETOS_TICK_RATE_HZ
来配置,在官方示例中,我们通常配置 1000Hz;在系统启动时,通过 FitCPU.c 文件中的
FitSetupTimerInterrupt()函数,配置芯片指定的寄存器,使系统时钟(中断)参数生效;
5.3 TiniOS资源配置
‐对于嵌入式系统来说,内存都是比较宝贵的资源,因此一般的程序都会严格管理内存使用,
TiniOS也一样,需要使用多大的内存,可以根据实际的 task数量、信号量、互斥锁、timer、
消息队列、链表等内容的数量来决定的(根据各自的结构体大小以及数量计算),总的内存
池的大小由系统宏定义 OSTOTAL_HEAP_SIZE来确定。
‐TiniOS中的内存使用可以通过参数预置文件“OSPreset.h”进行配置。在系统预置文件中使
用宏定义 SETOS_TOTAL_HEAP_SIZE来确定内存池的大小,并以此来管理任务、信号量、消息
队列等等资源的创建。
6移植其他内核的芯片
‐ 目前 TiniOS 官方已经支持 Cortex‐M0/M3/M4/M7 等系列的芯片,用户若需移植 TiniOS 到
其他内核的芯片时,需要在 CPU 下添加一个芯片所属系列的目录,并且在该新增加的目录
下添加 FitType.h、FitCPU.h、FitCPU.c 等文件,或根据开发平台(keil,IAR 等)的要求,添