FreeRTOS操作系统移植

参考安富莱的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
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做了不一定能实现但不做一定不会实现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值