济宁网站优化公司,带后台的html网站源码,凡科平台网站怎么建设,德阳网站建设公司哪家好主要流程参照【FreeRTOS】【STM32】06 FreeRTOS的使用-动态创建单任务
1.定义任务句柄
static TaskHandle_t AppTaskCreate_Handle NULL;2.硬件初始化
略
3.创建具体功能任务函数
见定义任务函数
4.使用xTaskCreate创建任务 xReturn xTaskCreate((TaskFunction_t )AppT…主要流程参照【FreeRTOS】【STM32】06 FreeRTOS的使用-动态创建单任务
1.定义任务句柄
static TaskHandle_t AppTaskCreate_Handle NULL;2.硬件初始化
略
3.创建具体功能任务函数
见定义任务函数
4.使用xTaskCreate创建任务 xReturn xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */(const char* )AppTaskCreate,/* 任务名字 */(uint16_t )512, /* 任务栈大小 */(void* )NULL,/* 任务入口函数参数 */(UBaseType_t )1, /* 任务的优先级 */(TaskHandle_t* )AppTaskCreate_Handle);/* 任务控制块指针 */5.使用vTaskStartScheduler(); /* 启动任务开启调度 */
主要代码清单
头文件 /** ************************************************************************* 包含的头文件* ************************************************************************* //* FreeRTOS 头文件 */#include FreeRTOS.h#include task.h/* 硬件 bsp 头文件 */#include bsp_usart.h...声明和定义
/**************************** 任务句柄 ********************************//** 任务句柄是一个指针用于指向一个任务当任务创建好之后它就具有了一个任务句柄* 以后我们要想操作这个任务都需要通过这个任务句柄如果是自身的任务操作自己那么* 这个句柄可以为 NULL。*//* 创建任务句柄 */static TaskHandle_t AppTaskCreate_Handle NULL;/* LED1 任务句柄 */ static TaskHandle_t LED1_Task_Handle NULL; /* LED2 任务句柄 */ static TaskHandle_t LED2_Task_Handle NULL; /***************************** 内核对象句柄 ******************************//** 信号量消息队列事件标志组软件定时器这些都属于内核的对象要想使用这些内核* 对象必须先创建创建成功之后会返回一个相应的句柄。实际上就是一个指针后续我* 们就可以通过这个句柄操作这些内核对象。** 内核对象说白了就是一种全局的数据结构通过这些数据结构我们可以实现任务间的通信* 任务间的事件同步等各种功能。至于这些功能的实现我们是通过调用这些内核对象的函数* 来完成的**//************************** 全局变量声明 *********************************//** 当我们在写应用程序的时候可能需要用到一些全局变量。*//*************************************************************************** 函数声明**************************************************************************/static void AppTaskCreate(void);/* 用于创建任务 */static void LED1_Task(void* pvParameters);/* LED1_Task 任务实现 */ static void LED2_Task(void* pvParameters);/* LED2_Task 任务实现 */ static void BSP_Init(void);/* 用于初始化板载相关资源 */main函数 /****************************************************************** brief 主函数* param 无* retval 无* note 第一步开发板硬件初始化第二步创建 APP 应用任务第三步启动 FreeRTOS开始多任务调度****************************************************************/int main(void){BaseType_t xReturn pdPASS;/* 定义一个创建信息返回值表示是否创建成功默认为 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(); /* 启动任务开启调度 */
elsereturn -1;while (1); /* 正常不会执行到这里 */}任务入口函数 /************************************************************************ 函数名 AppTaskCreate* 功能说明 为了方便管理所有的任务创建函数都放在这个函数里面* 参数 无* 返回值 无*******************************************************************/static void AppTaskCreate(void){BaseType_t xReturn pdPASS;/* 定义一个创建信息返回值默认为 pdPASS */taskENTER_CRITICAL(); //进入临界区/* 创建 LED_Task 任务 */ 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); /* 创建 LED_Task 任务 */ xReturn xTaskCreate((TaskFunction_t )LED2_Task, /* 任务入口函数 */ (const char* )LED2_Task,/* 任务名字 */ (uint16_t )512, /* 任务栈大小 */ (void* )NULL, /* 任务入口函数参数 */ (UBaseType_t )3, /* 任务的优先级 */ (TaskHandle_t* )LED2_Task_Handle);/* 任务控制块指针 */ if (pdPASS xReturn) printf(创建 LED2_Task 任务成功!\r\n); vTaskDelete(AppTaskCreate_Handle); //删除 AppTaskCreate 任务taskEXIT_CRITICAL(); //退出临界区}XX启动
一个RTOS工程的启动遵循这两个流程。 第一种
/* 硬件初始化 */
硬件初始化。硬件初始化这一步还属于裸机的范畴
/* RTOS 系统初始化 */
RTOS 系统初始化
/* 创建任务 1但任务 1 不会执行因为调度器还没有开启 */
创建各种任务。这里把所有要用到的任务都创建好但还不会进入调度因为这个时候 RTOS 的调度器还没有开启。
/* 创建任务 2但任务 2 不会执行因为调度器还没有开启 */
启动 RTOS 调度器开始任务调度。这个时候调度器就从刚刚创建好的任务中选择一个优先级最高的任务开始运行。
/* 启动 RTOS开始调度 */第二种
/* 硬件初始化 *//* RTOS 系统初始化 *//* 创建一个任务 */
创建一个开始任务。然后在这个初始任务里面创建各种应用任务
/* 启动 RTOS开始调度 */
启动 RTOS 调度器开始任务调度。这个时候调度器就去执行刚刚创建好的初始任务也就是创建任务的任务创建任务。每创建一个任务后它都将进入就绪态系统会进行一次调度如果新创建的任务的优先级比初始任务的优先级高的话那将去执行新创建的任务当新的任务阻塞时再回到初始任务被打断的地方继续执行。反之则继续往下创建新的任务直到所有任务创建完成。各种应用任务创建完成后初始任务自己关闭自己使命完成。FreeRTOS 的启动流程
1.上电 Reset_Handler
我们知道单片机上电之后从Flash启动时在取得栈顶指针之后执行 Reset_Handler复位函数的最后会调用 C 库函数__main。__main 函数的主要工作是初始化系统的堆和栈最后调用 C 中的 main 函数从而去到 C 的世界。 Reset_Handler PROCEXPORT Reset_Handler[WEAK]IMPORT __mainIMPORT SystemInitLDR R0, SystemInitBLX R0LDR R0, __mainBX R0ENDP2.xTaskCreate创建任务
到达main函数之后 xTaskCreate()函数创建任务并且创建任务函数内部 FreeRTOS 会自动帮我们做初始化的事情比如初始化堆内存。
3.开启任务调度
创建完成任务之后空闲任务定时器任务均未实现这些都是在开启调度函数vTaskStartScheduler()中实现的。
为什么要空闲任务因为 FreeRTOS 一旦启动就必须要保证系统中每时每刻都有一个任务处于运行态Runing并且空闲任务不可以被挂起与删除空闲任务的优先级是最低的以便系统中其他任务能随时抢占空闲任务的 CPU 使用权。这些都是系统必要的东西由FreeRTOS自动实现。
动态创建空闲任务
空闲任务的优先级与堆栈大小都在 FreeRTOSConfig.h 中由用户定义空闲任务的任务句柄存放在静态变量 xIdleTaskHandle 中用户可以调用 API 函数 xTaskGetIdleTaskHandle()获得空闲任务句柄。 FreeRTOS自动完成。
创建定时器任务
如果在 FreeRTOSConfig.h 中使能了 configUSE_TIMERS 这个宏定义 FreeRTOS自动完成。