3.1 队列集创建函数 xQueueCreateSet() 3.2 队列集添加函数 xQueueAddToSet() 3.3 队列集删除函数 xQueueRemoveFromSet() 3.4 从队列集获取消息函数 xQueueSelectFromSet() 04 队列集使用实验 05 小结 01 前言 大家好,我是旭辉君,一个智能硬件领域深度探索的技术博主。 在上两篇文章中,我们探讨了信号量的使用...
IT_Timer.c /*用于统计CPU运行时间*/volatileuint32_t ulHighFrequencyTimerCounts =0ul;/*高精度定时器中断服务函数(定时周期50us)*/voidTIM_IRQ_Handler(void) {//判断中断标志位ulHighFrequencyTimerCounts++;//清除中断标志} 用户使用方法 用户可以通过调用 vTaskList() 和 vTaskGetRunTimeStats() 函数获取...
taskRESET_READY_PRIORITY()用于根据传进来的形参(通常形参就是任务的优先级)将变量 uxTopReadyPriority 的某个位清零。taskSELECT_HIGHEST_PRIORITY_TASK()用于寻找优先级最高的就绪任务,实质就是更新 uxTopReadyPriority 和 pxCurrentTCB 的值。调用:任务切换函数vTaskSwitchContext()直接调用函数taskSELECT_HIGHEST...
voidvTaskSwitchContext(void){//如果调度器挂起那就不能进行任务切换if(uxSchedulerSuspended!=(UBaseType_t)pdFALSE){xYieldPending=pdTRUE;}else{xYieldPending=pdFALSE;traceTASK_SWITCHED_OUT();taskCHECK_FOR_STACK_OVERFLOW();//调用函数 taskSELECT_HIGHEST_PRIORITY_TASK()获取下一个要运行的任务taskSELECT...
此函数的重点在于调用了函数 taskSELETE_HIGHEST_PRIORITY_TASK() 更新pxCurrentTCB 指向优先级最高的就绪态任务,函数 taskSELETE_HIGHEST_PRIORITY_TASK()实际上是一个宏定义,task.c 文件中有定义。 #definetaskSELECT_HIGHEST_PRIORITY_TASK() \ { \
可以看出来实现步骤非常简单,而且下面的任务函数也非常简单;但是在实际使用时,一旦所有任务经vTaskDelay函数进入阻塞状态,这些任务将无法恢复,整个系统就会处于空闲状态(也就是没有任何正在执行的任务)。🤔🤔🤔 这个问题小编暂时还未解决方法,如有必要,后续会出一篇文件讲解这个问题。
FreeRTOS中的select机制是一种多路复用的机制,可以让程序同时监听多个输入源,当某个输入源就绪时,程序可以进行相应的处理。在FreeRTOS中,select机制可以用于监听多个任务或事件,以便及时响应。 FreeRTOS总共有三种调度算法可供选择。分别是: 1. 具有时间片的优先级抢先调度(Prioritized Pre-emptive Scheduling with Time...
被创建的管道是一个通常命名(named)的I/O设备,任务能用标准的I/O函数打开,读,写管道,并能调用ioctl例程。当任务试图从一个空的管道中读取数据,或向一个满的管道中写入数据时,任务被阻塞。和消息队列一样,ISR可以向管道写入,但不能从管道读取。 做为I/O设备,管道提供了消息队列所没有的重要特性,调用select(...
在port.c 文件中找到 vPortEnterCritical() 和 vPortExitCritical() 函数的实现: void vPortEnterCritical( void ) { portDISABLE_INTERRUPTS(); uxCriticalNesting++; if( uxCriticalNesting == 1 ) { configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); ...