FreeRTOS


MDK移植FreeRTOS及多任務創建

1.手動移植FreeRTOS(STM32F103)

解壓得到FreeRTOS源碼

1)把FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目錄下的FreeRTOSConfig.h放到source下

2)FreeRTOSv9.0.0\FreeRTOS\Source\portable\IAR目錄下的ARM_CM3復制到keil文件中

3)然后隨意打開一個工程,進行移植。先添加文件夾命名為FreeRtos,向FreeRtos中加源文件

源文件清單路徑如下:
FreeRTOS\Source\list.c
FreeRTOS\Source\tasks.c
FreeRTOS\Source\portable\Keil\ARM_CM3\port.c
FreeRTOS\Source\portable\MemMang\heap_4.c
FreeRTOS\Source\FreeRTOSConfig.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("第一次上機實驗內容!\r\n");
   /* 創建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任務成功!\r\n");
  
	/* 創建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任務成功!\r\n");
  // 創建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任務成功!\r\n");*/
  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\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);   /* 延時500個tick */		 		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}

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.小燈閃爍效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM