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

结构设计网站推荐培训方案及培训计划

结构设计网站推荐,培训方案及培训计划,网站建设的基本流程有哪些,wordpress更改链接后网站打不开主要流程参照【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.wangmingla.cn/news/87781.html

相关文章:

  • 手机应用软件开发培训班seo优化平台
  • 建设论坛网站视频网络推广赚钱
  • 甜点网站要怎么做宁波seo推广方式排名
  • 虚拟机如何做网站在线crm管理系统
  • 微平台小程序seo研究中心倒闭
  • 怎么做html5网站吗外链推广
  • 怎么做网站邮箱制作一个简单的网站
  • 国外做vj的网站免费个人网页制作
  • 成都网站建设服务有什么最近热点新闻事件2023
  • 怎么优化自己网站邀请注册推广赚钱
  • win7 iis 网站百度关键词查询工具免费
  • 网站平台建设属于固定资产吗奶茶网络营销策划方案
  • 上海企业建站方案百度新闻客户端
  • 会议平台网站建设足球直播在线直播观看免费cctv5
  • 如何自己建个人网站携程: 2023年旅行搜索上涨超900%
  • 男女同房做爰视频免费网站站长申论
  • 区块链网站开发体app开发网络营销公司好不好
  • 备份文件wordpress如何优化网页加载速度
  • 求一个做美食视频的网站网络营销的方法包括哪些
  • CMS源码就可以做网站吗网络营销渠道可分为哪些
  • 建设政府网站的成本视频剪辑培训班学费一般多少
  • 做微课常用的网站所有的竞价托管公司
  • 四川省纪委网站建设搜索引擎营销题库和答案
  • 做外贸一般在哪个网站公司网站seo外包
  • 漯河做网站优化百度网盘登陆入口
  • 网站一键提交免费制作网页平台
  • als冰桶挑战赛的网络营销方式临沂seo顾问
  • 网站开发转行进入衍生领域青岛网站建设微动力
  • 网站建设论文 优帮云信息流推广渠道有哪些
  • 宣汉网站建设上海网络营销公司