FreeRTOS操作系统移植

来源:互联网 发布:js点击按钮跳指定div 编辑:程序博客网 时间:2024/06/05 05:21

参考安富莱的FreeRTOS教程学习的

移植好的工程地址http://download.csdn.net/detail/chen244798611/9764741

1、移植前准备

一、开发环境MDK、STM32F103R8T6(我身边的板子是这个型号、学习用)

二、简单工程里面不能有 SysTick,PendSV 和 SVC 三个系统中断的使用,因为 FreeRTOS 系统要使用这三个中断

2、正式移植

一、从官网下载FerrRTOS  FreeRTOS下载地址  https://sourceforge.net/projects/freertos/files/FreeRTOS/V8.2.3/


下载红色箭头的版本。

二、在简单的工程里新建一个FreeRTOS文件夹



三、添加文件到第二步新建的FreeRTOS文件夹里面

解压刚才下载的软件包,打开可以看到如下文件,把FreeRTOS里面的source复制到第二步新建的文件夹里面



在User文件夹中添加FreeRTOSConfig.h 文件中

FreeRTOSConfig.h 文件所在的路径   FreeRTOS\FreeRTOSV8.2.3\FreeRTOS\Demo\CORTEX_STM32F103_Keil  因为使用的是stm32而且是keil


四、添加文件至工程

把FreeRTOS相关的文件添加到简单的工程里面,如下图


其中heap_4.c文件的路径是 FreeRTOS\FreeRTOSV8.2.3\FreeRTOS\Source\portable\MemMang

port.c和portmacro.h文件的路径是 FreeRTOS\FreeRTOSV8.2.3\FreeRTOS\Source\portable\RVDS\ARM_CM3


五、新建一个includes.h的头文件 将所有的头文件添加到这里



六、添加头文件的路径



七、添加宏定义 在FreeRTOSConfig.h末尾


在FreeRTOSConfig.h文件的末尾加上 Systick,PendSV 和 SVC 中断函数的宏定义,目的是将 FreeRTOS 移

植文件 port.c 文件里面的中断服务程序映射到 CMSIS 定义的标准名称,这样就不需要用户去修改工
程启动代码中这几个中断的名字了,很方便就实现了两个函数的统一。 
 


八、删除stm32f10x_it.c文件中的 PendSV 和 SVC 中断函数的的定义


九、修改任务堆栈的大小、根据自己板子修改 如果RAM大可以不修改



到这里移植工作基本OK


三、编写程序测试


#include "includes.h"


TaskHandle_t xHandleTaskLEDON = NULL;
TaskHandle_t xHandleTaskLEDOFF = NULL;


void vTaskLEDON(void *pvParameter)
{
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_9);//led灭
vTaskDelay(400);
}
}


void vTaskLEDOFF(void *pvParameter)
{
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_9);//led亮
vTaskDelay(200);
}
}


void TaskCreate(void)
{
xTaskCreate(vTaskLEDON,     //任务函数
"vTaskLEDON",   //任务名
512,            //任务栈大小
NULL,           //任务参数
1,              //任务优先级
xHandleTaskLEDON //任务句柄
);
xTaskCreate(vTaskLEDOFF,    //任务函数
"vTaskLEDFF",   //任务名
512,            //任务栈大小
NULL,           //任务参数
2,              //任务优先级
xHandleTaskLEDOFF//任务句柄
);
}




/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形    参:无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/


int main()
{
__set_PRIMASK(1); 
bsp_InitLED();//初始化LED


TaskCreate();//创建任务
vTaskStartScheduler();//启动调度,开始执行任务
while(1)
{


}
}


测试结果LED不停的闪烁 ,这样可以证明移植成功  



0 0