您的位置:首页 > 其它

01_FreeRTOS在stm32f103上的移植

2018-03-05 14:28 316 查看

FreeRTOS在stm32f103上的移植

1. FreeRTOS下载包文件结构

下载包目录包含两个子目录:FreeRTOS和FreeRTOS-Plus。现在只关心FreeRTOS下的文件。在FreeRTOS文件下下包含如下文件:

FreeROTS
|+--Demo        包含演示工程历程
|+--License
|+--Source      包含实时内核源文件。


在Source文件夹下包含RTOS的三个核心代码文件: tasks.c、queue.c、list.c。在该目录下还包含可选文件: timers.c、event_groups.c、croutine.c,分别实现软件定时、事件组和协程功能。

FreeRTOS/Source目录结构如下所示:

FreeROTS
|+--Source      包含实时内核源文件。
|+--include     RTOS内核代码头文件
|+--portable    处理器特定代码
|---croutine.c  协程功能源码文件
|---event_groups.c  事件组源码文件
|---list.c          RTOS核心源码文件
|---queue.c         RTOS核心源码文件
|---tasks.c         RTOS核心源码文件
|---timers.c        软件定时器源码文件


在portable目录下,包含了需要移植的代码,在该目录下包含2方面内容:编译器移植包和内存堆实现范例。

|+--portable    处理器特定代码
|+--Compiler xxx    支持编译器xxx的所有移植包
|+--MemMang         内存堆实现范例


2.移植FreeRTOS到stm32f103

根据前面的表述,移植FreeRTOS主要是移植…\FreeRTOS\Source\portable\目录下的文件,在该目录下根据自己编译器和需要选择的内存堆管理文件进行移植。现在以IAR为例,移植FreeRTOS。

2.1、添加RTOS核心代码

a、添加FreeRTOS核心文件: list.c、queue.c、tasks.c    到工程。
b、添加编译器相关的文件到工程,即添加...\FreeRTOS\Source\portable\IAR\ARM_CM3下的文件到工程。
c、添加内存管理文件到工程,即添加...\FreeRTOS\Source\portable\MemMang\heap_4.c (这选择heap_4.c)。
d、将 ...\FreeRTOS\Demo\CORTEX_STM32F103_IAR\FreeRTOSConfig.h复制到自己的工程中。
e、在工程中设置编译器IAR需要查找的头文件库。


2.2、挂接中断

在Cortex-M3硬件下,FreeRTOS使用SysTick作为系统节拍时钟,使用SVC和PendSVC进行上下文切换。异常中断服务代码位于…\FreeRTOS\Source\portable\IAR\ARM_CM3\port.c文件中,FreeRTOS已经为各种构架的CPU写好了这些代码,可以直接拿来用,需要做的是将这些异常中断的入口地址挂接到启动代码中。在 FreeRTOSConfig.h 添加如下定义:

#define xPortPendSVHandler  PendSV_Handler
#define vPortSVCHandler     SVC_Handler
#define xPortSysTickHandler SysTick_Handler


2.3、建立第一个任务

#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "uart1.h"
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"

#define     UART1_BAND      (115200)

/* 任务优先级 */
#define TASK1_PRIO              1
/* 任务堆栈大小 */
#define TASK1_STAK_SIZE         256
/* 任务句柄 */
TaskHandle_t Task1_Handler;
void vTask1(void *pvParameters)
{
for(;;)
{
printf("vTask1任务运行\r\n");
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}

int main(void)
{
vUart1Init(UART1_BAND);
xTaskCreate((TaskFunction_t )vTask1,           /* 任务函数 */
(const char*    )"vTask1",         /* 任务名称 */
(uint16_t       )TASK1_STAK_SIZE,  /* 任务堆栈大小 */
(void*          )NULL,             /* 传递给任务函数的参数 */
(UBaseType_t    )TASK1_PRIO,       /* 任务优先级 */
(TaskHandle_t*  )&Task1_Handler);  /* 任务句柄 */
vTaskStartScheduler();          /* 开启任务调度 */
}


至此移植工作完成。

3、FreeRTOSConfig.h中的一些设置

3.1、设置节拍时钟

configCPU_CLOCK_HZ (你的硬件平台CPU系统时钟,Fcclk)

configTICK_RATE_HZ ((portTickType)100)

第一个宏定义CPU系统时钟,也就是CPU执行时的频率。第二个宏定义FreeRTOS的时间片频

率,这里定义为100,表明RTOS一秒钟可以切换100次任务,也就是每个时间片为10ms

3.2、设置中断优先级相关宏

#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS             __NVIC_PRIO_BITS
#else
#define configPRIO_BITS             4
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15                      //中断最低优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5                       //系统可管理的最高中断优先级
/* 设置内核使用的中断优先级 */
#define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
94ee
/* 定义RTOS可以屏蔽的最大中断优先级,大于这个优先级的中断,不受RTOS控制 */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )


关于FreeRTOS的其它配置宏后面用到再描述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: