FreeRTOS

FreeRTOS下载地址

在这里插入图片描述
选择V9.0.0版本

在这里插入图片描述

点击FreeRTOSv9.0.0.zip下载

FreeRTOS移植
将下载到的资料进行解压得到一个名为FreeRTOS的文件夹,里面包含了两个文件夹FreeRTOS和FreeRTOS-Plus

在这里插入图片描述
1.我们需要在一个Keil工程上移植FreeRTOS,以这个工程为例新建一个名为FreeRTOS的文件夹

 在这里插入图片描述 

2.在FreeRTOS文件夹里面再新建三个文件夹src、port、include

在这里插入图片描述

 3.将下载解压的FreeRTOS\Source中的.c文件复制到新建的FreeRTOS\src文件夹下

在这里插入图片描述

 

4.将FreeRTOS\Source\portable中的MemMang和RVDS文件复制到新建的FreeRTOS\port文件夹下
在这里插入图片描述

5.将FreeRTOS\Source\include中的所有文件复制到新建的FreeRTOS\include文件夹中

在这里插入图片描述

 

6.我使用的是STM32f103c8t6的芯片,这里则选择了FreeRTOSv9.0.0\FreeRTOS\Demo目录下的CORTEX_STM32F103_Keil文件夹,将其中的FreeRTOSConfig.h移植到我们的工程文件夹中,这里移植到了工程中的apps文件夹

在这里插入图片描述

 

7.打开工程中的组文件夹管理,新建FreeRTOS/port组,添加的FreeRTOS\port\RVDS\ARM_CM3下的port.c文件和FreeRTOS\port\MemMang下的heap_4.c文件

在这里插入图片描述

 

8.新建FreeRTOS/src组,添加的FreeRTOS\src下的.c文件

在这里插入图片描述

 

9.还需要将头文件路径引用进来

FreeRTOS测试

在这里插入图片描述
1.修改FreeRTOSConfig.h文件,添加相应的头文件(UART.h为自己编写的文件,里面进行了USART1的初始化配置和重写了fputc函数用于打印串口信息进行调试)和添加
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
在创建任务进行调试的过程中,若不添加这两个宏定义,可能会时vTaskStartScheduler()函数无法执行

extern void xPortSysTickHandler(void);

void SysTick_Handler(void)
{
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
      {
    #endif  /* INCLUDE_xTaskGetSchedulerState */  
        xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      }
    #endif

}

2.修改 stm32f10x_it.c文件,将其中的SVC_Handler(void)和PendSV_Handler(void)函数注释掉,然后实现SysTick_Handler(void)函数
 

 main.c文件

#include "FreeRTOS.h"
#include "Task.h"
#include "led.h"
#include "Delay.h"
void Task1Funtion(void* param);
void Task2Funtion(void* param);
int main(void)
{	
	LED_Init();
	TaskHandle_t xHandleTask1;
	TaskHandle_t xHandleTask2;
	
	xTaskCreate(Task1Funtion,"Task1", 100, NULL, 1, &xHandleTask1);
	xTaskCreate(Task2Funtion,"Task2", 100, NULL, 1, &xHandleTask2);
	vTaskStartScheduler();
	
	
	
	return 0;
}

void Task1Funtion(void* param)
{
	while(1)
	{
		LED1_ON();
		vTaskDelay(1000);
    LED1_OFF();
		vTaskDelay(1000);
	}
	
}

void Task2Funtion(void* param)
{
	while(1)
	{
		bee_on();
		vTaskDelay(2000);
		bee_off();
		vTaskDelay(2000);
	}
}

效果:蜂鸣器响2秒,停止2秒,led灯亮1秒,灭1秒,蜂鸣器和led的工作互补干扰。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值