嵌入式第六次作業(1)STM32基於FreeRTOS的多工程式

weixin_51103480發表於2020-12-04

**

STM32基於FreeRTOS的多工程式

**

**

任務要求

**
在STM32下完成一個基於FreeRTOS的多工程式,執行3個週期性task。
task1,每間隔500ms閃爍(變化)一次LED;
task2,每間隔2000ms,向串列埠傳送一次指令資料“helloworld!";
task3,每間隔5000ms,從AHT20採集一次溫溼度資料(不考慮硬體情況,僅寫出整個多工框架模擬程式碼)。(由於缺少硬體,以後補充)

**

FreeRTOS移植

**

介紹

RTOS(Real Time Operating System 實時作業系統。
FreeRTOS是其中應用最為廣泛的一種,開源免費,原始碼和相應的官方書籍均可從官網 www.freertos.org 獲得。
使用FreeRTOS移植原始碼,建立多工進行程式設計可以使微控制器可實現功能更多,多工管理程式設計更加簡單。
這就是區別於裸機系統微控制器程式設計的一點。

應用

由於開發板是野火的指南者,所以配套的資料都由野火提供,我們只需要更改一下主函式部分完成自己的功能需求
首先我們找到目標工程檔案

在這裡插入圖片描述

注意:由於工程檔案路徑太長,我們需要把檔案重新拷貝,否則將打不開keil檔案
開啟後可以看到野火已經給我們寫好了工程,我們只需要修改主函式即可

在這裡插入圖片描述
此時在main.c主程式下去看,包含幾個部分如下:
1、硬體初始化;
2、建立任務。
主函式如下

#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 hello_Task_Handle = NULL;


static void AppTaskCreate(void);
static void LED1_Task(void* pvParameters);
static void hello_Task(void* pvParameters);

static void BSP_Init(void);
int main(void)
{	
  BaseType_t xReturn = pdPASS;
  BSP_Init();
  printf("建立多工\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 )hello_Task, 
                        (const char*    )"hello_Task",
                        (uint16_t       )512,  
                        (void*          )NULL,	
                        (UBaseType_t    )3,	 
                        (TaskHandle_t*  )&hello_Task_Handle);
  if(pdPASS == xReturn)
    printf("hello_Task!\r\n");
                      
  if(pdPASS == xReturn)
    printf("AHT_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 hello_Task(void* parameter)
{	
    while (1)
    {
        vTaskDelay(2000);  
        printf("hello World!\n");
            
    }
}


static void BSP_Init(void)
{
	
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	LED_GPIO_Config();
	USART_Config(); 
}

然後我們進行編譯下載
我使用的是野火的DAP線,所以設定Debug的時候需要注意
在這裡插入圖片描述

隨後就可以直接下載程式到開放板中
在這裡插入圖片描述

讓我們來看一下執行結果:

(1)開放板,LED正常閃亮(由於不能上傳視訊,所以看著有點彆扭)

在這裡插入圖片描述

bandicam 2020-12-04 13-13-51-673

**

視訊地址:

**
https://www.bilibili.com/video/BV11p4y1z7Nc
**

(2)模擬器我們可以看到多個任務程式在同時進行

**
在這裡插入圖片描述

**

總結

**
本文章的重點內容是FreeRTOS的移植和多工的實現。前面內容只是對整個內容的一些介紹,不想了解也沒什麼關係。只是可能在後面程式碼部分,看的不是很懂。不清楚每個部分具體是完成一些什麼操作。本過程初始化函式是必要的,一定不要忘記新增。特別是對串列埠的初始化,如果沒有初始化,程式可能不會報錯,但是,使用串列埠除錯助手進行資料接收就什麼也不會顯示。程式中的printf函式並不是指的C程式中的printf函式,而是串列埠中重新定義的函式,不要混淆了

相關文章