没有网站可以做京东联盟吗,artdialog wordpress主题,群晖 搭建wordpress,nofollow外链对于网站有提升吗【嵌入式——FreeRTOS】任务 任务创建和删除动态方式创建任务静态方式创建任务 删除任务任务切换调度器任务切换流程 任务挂起任务恢复相关API函数 任务创建和删除
动态方式创建任务
任务的任务控制块以及任务的栈空间所需的内存#xff0c;均由freeRTOS从freeRTOS管理的堆中… 【嵌入式——FreeRTOS】任务 任务创建和删除动态方式创建任务静态方式创建任务 删除任务任务切换调度器任务切换流程 任务挂起任务恢复相关API函数 任务创建和删除
动态方式创建任务
任务的任务控制块以及任务的栈空间所需的内存均由freeRTOS从freeRTOS管理的堆中分配。此函数创建任务会立刻进入就绪态由任务调度器调度运行。 任务的优先级值越大优先级越高。
函数
xTaskCreate();
//返回值为pdPASS任务创建成功。
//返回值为errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY任务创建失败BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //指向任务函数的指针const char * const pcName, //任务名字 最大长度configMAX_TASK_NAME_LEN(20)const configSTACK_DEPTH_TYPE usStackDepth, //任务堆栈大小 字为单位void * const pvParameters, //传递给任务函数的参数UBaseType_t uxPriority, //任务优先级 范围 0 ~ configMAX_PRIORITIES(32)-1 TaskHandle_t * const pxCreatedTask ) //任务句柄任务的任务控制块示例
static void udpserver_sendto_client (void* argument){}static TaskHandle_t udpserver_tid;#define UDPSERVER_THREAD_NAME task name
#define UDPSERVER_THREAD_STKSZ (configMINIMAL_STACK_SIZE * 4)
#define UDPSERVER_THREAD_PRIO (tskIDLE_PRIORITY 3)BaseType_t ret xTaskCreate(udpserver_sendto_client, UDPSERVER_THREAD_NAME, UDPSERVER_THREAD_STKSZ,
NULL, UDPSERVER_THREAD_PRIO, udpserver_tid);
实现动态创建任务流程
将FreeRTOSConfig.h文件中的configSUPPORT_DYNAMIC_ALLOCATION宏配置为1定义函数入口参数编写任务函数。
动态创建任务内部实现
申请堆栈内存和任务控制块内存TCB结构体成员赋值把前面申请的堆栈地址赋值给控制块的堆栈成员初始化控制块中的成员添加新任务到就绪列表。
静态方式创建任务
任务的任务控制块以及任务的栈空间所需的内存需用户分配提供。
函数
xTaskCreateStatic();
//返回值为句柄或者其他值任务创建成功。
//返回值为NULL任务创建失败。TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, //指向任务函数的指针const char * const pcName, //任务名字 最大长度configMAX_TASK_NAME_LEN(20)const uint32_t ulStackDepth, //任务堆栈大小 字为单位void * const pvParameters, //传递给任务函数的参数UBaseType_t uxPriority, //任务优先级 范围 0 ~ configMAX_PRIORITIES(32)-1 StackType_t * const puxStackBuffer, //任务堆栈一般为数组由用户分配StaticTask_t * const pxTaskBuffer ) //任务控制块指针由用户分配PRIVILEGED_FUNCTION;示例
#define STACK_SIZE 200//空闲任务配置
StaticTask_t idle_task_tcb;
StackType_t idle_task_stack[configMINIMAL_STACK_SIZE];//软件定时器任务配置
StaticTask_t time_task_tcb;
StackType_t time_task_stack[configTIMER_TASK_STACK_DEPTH];StaticTask_t xTaskBuffer;
StackType_t xStack[ STACK_SIZE ];//空闲任务内存分配
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer idle_task_tcb;*ppxIdleTaskStackBuffer idle_task_stack;*pulIdleTaskStackSize configMINIMAL_STACK_SIZE;}//软件定时器内存分配
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,StackType_t ** ppxTimerTaskStackBuffer,uint32_t * pulTimerTaskStackSize )
{*ppxTimerTaskTCBBuffer time_task_tcb;*ppxTimerTaskStackBuffer time_task_stack;pulTimerTaskStackSize configTIMER_TASK_STACK_DEPTH;}void vTaskCode( void * pvParameters ){}TaskHandle_t xHandle xTaskCreateStatic(vTaskCode, // Function that implements the task.NAME, // Text name for the task.STACK_SIZE, // Stack size in words, not bytes.( void * ) 1, // Parameter passed into the task.tskIDLE_PRIORITY,// Priority at which the task is created.xStack, // Array to use as the tasks stack.xTaskBuffer ); // Variable to hold the tasks data structure.静态创建任务使用流程 将FreeRTOSConfig.h文件中的configSUPPORT_STATIC_ALLOCATION宏配置为1 定义空闲任务和定时器任务的任务堆栈即TCB 实现两个接口函数 vApplicationGetIdleTaskMemory()vApplicationGetTimerTaskMemory()可选的 定义函数入口参数 编写任务函数
静态创建任务内部实现
TCB结构体成员赋值添加新任务到就绪列表
删除任务
用于删除已经被创建的任务。被删除的任务将从就绪态任务列表阻塞态任务列表挂起态任务列表和事件列表中移除。
函数
vTaskDelete();void vTaskDelete( TaskHandle_t xTaskToDelete )
//xTaskToDelete 待删除的任务句柄注意
当传入的参数为NULL则代表删除任务自身(当前正在运行的任务)。空闲任务会负责释放被删除任务中由系统分配的内存但是由用户在任务删除前申请的内存则需要由用户在任务被删除前提前释放否则将导致内存泄漏。
删除任务流程
将INCLUDE_vTaskDelete宏配置为1入口参数输入需要删除的任务句柄(NULL代表自身)
删除任务内部实现过程 获取所要删除任务的控制块 将被删除的任务移除所在列表 判断所需删除的任务 删除任务自身需先添加到等待删除列表内存释放将在空闲任务进行。删除其他任务释放内存任务数量– 更新下个任务的阻塞时间
任务切换
调度器
实现任务间的切换。本质就是CPU寄存器的切换
//启动任务开启调度
vTaskStartScheduler();当由任务A切换到任务B时主要分为两步
第一步需暂停任务A的执行并将此时任务A的寄存器保存到任务堆栈这个过程叫做保存现场。 第二步将任务B的各个寄存器值(被存于任务堆栈中)恢复到CPU寄存器中这个过程叫做恢复现场。对任务A保存现场对任务B恢复现场这个过程被称为上下文切换。
任务切换流程
触发PendSV中断当前的psp是正在运行的任务的栈指针读取当前psp进程指针存入r0压栈(保存现场)获取当前最高优先级任务的任务控制块出栈(恢复现场)更新切换后的任务的栈指针给pspbx r14指向新任务函数
PendSV中断如何触发
滴答定时器中断调用。执行FreeRTOS提供的相关API函数portYIELD();
任务挂起
挂起任务
函数
此函数用于挂起任务使用时将FreeRTOSConfig.h文件中宏INCLUDE_vTaskSuspend配置为1。 无论优先级如何被挂起的任务都将不再被执行直到任务被恢复。 当传入参数为NULL则代表挂起任务自身(当前正在运行的任务)。
void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION;
//xTaskToSuspend 待挂起任务的句柄任务恢复
恢复被挂起的任务
函数
此函数用于恢复任务使用时将FreeRTOSConfig.h文件中宏INCLUDE_vTaskSuspend配置为1。 任务无论被挂起多少次只需在任务中调用vTaskResume()恢复一次就可以继续运行且被恢复的任务会进入就绪状态。 在中断中恢复被挂起的任务。带有“FromISR”后缀是在终端函数中专用的API函数
void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;
//xTaskToResume 待恢复任务的任务句柄此函数用于恢复任务使用时将FreeRTOSConfig.h文件中宏INCLUDE_vTaskSuspend配置为1宏INCLUDE_xTaskResumeFromISR配置为1。 被恢复的任务的优先级大于当前执行的任务的优先级就会返回pdTRUE需要手动执行任务切换(portYIELD_FROM_ISR()函数)。 中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于freeRTOS所管理的最高优先级(5~15)。
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;
//xTaskToResume 待恢复任务的任务句柄
//返回值 pdTRUE 任务恢复后需要进行任务切换 pdFALSE任务恢复后不需要进行任务切换相关API函数
函数描述uxTaskPriorityGet()获取任务优先级vTaskPrioritySet()设置任务优先级uxTaskGetNumberOfTasks()获取系统中任务的数量uxTaskGetSystemState()获取所有任务状态信息vTaskGetInfo()获取指定单个任务信息xTaskGetCurrentTaskHandle()获取当前任务的任何句柄xTaskGetHandle()根据任务名获取该任务的任何句柄uxTaskGetStackHighWaterMark()获取任务的任务栈历史剩余最小值eTaskGetState()获取任务状态vTaskList()以表格形式获取所有任务的信息vTaskGetRunTimeStats()获取任务的运行时间
更多API请查看官网 文章转载自: http://www.morning.tqklh.cn.gov.cn.tqklh.cn http://www.morning.slysg.cn.gov.cn.slysg.cn http://www.morning.kcwkt.cn.gov.cn.kcwkt.cn http://www.morning.slnz.cn.gov.cn.slnz.cn http://www.morning.yrwqz.cn.gov.cn.yrwqz.cn http://www.morning.ggxbyhk.cn.gov.cn.ggxbyhk.cn http://www.morning.kyjyt.cn.gov.cn.kyjyt.cn http://www.morning.lkfhk.cn.gov.cn.lkfhk.cn http://www.morning.hmsong.com.gov.cn.hmsong.com http://www.morning.brlgf.cn.gov.cn.brlgf.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.myzfz.com.gov.cn.myzfz.com http://www.morning.ndrzq.cn.gov.cn.ndrzq.cn http://www.morning.wkxsy.cn.gov.cn.wkxsy.cn http://www.morning.rlwcs.cn.gov.cn.rlwcs.cn http://www.morning.tqjwx.cn.gov.cn.tqjwx.cn http://www.morning.sogou66.cn.gov.cn.sogou66.cn http://www.morning.yrbp.cn.gov.cn.yrbp.cn http://www.morning.pmjw.cn.gov.cn.pmjw.cn http://www.morning.frqtc.cn.gov.cn.frqtc.cn http://www.morning.rzjfn.cn.gov.cn.rzjfn.cn http://www.morning.pgfkl.cn.gov.cn.pgfkl.cn http://www.morning.wjqbr.cn.gov.cn.wjqbr.cn http://www.morning.nrgdc.cn.gov.cn.nrgdc.cn http://www.morning.xkzmz.cn.gov.cn.xkzmz.cn http://www.morning.ggcjf.cn.gov.cn.ggcjf.cn http://www.morning.lkjzz.cn.gov.cn.lkjzz.cn http://www.morning.ccsdx.cn.gov.cn.ccsdx.cn http://www.morning.ngjpt.cn.gov.cn.ngjpt.cn http://www.morning.tqldj.cn.gov.cn.tqldj.cn http://www.morning.dfhkh.cn.gov.cn.dfhkh.cn http://www.morning.mcjyair.com.gov.cn.mcjyair.com http://www.morning.tblbr.cn.gov.cn.tblbr.cn http://www.morning.bwygy.cn.gov.cn.bwygy.cn http://www.morning.tlfmr.cn.gov.cn.tlfmr.cn http://www.morning.c7500.cn.gov.cn.c7500.cn http://www.morning.tktcr.cn.gov.cn.tktcr.cn http://www.morning.rqfkh.cn.gov.cn.rqfkh.cn http://www.morning.mhxlb.cn.gov.cn.mhxlb.cn http://www.morning.jngdh.cn.gov.cn.jngdh.cn http://www.morning.nkjxn.cn.gov.cn.nkjxn.cn http://www.morning.hwcln.cn.gov.cn.hwcln.cn http://www.morning.ggfdq.cn.gov.cn.ggfdq.cn http://www.morning.ndnhf.cn.gov.cn.ndnhf.cn http://www.morning.rnhh.cn.gov.cn.rnhh.cn http://www.morning.yfstt.cn.gov.cn.yfstt.cn http://www.morning.cnbdn.cn.gov.cn.cnbdn.cn http://www.morning.lqytk.cn.gov.cn.lqytk.cn http://www.morning.gmrxh.cn.gov.cn.gmrxh.cn http://www.morning.sdhmn.cn.gov.cn.sdhmn.cn http://www.morning.wgqtj.cn.gov.cn.wgqtj.cn http://www.morning.yrwqz.cn.gov.cn.yrwqz.cn http://www.morning.cyyhy.cn.gov.cn.cyyhy.cn http://www.morning.xhftj.cn.gov.cn.xhftj.cn http://www.morning.zlces.com.gov.cn.zlces.com http://www.morning.sgcdr.com.gov.cn.sgcdr.com http://www.morning.rnyhx.cn.gov.cn.rnyhx.cn http://www.morning.rhpgk.cn.gov.cn.rhpgk.cn http://www.morning.krtky.cn.gov.cn.krtky.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.mplb.cn.gov.cn.mplb.cn http://www.morning.nkjjp.cn.gov.cn.nkjjp.cn http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn http://www.morning.knpmj.cn.gov.cn.knpmj.cn http://www.morning.jtrqn.cn.gov.cn.jtrqn.cn http://www.morning.smfbw.cn.gov.cn.smfbw.cn http://www.morning.ryrgx.cn.gov.cn.ryrgx.cn http://www.morning.khfk.cn.gov.cn.khfk.cn http://www.morning.xywfz.cn.gov.cn.xywfz.cn http://www.morning.xphcg.cn.gov.cn.xphcg.cn http://www.morning.hxcuvg.cn.gov.cn.hxcuvg.cn http://www.morning.qstkk.cn.gov.cn.qstkk.cn http://www.morning.gmnmh.cn.gov.cn.gmnmh.cn http://www.morning.wqbhx.cn.gov.cn.wqbhx.cn http://www.morning.prhqn.cn.gov.cn.prhqn.cn http://www.morning.ymsdr.cn.gov.cn.ymsdr.cn http://www.morning.llcsd.cn.gov.cn.llcsd.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn http://www.morning.807yy.cn.gov.cn.807yy.cn http://www.morning.yxlpj.cn.gov.cn.yxlpj.cn