基于stm32平台freertos的温度数据采集系统大学论文 下载本文

图3-15 PCB BOTTOM层电路图

3.6实物图

根据电气原理图购买相应元器件,最终制作出如图3-16所示电路板。

20

第4章 软件设计

4.1 FreeRTOS 操作系统简介

最早的控制程序设计中,只有应用层和底层驱动。所以设计人员需要编写整个造作程序,过程十分繁琐。Freertos具有公开的源代码,在设计程序的过程中,对该操作系统进行一些改动就可以添加功能,可以有效的减少设计人员的工作量,加快开发速度。Freertos不局限于本设计使用的STM32硬件平台,它与很多硬件平台都可以兼容。该实时操作系统公开、免费,并且不需要设计人员公布自己的源代码,保护开发权。此外,FreeRTOS具有可裁减、可移植的内核,多任任务调度策略,同时支持可以剥夺型任务切换和不可剥夺型任务切换。与UCOS相比,该系统占用的内存和空间都是非常小的,运行效率很高,满足改设计需求

[9]

4.2 操作系统的移植过程

4.2.1 FreeRTOS 源代码结构

在进行FreeRTOS时,需要对FreeRTOS的文件结构进行了解,这样方便更好的了解该系统的移植方法。FreeRTOS 的源代码主要由两部分组成,一部分与内核无关的源文件,如FreeRTOS操作系统说明书和工具等等;另一部与内核相关的文件,如各种.C和.H文件。而主要关心的就是与内核相关的文件。按照内核不同的功能组件,FreeRTOS划分了几个目录,方便用户更好的了解。Inlcude目录公用的头文件,port与底层硬件平台相关的文件。各部分具体包含的代码如图4-1所示。

图4.1 FreeRTOS 源代码结构图

其中,FreeRTOS和系统相关的四个核心函数为tasks.c ,list.c,queue.c,

21

croutine.c。tasks.c主要实现任务调度功能,它通过状态切换,实现不同的任务调度,它可以把任务进行延时,休眠,唤醒及就绪等状态之间进行切换。它这些切换的实现主要通过TCB任务控制链表来实现的,这个链表的每一个节点都包含一个任务的所以信息,如任务状态,任务堆栈及任务当前环境;list.c实现一个数据结构功能,该实现的功能为双链表功能,它定义该链表的删除,插入及创建等功能,提供给内核进行调度算法;queue.c实现系统消息链表队列,它可以进行入队,插入,删除及创建队列等操作,支持信号量的控制;croutine.c这个实现联合程序,主要是为了减少RAM的开销,是一种堆栈的组织形式,该程序是一种任务共享堆栈形式。

为了完成FreeRTOS的移植,需要了解移植的内容,这里主要内容有以下几个:

1、完成普通任务切换的底层实现; 2、完成中断任务切换的汇编程序; 3实现中断处理和时钟节拍;

4调节CPU的寄存器参数和堆栈大小; 5编写入出临界区代码。

系统在移植的过程中,由于FreeRTOS官方提供了这方面的移植例子,所以我们只需要按照修改的例子进行相关代码的修改即可。一般修改的文件是portmacro.h,port.c,portasm.s这三个文件[10]。其中portmacro.h主要定义了一些数据类型,包括函数宏开关,堆栈地址类型,编译器选项等等。port.c文件实现需要花费大量的时间,该部分主要由C语言进行编写,通过修改该文件的堆栈初始化,任务调度及时钟节拍中断服务程序等等。portasm.s该程序有汇编编写,完成最底层的相关驱动函数,该函数一般最先执行,包括开关总中断和临界代码保护等等。

4.2.2 相关代码移植

熟悉相关的移植要求后,就需要对这些文件和本设计的CPU进行移植。 (1)portmacro.h文件

首先移植portmacro.h文件,该文件主要进行了三个方面的移植,分别是数据类型移植、堆栈地址及临界保护。首先数据类型进行了相关的定义。由于编译器不同,一些关键的数据类型都需要重新定义,这样提高程序的可移植性能,如

22

在FreeRTOS定义int、char类型,都是在该关键字上加上port类型,采用宏定义进行定义,其定义格式为

#define 数据类型名 数据类型。

进行了数据类型定义后,接下来修改堆栈的数据类型,由于不同的处理器,它内部的堆栈结构也不会同,一般分为两种类型,分别是地址向上类型和地址向下类型两种方式。如portSTACK_GROWTH=(1)的宏定义表示地址向上增长,而portSTACK_GROWTH=(-1)表示地址方向向下增长。由于STM32的堆栈是向下增长的,因此定义为如下即可。

#define portSTACK_GROWTH (-1)

临界保护定义,主要定义的是进入和退出的中断保护,如#define portENTER_CRITICAL() vPortEnterCritical(),表示开启全部中断;而#define portEXIT_CRITICAL() vPortExitCritical(),表示关闭全局中断,退出临界保护。

(2)portasm.s 文件

Portasm.s 文件主要实现汇编的编写,这部分需要和STM32 CPU内核进行匹配。主要实现中断开启和中断关闭功能。 其代码如下:

开关中断代码如下:

ulPortSetInterruptMask: mrs r0,basepri

mov r1,#configMAX_SYSCALL_INTERRUPT_PRIORITY msr basepri,r1 bx r14

关闭中断代码如下:

vPortClearInterruptMask: msr basepri,r0 bx r14

(3)Port.c 文件

Port.c文件是整个FreeRTOS移植过程中修改最大的文件,主要移植任务堆栈初始化函数,时钟节拍中断函数,任务调度函数及软件中断函数四个函数。这四个函数都用C语言编写。

23