网站建设 的销售图片,如何推广英文网站,常州比较有名的设计公司,深圳夫博网站建设有限公司前言#xff1a;本文参考#xff0c;韦东山老师开发文档#xff0c;连接放在最后。
为什么需要中断管理函数#xff1f; 在FreeRtos操作系统中#xff0c;需要实时响应性#xff0c;也就是随时随地必须保证正常多任务的运行#xff0c;如果有中断发生#xff0c;因为中… 前言本文参考韦东山老师开发文档连接放在最后。
为什么需要中断管理函数 在FreeRtos操作系统中需要实时响应性也就是随时随地必须保证正常多任务的运行如果有中断发生因为中断的优先级是最高的这就导致了中断中不能有大量执行的任务函数或者在中断中不能有大量的任务进行切换调用保证中断的执行是一瞬间保证RTOS的实时响应性。否则多任务就不能并发运行。 这就导致了在中断里面调用函数是不能有延迟等待的和不能有更高优先级的任务进行切换的如果有切换因为中断函数的优先级始终是最高的被切换的普通函数始终是执行不了的。 同时因为中断内不能有延时函数所以就常用函数都有中断版本专门用在中断函数内执行的函数这些函数没有阻塞延时时间有参数会记录是否有更高优先级的任务发生如果有在中断结束后进行任务切换执行实际执行是在中断结束之后由任务调度器完成。 到这里我们知道了函数有中断版本是为了保证中断中没有延时同时在函数内没有函数调用以及中断版本多出来的参数就是为了记录是否有更高优先级的任务被调用如果有在中断执行结束后由任务调度器调用任务。 函数比较 FreeRtos操作系统的 队列 信号量 事件组 软件定时器 任务通知 都有两套版本的函数一套用来调用在普通任务上下文一套被用在中断任务上下文具体表格如下。
类型普通任务上下文中断任务上下文队列(queue)xQueueSendToBackxQueueSendToBackFromISR队列(queue)xQueueSendToFrontxQueueSendToFrontFromISR队列(queue)xQueueReceivexQueueReceiveFromISR队列(queue)xQueueOverwritexQueueOverwriteFromISR队列(queue)xQueuePeekxQueuePeekFromISR信号量(semaphore)xSemaphoreGivexSemaphoreGiveFromISR信号量(semaphore)xSemaphoreTakexSemaphoreTakeFromISR事件组(event group)xEventGroupSetBitsxEventGroupSetBitsFromISR事件组(event group)xEventGroupGetBitsxEventGroupGetBitsFromISR任务通知(task notificationxTaskNotifyGivevTaskNotifyGiveFromISR任务通知(task notificationxTaskNotifyxTaskNotifyFromISR软件定时器(software timer)xTimerStartxTimerStartFromISR软件定时器(software timer)xTimerStopxTimerStopFromISR软件定时器(software timer)xTimerResetxTimerResetFromISR软件定时器(software timer)xTimerChangePeriodxTimerChangePeriodFromISR 这两套函数参数区别只有最后以为在普通任务版本中的最后一位参数是如有阻塞愿意等待的时间中断版本参数是是否记录有更高优先级的任务发生并在中断函数结束后是否调用。
BaseType_t xQueueOverwrite(QueueHandle_t xQueue,const void * pvItemToQueue);
BaseType_t xQueueOverwriteFromISR(QueueHandle_t xQueue,const void * pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);xHigherPriorityTaskWoken参数 中断函数里面这个是最后的参数作用是记录是否在中断的过程中是否有更高优先级的任务被唤醒了 这里需要弄清楚的一点是在中断函数执行过程中被唤醒的函数的比较对象不是中断函数而是在中断函数之前被中断函数打断执行的普通任务函数这两个任务相互比较优先级的大小。 xHigherPriorityTaskWoken这个参数最重要的是这个参数首先有用户调用时传递给程序但是它的具体值(pdTRUE或pdFALSE)在函数运行过程中可以由程序去修改。
BaseType_t xHigherPriorityTaskWoken pdFALSE;
xQueueSendFromISR(myQueue, data, xHigherPriorityTaskWoken); 在上面事例程序里面FreeRtos会检查在中断运行的过程中是否有比中断发生前执行函数的优先级更高优先级的任务被唤醒如有 xHigherPriorityTaskWoken 这个参数将被程序设置改变pdTRUE。 所以当我们在ISR里面调用这些中断函数的时候只需要将 xHigherPriorityTaskWoken 这个参数设置为 pdFALSE剩下的FreeRtos在运行的时候会自己设置如果最后为pdTRUE就代表在中断结束后需要切换任务运行如有依然是pdFALSE就继续执行被中断打断的任务。 到这里我们知道了 xHigherPriorityTaskWoken的值虽然是通过参数手动传递的但是在FreeRtos运行的过程中会根据任务唤醒情况去设置 xHigherPriorityTaskWoken的值。当值被设定之后通过调用 portYIELD_FROM_ISR() 在中断响应函数最后来完成任务的切换。
中断的延迟处理定义 如果在ISR中中断函数的响应本身就是耗时的可以使用 中断的延时处理(Deferring interrupt processing)
·ISR 中清除中断标志位清理记录工作。
·任务将更加复杂的事情放在任务重处理。 欢迎指正希望对你有所帮助
[10-1]_事件组的本质_哔哩哔哩_bilibili