本帖最后由 muyichuan2012 于 2021-1-14 09:18 编辑
* 1.该工程硬件环境为AT-START-F421 Board.
* 2.AT32 MCU芯片--AT32F421
* 3.该工程目的为将FreeRTOS移植到AT32F4系列MCU上,MCU运行时钟为120MHZ.
* 4.该工程实现了在FreeRTOS上进行任务调度,共3个任务交替运行,可通过串
* 口的打印输出信息查看任务的运行顺序,也可观察到目标板上的LED等闪烁.
/**
**************************************************************************
* File Name : main.c
* Description : None
* Date : 2019-07-01
* Version : V1.0.0
**************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include "at32_board.h"
#include "FreeRTOS.h"
#include "task.h"
/* 开始任务优先级 */
#define START_TASK_PRIO 1
/* 开始任务堆栈大小 */
#define START_STK_SIZE 128
/* 开始任务任务句柄 */
TaskHandle_t StartTask_Handler;
/* 开始任务入口函数 */
void start_task(void *pvParameters);
/* LED0任务优先级 */
#define LED0_TASK_PRIO 4
/* LED0任务堆栈大小 */
#define LED0_STK_SIZE 128
/* LED0任务任务句柄 */
TaskHandle_t LED0Task_Handler;
/* LED0任务入口函数 */
void led0_task(void *pvParameters);
/* LED1任务优先级 */
#define LED1_TASK_PRIO 3
/* LED1任务堆栈大小 */
#define LED1_STK_SIZE 128
/* LED1任务任务句柄 */
TaskHandle_t LED1Task_Handler;
/* LED1任务入口函数 */
void led1_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
AT32_Board_Init();
UART_Print_Init(115200);
/* 创建开始任务 */
xTaskCreate((TaskFunction_t )start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
/* 开启任务调度器 */
vTaskStartScheduler();
}
/* 开始任务函数 */
void start_task(void *pvParameters)
{
/* 进入临界区 */
taskENTER_CRITICAL();
/* 创建LED0任务 */
xTaskCreate((TaskFunction_t )led0_task,
(const char* )"led0_task",
(uint16_t )LED0_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED0_TASK_PRIO,
(TaskHandle_t* )&LED0Task_Handler);
/* 创建LED1任务 */
xTaskCreate((TaskFunction_t )led1_task,
(const char* )"led1_task",
(uint16_t )LED1_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED1_TASK_PRIO,
(TaskHandle_t* )&LED1Task_Handler);
/* 删除开始任务 */
vTaskDelete(StartTask_Handler);
/* 退出临界区 */
taskEXIT_CRITICAL();
}
/* LED0任务函数 */
void led0_task(void *pvParameters)
{
while(1)
{
AT32_LEDn_Toggle(LED3);
printf("LED3 Toggle\r\n");
vTaskDelay(1000);
}
}
/* LED1开始任务 */
void led1_task(void *pvParameters)
{
while(1)
{
AT32_LEDn_Toggle(LED2);
printf("LED2 Toggle\r\n");
vTaskDelay(500);
}
}
|