• FreeRTOS


    MDK移植FreeRTOS及多任务创建

    1.手动移植FreeRTOS(STM32F103)

    解压得到FreeRTOS源码

    1)把FreeRTOSv9.0.0FreeRTOSDemoCORTEX_STM32F103_Keil目录下的FreeRTOSConfig.h放到source下

    2)FreeRTOSv9.0.0FreeRTOSSourceportableIAR目录下的ARM_CM3复制到keil文件中

    3)然后随意打开一个工程,进行移植。先添加文件夹命名为FreeRtos,向FreeRtos中加源文件

    源文件清单路径如下:
    FreeRTOSSourcelist.c
    FreeRTOSSource asks.c
    FreeRTOSSourceportableKeilARM_CM3port.c
    FreeRTOSSourceportableMemMangheap_4.c
    FreeRTOSSourceFreeRTOSConfig.h

    添加头路径:


    2.多任务创建

    学习FreeRTOS原理,在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:task1,每间隔500ms闪烁(变化)一次LED;task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。

    1.在这里直接打开野火提供的代码SRAM动态创建多任务

    2.对main.c代码进行一点修改

    main.c代码

    /* FreeRTOS头文件 */
    #include "FreeRTOS.h"
    #include "task.h"
    /* 开发板硬件bsp头文件 */
    #include "bsp_led.h"
    #include "bsp_usart.h"
    
     /* 创建任务句柄 */
    static TaskHandle_t AppTaskCreate_Handle = NULL;
    /* LED1任务句柄 */
    static TaskHandle_t LED1_Task_Handle = NULL;
    /* LED2任务句柄 */
    static TaskHandle_t LED2_Task_Handle = NULL;
    
    static void AppTaskCreate(void);/* 用于创建任务 */
    
    static void LED1_Task(void* pvParameters);/* LED1_Task任务实现 */
    static void HelloWorld_Task(void* pvParameters);/* LED2_Task任务实现 */
    //static void AHT20_Task(void* pvParameters);//温湿度数据采集
    static void BSP_Init(void);/* 用于初始化板载相关资源 */
    
    int main(void)
    {	
      BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
    
      /* 开发板硬件初始化 */
      BSP_Init();
      printf("第一次上机实验内容!
    ");
       /* 创建AppTaskCreate任务 */
      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;/* 定义一个创建信息返回值,默认为pdPASS */
      
      taskENTER_CRITICAL();           //进入临界区
      
      /* 创建LED_Task任务 */
      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任务成功!
    ");
      
    	/* 创建HelloWorld_Task任务 */
      xReturn = xTaskCreate((TaskFunction_t )HelloWorld_Task, /* 任务入口函数 */
                            (const char*    )"HelloWorld_Task",/* 任务名字 */
                            (uint16_t       )512,   /* 任务栈大小 */
                            (void*          )NULL,	/* 任务入口函数参数 */
                            (UBaseType_t    )3,	    /* 任务的优先级 */
                            (TaskHandle_t*  )&LED2_Task_Handle);/* 任务控制块指针 */
      if(pdPASS == xReturn)
        printf("创建HelloWorld_Task任务成功!
    ");
      // 创建AHT20_Task任务 
      //xReturn = xTaskCreate((TaskFunction_t )AHT20_Task, /* 任务入口函数 */
                           // (const char*    )"AHT20_Task",/* 任务名字 */
                           // (uint16_t       )512,   /* 任务栈大小 */
                           // (void*          )NULL,	/* 任务入口函数参数 */
                           // (UBaseType_t    )3,	    /* 任务的优先级 */
                          //  (TaskHandle_t*  )&LED2_Task_Handle);/* 任务控制块指针 */
      //if(pdPASS == xReturn)
       // printf("创建AHT20_Task任务成功!
    ");*/
      vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
      
      taskEXIT_CRITICAL();            //退出临界区
    }
    
    static void LED1_Task(void* parameter)
    {	
        while (1)
        {
            LED1_ON;
            vTaskDelay(500);   /* 延时500个tick */
            printf("LED1_Task Running,LED1_ON
    ");
            
            LED1_OFF;     
            vTaskDelay(500);   /* 延时500个tick */		 		
            printf("LED1_Task Running,LED1_OFF
    ");
        }
    }
    
    static void HelloWorld_Task(void* parameter)
    {	
        while (1)
        {
         
    		vTaskDelay(2000);
    		printf("hello,world!!!!!!!!");
    		
    		
        }
    }
    
    //static void AHT20_task(void* parameter)
    //{
    	//温湿度采集代码体
    //}
    static void BSP_Init(void)
    {
    	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
    	/* LED 初始化 */
    	LED_GPIO_Config();
    	/* 串口初始化	*/
    	USART_Config();
    }
    

    3.串口效果图

    4.小灯闪烁效果

  • 相关阅读:
    Windows 2003下面Apache+SVN配置
    Oracle中年月日级联填充查询语句
    Tomcat创建一个windows服务
    Oracle10G常用维护语句汇总
    Oracle10g安装了11g的ODAC后,PL/SQL连接提示TNS:无法解析指定的连接标识符
    小谈EasyUI中的tree用法
    正则表达式用法
    执行存储过程返回游标集合转换成List
    面试过程中关于Oracle的查询
    一个可以匹配整数、浮点数的正则表达式
  • 原文地址:https://www.cnblogs.com/Zzxin/p/14091373.html
Copyright © 2020-2023  润新知