二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断 同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR) 中只是快速处理少部份工作。如此,中断处理可以说是被”推迟(deferred)”到一个”处理 (handler)”任务。 如果某个中断处理要求特别紧急,其延迟处理任务的优...
应用程序可以包含多个任务。如果运行应用程序的微控制器只有一个核(core),那 么在任意给定时间,实际上只会有一个任务被执行。这就意味着一个任务可以有一个或 两个状态,即运行状态和非运行状态。我们先考虑这种 简单的模型——但请牢记这其 实是过于简单,我们稍后将会看到非运行状态实际上又可划分为若干个子状态...
configKERNEL_INTERRUPT_PRIORITY 设置系统心跳时钟的中断优先级。 如果在移植中没有使用常量 configMAX_SYSCALL_INTERRUPT_PRIORITY,那 么需要调用中断安全版本 FreeRTOS API 的中断都必须运行在此优先级上。 configMAX_SYSCALL_INTERRUPT_PRIORITY 设置中断安全版本 FreeRTOS API 可以运 行的 高中断优先级。 建立一个...
守护任务提供了一种干净利落的方法来实现互斥功能,而不用担心会发生优先级反 转和死锁。 守护任务是对某个资源具有唯一所有权的任务。只有守护任务才可以直接访问其守 护的资源——其它任务要访问该资源只能间接地通过守护任务提供的服务。 例16. 采用守护任务重写 vPrintString() 例16 提供了 vPrintString()...
xTaskCreate() API 函数的参数 uxPriority 为创建的任务赋予了一个初始优先级。这 个侁先级可以在调度器启动后调用 vTaskPrioritySet() API 函数进行修改。 应用程序在文件 FreeRTOSConfig.h 中设定的编译时配置常量 configMAX_PRIORITIES 的值,即是 多可具有的优先级数目。FreeRTOS 本身并没 有限定这个常量的 大...
队列在使用前必须先被创建。 队列由声明为 xQueueHandle 的变量进行引用。xQueueCreate()用于创建一个队 列,并返回一个 xQueueHandle 句柄以便于对其创建的队列进行引用。 当创建队列时,FreeRTOS 从堆空间中分配内存空间。分配的空间用于存储队列数 据结构本身以及队列中包含的数据单元。如果内存堆中没有足够的空...
后加上一条空循环[for(;;)]可以使这种错误更加容易调试。 如果要添加更多的任务,可以增加内存堆空间大小,或是删掉一些已存在的 Demo 任务。 问题现象:在中断中调用一个 API 函数,导致应用程序崩溃 除了具有后缀为”FromISR”函数名的 API 函数,千万不要在中断服务例程中调用其 它API 函数。 问题现象:有...
通常情况下,队列被作为 FIFO(先进先出)使用,即数据由队列尾写入,从队列首读 出。当然,由队列首写入也是可能的。 往队列写入数据是通过字节拷贝把数据复制存储到队列中;从队列读出数据使得把 队列中的数据拷贝删除。图 19 展现了队列的写入与读出过程,以及读写操作对队列中 数据的影响。 可被多任务存取 队列...
1.8 改变任务优先级 vTaskPrioritySet() API 函数 API 函数 vTaskPriofitySet()可以用于在调度器启动后改变任何任务的优先级。 void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ); 程序清单 20 vTaskPrioritySet() API 函数原型 表
2. 中断服务例程启动,给出信号量以使延迟处理任务解除阻塞。 3. 当中断服务例程退出时,延迟处理任务得到执行。延迟处理任务做的第一件事便是 获取信号量。 4. 延迟处理任务完成中断事件处理后,试图再次获取信号量——如果此时信号量无效, 任务将切入阻塞待等待事件发生。 在中断以相对较慢的频率发生的情况下...