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

长沙手机网站首页设计公司淮南网络宾馆

长沙手机网站首页设计公司,淮南网络宾馆,手机wap网站如何建设,暴雪战网官网任务创建和删除API函数 xTaskCreat() 、vTaskDelete()函数 1.start_task: 用来创建其他两个任务 ,当此任务运行以后会调用删除任务vTaskDelete() 2.task1_task: 普通应用任务 3.task2_task: 普通应用任务 下面是动态创建任务代码示例: #include &quo…

任务创建和删除API函数

xTaskCreat() 、vTaskDelete()函数

1.start_task: 用来创建其他两个任务 ,当此任务运行以后会调用删除任务vTaskDelete() 2.task1_task: 普通应用任务

3.task2_task: 普通应用任务

下面是动态创建任务代码示例:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"//开始任务
#define START_TASK_SIZE   120  //堆栈大小
#define START_TASK_PRIO   1    //任务优先级
TaskHandle_t StartTask_Hender; //任务句柄
void start_task( void * pvParameters ); //开始函数//任务1
#define TASK1_TASK_SIZE   120
#define TASK1_TASK_PRIO   2
TaskHandle_t Task1Task_Hender; 
void task1_task( void * pvParameters ); //任务2
#define TASK2_TASK_SIZE   120
#define TASK2_TASK_PRIO   3
TaskHandle_t Task2Task_Hender; 
void task2_task( void * pvParameters ); int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组 delay_init();	    				//延时函数初始化	  uart_init(115200);					//串口初始化LED_Init();		  					//LED初始化xTaskCreate( (TaskFunction_t)        start_task,(char *)                "start_task", (configSTACK_DEPTH_TYPE) START_TASK_SIZE,(void *)                 NULL,(UBaseType_t)            START_TASK_PRIO,(TaskHandle_t *)         &StartTask_Hender);vTaskStartScheduler();          //开启任务调度
}void start_task( void * pvParameters )
{//Task1xTaskCreate( (TaskFunction_t)         task1_task,//任务函数(char *)                "task1_task", //任务名(configSTACK_DEPTH_TYPE) TASK1_TASK_SIZE,//任务堆栈大小(void *)                 NULL, //传递给任务函数的参数(UBaseType_t)            TASK1_TASK_PRIO,//任务优先级(TaskHandle_t *)         &Task1Task_Hender);//任务句柄//Task2xTaskCreate( (TaskFunction_t)     task2_task,(char *)                "task2_task", (configSTACK_DEPTH_TYPE) TASK2_TASK_SIZE,(void *)                 NULL,(UBaseType_t)            TASK2_TASK_PRIO,(TaskHandle_t *)         &Task2Task_Hender);vTaskDelete(StartTask_Hender);//删除开始函数			 }
//任务1函数
void task1_task( void * pvParameters )
{char task_num = 0;while(1){task_num++;if(task_num == 5){vTaskDelete(Task2Task_Hender);//当任务1执行5次删除任务2printf("Task2 is Delete \r\n");}LED2 = -LED2;vTaskDelay(1000);printf("Task1 is runing   %d \r\n",task_num);//串口打印任务1执行次数}}
//任务2函数
void task2_task( void * pvParameters )
{char task2_num = 0;while(1){task2_num++;LED3 = -LED3;vTaskDelay(1000);printf("Task2 is runing   %d \r\n",task2_num);//串口打印任务2执行次数}
}

用串口验证函数的执行:

如果要使用静态方法需要将宏 ConfigSUPPORT_STATIC_ALLOCATION 设置为1

1.start_task: 用来创建两个任务

2.task1_task: 普通应用任务

3.task2_task: 普通应用任务

1.静态内存分配的要求
FreeRTOS 默认使用动态内存分配(从堆中分配任务栈和任务控制块TCB)。当启用 静态内存分配(通过configSUPPORT_STATIC_ALLOCATIO N=1)时,用户需自行提供任务所需的内存空间(栈和TCB),否则内核无法运行。
2.系统任务的特殊性
·空闲任务(IdleTask):FreeRTOS 必须的空闲任务,用于清理已删除的任务和进入低功耗模式。
·定时器任务(TimerTask):如果启用软件定时器(configUSE_TIMERS =1),系统需要一个专用任务处理定时器回调。
这两个任务是FreeRTOS 内核的“基础设施”,用户需为它们显式分配静态内存。

步骤:

1.修改宏 , ConfigSUPPORT_STATIC_ALLOCATION  = 1

有两个函数未定义,给函数定义:

 ①.vApplicationGetIdleTaskMemory    给空闲任务分配内存                                   ②.vApplicationGetTimerTaskMemory    给定时器任务分配内存

2.编写测试代码    开始任务  框架    

  task1 task2 框架    

  测试

下面是静态创建任务代码:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"//开始任务
#define START_TASK_SIZE 120//堆栈大小
#define START_TASK_PRIO 1//任务优先级
StackType_t  StartTaskStack[START_TASK_SIZE];//任务堆栈
StaticTask_t StartTask_TCB;//任务控制块
TaskHandle_t StartTask_Handle;//任务句柄
void start_task( void * pvParameters );//开始函数声明//任务1
#define TASK1_TASK_SIZE 120
#define TASK1_TASK_PRIO 3
StackType_t  Task1TaskStack[TASK1_TASK_SIZE];
StaticTask_t Task1Task_TCB;
TaskHandle_t Task1Task_Handle;
void task1_task( void * pvParameters );//任务2
#define TASK2_TASK_SIZE 120
#define TASK2_TASK_PRIO 2
StackType_t  Task2TaskStack[TASK2_TASK_SIZE];
StaticTask_t Task2Task_TCB;
TaskHandle_t Task2Task_Handle;
void task2_task( void * pvParameters );//空闲任务
static StaticTask_t IdleTaskTCB;
static StackType_t  IdleTaskStack[configMINIMAL_STACK_SIZE];void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize ){*ppxIdleTaskTCBBuffer = &IdleTaskTCB;*ppxIdleTaskStackBuffer = IdleTaskStack;*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;}//定时器任务
static StaticTask_t TimerTaskTCB;
static StackType_t  TimerTaskStack[configTIMER_TASK_STACK_DEPTH];void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,StackType_t ** ppxTimerTaskStackBuffer,uint32_t * pulTimerTaskStackSize ){* ppxTimerTaskTCBBuffer = &TimerTaskTCB;* ppxTimerTaskStackBuffer = TimerTaskStack;*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;}int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); delay_init();	    					  uart_init(115200);					LED_Init();		  					StartTask_Handle =  xTaskCreateStatic( (TaskFunction_t) start_task,//任务函数(char * )        "start_task", //函数名(uint32_t)       START_TASK_SIZE,//堆栈大小(void *)         NULL,//传递给任务函数的参数(UBaseType_t)    START_TASK_PRIO,//任务优先级(StackType_t *)  StartTaskStack,//任务堆栈(StaticTask_t *) &StartTask_TCB );//任务控制块vTaskStartScheduler();//开启任务调度
}void start_task( void * pvParameters )
{while(1){//任务1Task1Task_Handle =  xTaskCreateStatic( (TaskFunction_t) task1_task,(char * )        "task1_task", (uint32_t)       TASK1_TASK_SIZE,(void *)         NULL,(UBaseType_t)    TASK1_TASK_PRIO,(StackType_t *)  Task1TaskStack,(StaticTask_t *) &Task1Task_TCB );//任务2											Task2Task_Handle =  xTaskCreateStatic( (TaskFunction_t) task2_task,(char * )        "task2_task", (uint32_t)       TASK2_TASK_SIZE,(void *)         NULL,(UBaseType_t)    TASK2_TASK_PRIO,(StackType_t *)  Task2TaskStack,(StaticTask_t *) &Task2Task_TCB );vTaskDelete(StartTask_Handle);//删除开始函数}}
//任务1
void task1_task( void * pvParameters )
{char Task1_num = 0;
while(1)
{Task1_num++;LED2 = -LED2;vTaskDelay(1000);printf("Task1 is Runing %d \r\n",Task1_num);//打印任务1执行次数}}
//任务2
void task2_task( void * pvParameters )
{ char Task2_num = 0;
while(1)
{Task2_num++;LED3 = -LED3;vTaskDelay(1000);printf("Task2 is Runing %d \r\n",Task2_num);//打印任务2执行次数}}

串口打印:

http://www.dtcms.com/a/597890.html

相关文章:

  • Python应用指南:利用GET请求获取微博小时热搜榜
  • ROS2 Action 通信详解:从自定义消息到 Server/Client 实现(附 MoveIt! 联动示例)
  • 个人建什么网站最赚钱智慧团建网站登录平台pc端
  • 使用新版本cpu编译vLLM cpu端(编译完成,但是SCNet公网转发8000端口后,连不上)
  • 双浩建设网站aspnet网站开发pdf
  • 云南网站制作公司在线生成短链接
  • 上海企业网站制作报价燕郊网站建设
  • 东航数科开源软件治理体系的建设实践”荣获OSCAR开源+安全及风险治理案例
  • 查企业免费的网站郑州同济医院妇科怎么样
  • 基于SAM2的眼动数据跟踪2.1——修正目标消失的记录方式
  • 网站开发包含网站维护吗建设一个网站可以采用那几方案
  • 【C++】--模板进阶
  • 如何选择企业网站建设wordpress 自动跳转
  • 设计深圳网站制作新北方app下载
  • 【Janet】函数
  • 【微服务 - easy视频 | day04】Seata解决分布式事务
  • 网站关键词没有排名怎么用ip做网站
  • Jmeter超详细使用教程
  • 北京网站优化技术学科分类目录
  • 网站源码下载安全吗找一个免费域名的网站
  • 【Git、GitHub、Gitee】GitLab的概念、注册流程、远程仓库操作以及高级功能详解(超详细)
  • 2025三掌柜赠书活动第四十一期 AI Agent 开发实战:MCP+A2A+LangGraph 驱动的智能体全流程开发
  • 1 NLP导论及环境准备
  • 龙岩做网站开发大概价格网页软件有哪些
  • 设计软件网站wordpress付费看
  • C#中,FirstOrDefault
  • 【INVSR 代码解析】encode_first_stage函数,以及一个知识点普通编码器与VAE编码器的区别
  • 面试题:说说Redis的三大问题和解决方案
  • 大型企业网站wordpress评论框制作
  • EtherCAT通信PDO和SDO的区别和使用