FreeRTOS移植与多任务程序

STM32下基于FreeRTOS的多任务程序



一、FreeRTOS的移植

FreeRTOS是一个热门的嵌入式设备用即时操作系统核心,已被经成功移植到35种不同的微控制器上。小巧且简易,整个核心代码可能只有3到4个C文件。

1、对文件FreeRTOSv9.0.0的操作

在这里插入图片描述
把FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录下的FreeRTOSConfig.h放到source文件目录下:
在这里插入图片描述

把FreeRTOSv9.0.0\FreeRTOS\Source\portable\IAR目录下的ARM_CM3复制到keil文件目录下:
在这里插入图片描述
portable文件夹,我们只需要留下keil、MemMang和RVDS这三个文件夹,其他的都可以删除掉,完成以后如图所示:
在这里插入图片描述

2、任意打开一个工程文件,进行移植。

向工程分组中添加文件
打开基础工程,新建分组FreeRTOS_CORE和 FreeRTOS_PORTABLE,然向这两个分组中添加文件,如图所示:
在这里插入图片描述

3、添加相应的头文件路径

添加完FreeRTOS源码中的C文件以后还要添加FreeRTOS源码的头文件路径,如图:
在这里插入图片描述

在这里插入图片描述

至此,就配置完成可以写代码了。


二、基于FreeRTOS的多任务程序

任务:
task1,每间隔500ms闪烁(变化)一次LED;
task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。

1、打开工程,动态创建多任务

在这里插入图片描述
在这里插入图片描述
把main.c里的static void LED2_Task()函数的内容改为以下:

    while (1)
    {
        printf("hello world!\n"); 
        vTaskDelay(2000);  		
    }

代码见图:
在这里插入图片描述

#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
#include "bsp_usart.h"

static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t LED2_Task_Handle = NULL;
static void AppTaskCreate(void);
static void LED1_Task(void* pvParameters);
static void LED2_Task(void* pvParameters);
static void BSP_Init(void);

int main(void)
{	
  BaseType_t xReturn = pdPASS;

  BSP_Init();
  printf("ÕâÊÇÒ»¸ö[Ò°»ð]-STM32ȫϵÁпª·¢°å-FreeRTOS-¶¯Ì¬´´½¨¶àÈÎÎñʵÑé!\r\n");

  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  
                        (const char*    )"AppTaskCreate",
                        (uint16_t       )512,  
                        (void*          )NULL,
                        (UBaseType_t    )1, 
                        (TaskHandle_t*  )&AppTaskCreate_Handle);
           
  if(pdPASS == xReturn)
    vTaskStartScheduler();   
  else
    return -1;  
  while(1);  
}
static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;
  
  taskENTER_CRITICAL();           
  
  xReturn = xTaskCreate((TaskFunction_t )LED1_Task, 
                        (const char*    )"LED1_Task",
                        (uint16_t       )512,   
                        (void*          )NULL,	
                        (UBaseType_t    )2,	  
                        (TaskHandle_t*  )&LED1_Task_Handle);
  if(pdPASS == xReturn)
    printf("´´½¨LED1_TaskÈÎÎñ³É¹¦!\r\n");
  xReturn = xTaskCreate((TaskFunction_t )LED2_Task, 
                        (const char*    )"LED2_Task",
                        (uint16_t       )512, 
                        (void*          )NULL,	
                        (UBaseType_t    )3,	    
                        (TaskHandle_t*  )&LED2_Task_Handle);
  if(pdPASS == xReturn)
    printf("´´½¨LED2_TaskÈÎÎñ³É¹¦!\r\n");
  
  vTaskDelete(AppTaskCreate_Handle); 
  
  taskEXIT_CRITICAL();            
}
static void LED1_Task(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);   
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);    		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}
static void LED2_Task(void* parameter)
{	
       while (1)
    {
        printf("hello world!\n"); 
        vTaskDelay(2000);  		
    }
}
static void BSP_Init(void)
{
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	LED_GPIO_Config();
	USART_Config();
}



在这里插入图片描述
在这里插入图片描述

2、结果展示

每间隔500ms闪烁(变化)一次LED

在这里插入图片描述

在这里插入图片描述


总结

参考:STM32F1 FreeRTOS开发手册第2章节

.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移植 FreeRTOS 到特定的硬件平台或操作系统,需要进行以下步骤: 1. 硬件和操作系统的了解:首先,你需要对目标硬件平台和操作系统有一定的了解。这包括硬件架构、处理器类型、内存分配方案、中断控制器等。 2. 构建内核:FreeRTOS 的内核代码位于核心文件中,你需要将其添加到你的项目中。这通常涉及将源文件添加到你的构建系统中,并确保正确地编译和链接。 3. 配置内核:FreeRTOS 提供了许多配置选项,你可以根据你的需求进行调整。这些选项包括任务调度策略、内存管理器、中断优先级等。你需要根据你的目标平台进行相应的配置。 4. 硬件驱动程序:根据目标硬件平台,你可能需要编写或调整硬件驱动程序,以便与 FreeRTOS 进行交互。这包括时钟配置、中断处理程序、设备驱动程序等。 5. 编写应用程序:使用 FreeRTOS 提供的 API,你可以编写多个任务,并在其中实现你的应用程序逻辑。任务之间可以进行通信和同步,以实现多任务并发执行。 6. 调试和优化:在移植过程中,你可能会遇到一些问题或性能瓶颈。通过使用调试器和性能分析工具,可以帮助你定位和解决这些问题。 需要注意的是,FreeRTOS 提供了许多示例代码和文档,可以帮助你更好地理解和学习如何移植和使用它。在开始移植之前,建议先阅读相关的文档和资料,以便更好地进行移植工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值