当前位置: 首页 > news >正文

做a免费视频在线观看网站鲜花网站建设源代码

做a免费视频在线观看网站,鲜花网站建设源代码,自己做购物网站,网站策划怎么写主要流程参照【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 R0ENDP

2.xTaskCreate创建任务

到达main函数之后, xTaskCreate()函数创建任务,并且创建任务函数内部 FreeRTOS 会自动帮我们做初始化的事情,比如初始化堆内存

3.开启任务调度

创建完成任务之后,空闲任务定时器任务均未实现,这些都是在开启调度函数vTaskStartScheduler()中实现的。

为什么要空闲任务?因为 FreeRTOS 一旦启动,就必须要保证系统中每时每刻都有一个任务处于运行态(Runing),并且空闲任务不可以被挂起与删除,空闲任务的优先级是最低的,以便系统中其他任务能随时抢占空闲任务的 CPU 使用权。这些都是系统必要的东西,由FreeRTOS自动实现。

动态创建空闲任务

空闲任务的优先级与堆栈大小都在 FreeRTOSConfig.h 中由用户定义,空闲任务的任务句柄存放在静态变量 xIdleTaskHandle 中,用户可以调用 API 函数 xTaskGetIdleTaskHandle()获得空闲任务句柄。 FreeRTOS自动完成。

创建定时器任务

如果在 FreeRTOSConfig.h 中使能了 configUSE_TIMERS 这个宏定义 ,FreeRTOS自动完成。

http://www.yayakq.cn/news/586758/

相关文章:

  • 制作手机端网站开发wordpress国外主题推荐
  • 怎么做免费的网站商城竞价推广渠道
  • 建设网站号码是多少wordpress创建搜索结果
  • 医院网站首页设计天长市城乡规划建设局网站
  • 东莞网站建设 拉伸膜建设银行网站打不开别的网站可以吗
  • 网站如何做成app自己做的手工放在哪个网站卖
  • 免费模板素材网站有哪些商户 wordpress
  • 果洛wap网站建设比较好百度信息流
  • 重庆网站备案公司智能建站网站
  • 哈尔滨市建设安全监察网站django完整网站开发
  • 企业营销网站wordpress tag__not_in
  • 三字型布局的网站网站开发三层架构
  • 给网站写教案做课件一节课多少钱ps怎么艺术字字体设计网站
  • 手机wap网站开发与设计宁波seo推广优化
  • 网站当前链接自己做网站项目
  • 温州快速网站推广公司阿里云邮箱企业版登录入口
  • 让别人做一个网站需要多少钱徐州建设工程材料检测预约网站
  • 搜钛建站北京h5网页设计
  • 中山网站建设文化市场设计师兼职接单
  • 国外开发网站网站域名备案查询系统
  • 杭州营销网站建设公司深圳网站优化运营
  • 西安网站seo报价电脑做视频的网站比较好
  • 什么网站做品牌特卖伊春网站建设公司
  • 手机网站设计尺寸高校网站建设建议
  • 爱站网官网查询域名外围网站怎么做
  • 有哪些网站可以做印度市场调研wordpress登录卡死
  • 域名备案查询站长之家网络信息安全公司排名
  • 免费申请自己的网站如何用ps做网站图标
  • 网站免费打包开个网站做代理赚钱吗
  • 宁波网站推广报价企业网站美工设计