【雅特力开发板 AT32F421 测评】3. FreeRTOS的移植[附源码]
[复制链接]
本文的目标是创建了2个任务,最终实现开发板上的2个led交替闪烁。
AT 提供了一套完整的 BSP&Pack 用于开发(百度网盘链接中可找到)。 主要包括 at32f4xx 外 设 驱 动 库 、 内 核 相 关 文 件 、 完 整 的 应 用 例 程 以 及 能 够 支 持 Keil_v5 、 Keil_v4 、 IAR_v6 和 IAR_v7、IAR_v8等多种开发环境的 Pack 文件。
1. AT32F421 内核为 Cortex ® -M4F。CM4 内核文件拷贝进来,CM4 文件源码路径:BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\CoreSupport
AT 启动文件源码路径: BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Libraries\CMSIS\CM4\DeviceSupport\startup\mdk
启动文件的选择可以参考文档 《AT32F4xx标准库BSP&Pack应用指南.pdf》中的 2.2 BSP使用方法。因为移植比较简单,所以以下是从零移植。如果工程中已有 FreeRTOS 框架,则只需要替换即可。
2. 获取 FreeRTOS 源码
方法1: * FreeRTOS官网:http://www.freertos.org/ *
最后,拷贝 FreeRTOSConfig.h 文件到 user 文件夹,即是和 main.c 一起即可(可自由存放)。
FreeRTOSConfig.h 文件是 FreeRTOS 的工程配置文件。
主要用于配置和裁剪 FreeRTOS 内核。
移植OK后,Main.cw enain
#include <stdio.h>
#include "at32_board.h"
#include "FreeRTOS.h"
#include "task.h"
/** @addtogroup AT32Fxx_StdPeriph_Templates
* @{
*/
/** @addtogroup FreeRTOS_Demo
* @{
*/
/* Private define ------------------------------------------------------------*/
TaskHandle_t LED2_Handler;
TaskHandle_t LED3_Handler;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/* LED2 task */
void LED2_task_Function(void *pvParameters);
/* LED3 task */
void LED3_task_Function(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
/*Configure LED2/3 in AT_START_BOARD*/
AT32_LEDn_Init(LED2);
AT32_LEDn_Init(LED3);
AT32_LEDn_OFF(LED2);
AT32_LEDn_OFF(LED3);
UART_Print_Init(115200);
/* Enter critical */
taskENTER_CRITICAL();
/* Create LED2 task */
if(xTaskCreate((TaskFunction_t )LED2_task_Function,
(const char* )"LED2_task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED2_Handler) != pdPASS)
{
printf("LED2 task could not be created as there was insufficient heap memory remaining.\r\n");
}
else
{
printf("LED2 task was created successfully.\r\n");
}
/* Create LED3 task */
if(xTaskCreate((TaskFunction_t )LED3_task_Function,
(const char* )"LED3_task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED3_Handler) != pdPASS)
{
printf("LED3 task could not be created as there was insufficient heap memory remaining.\r\n");
}
else
{
printf("LED3 task was created successfully.\r\n");
}
/* Exit critical */
taskEXIT_CRITICAL();
/* Start Scheduler */
vTaskStartScheduler();
}
/* LED2 task function */
void LED2_task_Function(void *pvParameters)
{
while(1)
{
AT32_LEDn_Toggle(LED2);
vTaskDelay(1000);
}
}
/* LED3 task function */
void LED3_task_Function(void *pvParameters)
{
while(1)
{
AT32_LEDn_Toggle(LED3);
vTaskDelay(500);
}
}
|