赞
踩
1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban
前面章节中的实验都是在裸机环境下实现,本章将介绍FreeRTOS的简单使用,对RTOS感兴趣的读者,可以参考正点原子推出的FreeRTOS或µC/OS-III的全套教程资料,包含教学视频、开发指南并配套有例程源码。通过本章的学习,读者将学习到FreeRTOS的简单应用。
本章分为如下几个小节:
55.1 硬件设计
55.2 程序设计
55.3 下载验证
55.1 硬件设计
55.1.1 例程功能
/* START_TASK任务配置 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务 */ #define START_TASK_PRIO 1 /* 任务优先级 */ #define START_STK_SIZE 128 /* 任务堆栈大小 */ TaskHandle_t StartTask_Handler; /* 任务句柄 */ void start_task(void *pvParameters); /* 任务函数 */ /* LED0任务配置 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务 */ #define LED0_PRIO 2 /* 任务优先级 */ #define LED0_STK_SIZE 128 /* 任务堆栈大小 */ TaskHandle_t LED0Task_Handler; /* 任务句柄 */ void led0_task(void *pvParameters); /* 任务函数 */ /* LED1任务配置 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务 */ #define LED1_PRIO 2 /* 任务优先级 */ #define LED1_STK_SIZE 128 /* 任务堆栈大小 */ TaskHandle_t LED1Task_Handler; /* 任务句柄 */ void led1_task(void *pvParameters); /* 任务函数 */ int main(void) { NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4); /* 设置中断优先级分组为组4 */ sys_apm32_clock_init(15); /* 配置系统时钟 */ delay_init(120); /* 初始化延时功能 */ usart_init(115200); /* 初始化串口 */ led_init(); /* 初始化LED */ 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(); }
从上面的代码中可以看出,在完成必要的初始化后,便创建了“start_task”任务,随后便开始了任务调度,“start_task”任务的入口函数为函数start_task(),如下所示:
/** * @brief start_task * @param pvParameters: 传入参数(未用到) * @retval 无 */ 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_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_PRIO, (TaskHandle_t* )&LED1Task_Handler); vTaskDelete(StartTask_Handler); /* 删除开始任务 */ taskEXIT_CRITICAL(); /* 退出临界区 */ } 从上面的代码中可以看出,“start_task”任务主要用于创建“led0_task”和“led1_task”任务,这两个任务的入口函数,如下所示: /** * @brief LED0任务 * @param pvParameters: 传入参数(未用到) * @retval 无 */ void led0_task(void *pvParameters) { while(1) { LED0(0); vTaskDelay(80); LED0(1); vTaskDelay(920); } } /** * @brief LED1任务 * @param pvParameters: 传入参数(未用到) * @retval 无 */ void led1_task(void *pvParameters) { while(1) { LED1(0); vTaskDelay(300); LED1(1); vTaskDelay(300); } }
可以看到,两个任务分别控制开发板板载的两个LED闪烁,但其闪烁的频率和亮灭时间都不相同,因此因该能看到开发板板载的两个LED以不同的频率和不同的亮灭时间进行闪烁。
55.3 下载验证
在完成编译和烧录操作后,可以看到开发板板载的两个LED以不用的频率和不同的亮灭时间闪烁着,其中LED0在一个闪烁周期内的亮灭时间约分别为80毫秒和920毫秒,LED1在一个闪烁周期内的亮灭时间约分别为300毫秒和300毫秒。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。