本博客主要学习了野火的FreeRTOS的教材,根据创建动态任务时点灯的一些知识做了流程图的理解,能更加深刻地理解点灯背后的处理机制。
包括:优先级抢占、空闲任务、任务调度、动态任务创建过程
这里比较潦草,直接在教材的PDF编辑了
1代表的是任务1:LED1_Task点灯翻转
2代表的是任务2:LED2_Task点灯翻转
且任务2的优先级的是比1的要高
但这两个在翻转过程设置的延时阻塞时间是不一样的,一个是500ms,一个是1000ms
下面主要分析程序的这个翻转过程,包括通过串口打印运行测试的现象理解:
还是比较潦草:直接上截图了
现象:串口打印如下:
?颜色的灯的现象:红黄绿 循环
主函数代码实现,这里主要是源自野火开发平台:
* 实验平台:野火 STM32 F407 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
******************************************************************************
*/
/*
*************************************************************************
* 包含的头文件
*************************************************************************
*/
/* FreeRTOS头文件 */
#include "FreeRTOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"
/* 开发板硬件bsp头文件 */
#include "bsp_led.h"
#include "bsp_debug_usart.h"
/*创建任务句柄*/
static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t LED2_Task_Handle = NULL;
/*函数声明*/
static void BSP_Init(void);
static void LED1_Task(void * parameter);
static void LED2_Task(void * parameter);
static void AppTaskCreate(void);
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
BaseType_t xReturn = pdPASS;
/*开发板硬件初始化*/
BSP_Init();
/*创建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;
for(; ;); /*正常程序不会执行到这里*/
}
static void BSP_Init(void)
{
/*优先级分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
/*LED 初始化*/
LED_GPIO_Config();
/*串口初始化*/
Debug_USART_Config();
}
/*AppTaskCreate 任务函数*/
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
/*进入临界区*/
taskENTER_CRITICAL();
/*创建LED1_Task任务*/
xReturn = xTaskCreate((TaskFunction_t)LED1_Task,
(const char *)"LED1_Task",
(uint16_t)128,
(void *)NULL,
(UBaseType_t) 3,
(TaskHandle_t *)&LED1_Task_Handle);
/*判断LED_Task是否创建成功*/
if (pdPASS == xReturn)
printf("LED1_Task任务创建成功!\n");
/*创建LED2_Task任务*/
xReturn = xTaskCreate((TaskFunction_t)LED2_Task,
(const char *)"LED2_Task",
(uint16_t)128,
(void *)NULL,
(UBaseType_t) 4,
(TaskHandle_t *)&LED2_Task_Handle);
/*判断LED_Task是否创建成功*/
if (pdPASS == xReturn)
printf("LED2_Task任务创建成功!\n");
/*删除AppTaskCreate_Handle任务*/
vTaskDelete(AppTaskCreate_Handle);
/*退出临界区*/
taskEXIT_CRITICAL();
}
/*LED_Task 任务函数*/
static void LED1_Task(void * parameter)
{
for(;;)
{
LED1_ON; //红色
vTaskDelay(500);//延时500tick
printf("LED1_Task running,LED1_ON\r\n");
LED1_OFF;
vTaskDelay(500);
printf("LED1_Task running,LED1_OFF\r\n");
}
}
/*LED_Task 任务函数*/
static void LED2_Task(void * parameter)
{
for(;;)
{
LED2_ON; //绿色
vTaskDelay(1000);
printf("LED2_Task running,LED2_ON\r\n");
LED2_OFF;
vTaskDelay(1000);
printf("LED2_Task running,LED2_OFF\r\n");
}
}
?
?
|