XQueueReceiveFromISR-FreeRTOS API
从队列接收一个项目。在中断程序中使用此函数是安全的。
参数:
| pxQueue | 发送项目的队列句柄 |
| pvBuffer | 指向缓冲区的指针,将接收的项目被复制进去。 |
| pxTaskWoken | 任务将锁住,等待队列中的可用空间。如果xQueueReceiveFromISR 引起一个任务解锁,*pxTaskWoken 将设置为pdTRUE,否则*pxTaskWoken保留不变 |
返回:
pdTRUE :如果项目成功从队列接收。否则为: pdFALSE
例子:
xQueueHandle xQueue;
// Function to create a queue and post some values.
void vAFunction( void *pvParameters )
{
portCHAR cValueToPost;
const portTickType xBlockTime = ( portTickType )0xff;
// Create a queue capable of containing 10 characters.
xQueue = xQueueCreate( 10, sizeof( portCHAR ) );
if( xQueue == 0 )
{
// Failed to create the queue.
}
// ...
// Post some characters that will be used within an ISR. If the queue
// is full then this task will block for xBlockTime ticks.
cValueToPost = 'a';
xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
cValueToPost = 'b';
xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
// ... keep posting characters ... this task may block when the queue
// becomes full.
cValueToPost = 'c';
xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
}
// ISR that outputs all the characters received on the queue.
void vISR_Routine( void )
{
portBASE_TYPE xTaskWokenByReceive = pdFALSE;
portCHAR cRxedChar;
while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
{
// A character was received. Output the character now.
vOutputCharacter( cRxedChar );
// If removing the character from the queue woke the task that was
// posting onto the queue xTaskWokenByReceive will have been set to
// pdTRUE. No matter how many times this loop iterates only one
// task will be woken.
}
if( xTaskWokenByPost != pdFALSE )
{
// We should switch context so the ISR returns to a different task.
// NOTE: How this is done depends on the port you are using. Check
// the documentation and examples for your port.
taskYIELD ();
}
}
本文介绍FreeRTOS中xQueueReceiveFromISR函数的用法,该函数允许从中断服务程序安全地接收队列项目。文章详细解释了函数参数及返回值,并提供了创建队列、发送字符以及在中断服务程序中接收字符的示例。
1700

被折叠的 条评论
为什么被折叠?



