数据方向
中断驱动的循环缓冲区传输模式可与 FreeRTOS_read() 同时使用。
说明
ioconfigUSE_CIRCULAR_BUFFER_RX 须
在
FreeRTOSIOConfig.h 中设置为 1 才能
使用循环缓冲区传输模式。 此外,还须
其必须被明确启用于 相同配置文件中使用的
显式启用。
选择循环缓冲区传输模式时,FreeRTOS_read() 不会
直接从外设读取字节,
而是从 FreeRTOS-Plus-IO 中断服务程序在接收数据时填充的循环缓冲区读取字节。
中断服务程序和 FreeRTOS 循环缓冲区
由 FreeRTOS-Plus-IO 代码提供,无需由
应用程序编写者提供。
中断驱动的循环缓冲区传输模式
|
优点
|
缺点
|
-
简单的使用模型
-
可自动将调用任务设为
阻塞
状态,以等待读取或写入操作
完成(在无法立即完成的情况下)。 这
确保了调用 FreeRTOS_read() 的任务
仅在循环缓冲区中有字节时
占用 CPU 时间。
-
可以设置读取超时值,以
确保 FreeRTOS_READ() 调用不会无限期阻塞。
-
使用简单的 RAM 缓冲区,从而
产生了一种中等效率的接收方法,
尽管需要在缓冲区来回复制。
-
由外设接收的字节会自动
缓冲而不会丢失,即使 FreeRTOS_read() 操作在
接收到字节时
未执行。
|
-
FreeRTOS-Plus-IO 驱动程序需要为循环缓冲区提供 RAM
。 缓冲区长度
由用于选择传输模式 的 FreeRTOS_ioctl() 调用
的第三个参数配置。
|
在对 FreeRTOS_ioctl() 的调用中使用 ioctlUSE_CIRCULAR_BUFFER_RX 请求代码,
以将外设配置为
使用中断驱动的循环缓冲区传输模式进行读取。
请注意,此请求代码将导致外设
中断被启用,且外围设备的中断优先级被设置为
可能的最低值。 可以使用 ioctlSET_INTERRUPT_PRIORITY 请求代码
在必要时提高外围设备的优先级。
示例用法
#include "FreeRTOS_IO.h"
void vAFunction( void )
{
Peripheral_Descriptor_t xOpenedPort;
BaseType_t xReturned;
const uint32_t ulMaxBlock100ms = ( 100UL / portTICK_PERIOD_MS );
xOpenedPort = FreeRTOS_open( "/SPI2/", NULL );
if( xOpenedPort != NULL )
{
FreeRTOS_ioctl( xOpenedPort, ioctlUSE_CIRCULAR_BUFFER_RX, ( void * ) 20 );
FreeRTOS_ioctl( xOpenedPort, ioctlSET_RX_TIMEOUT, ( void * ) ulMaxBlock100ms );
for( ;; )
{
xBytesTransferred = FreeRTOS_read( xOpenedPort, ucBuffer, 10 );
if( xBytesTransferred == 10 )
{
}
else
{
}
}
}
else
{
}
}
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.