FreeRTOS_IO.h
size_t FreeRTOS_write( Peripheral_Descriptor_t const pxPeripheral,
const void *pvBuffer,
const size_t xBytes );
将一个或多个字节写入打开的外围设备。
板级支持包
明确规定了可以打开的外围设备。 FreeRTOS_ioctl()
用于在中断驱动模式和轮询写入模式之间进行选择。
参数:
pxPeripheral
|
与正在写入字节的
外围设备相关联的描述符。 描述符将
从用于开启外围设备的
FreeRTOS_open()
调用中返回。
|
pvBuffer
|
指向待写入数据的第一个字节的指针。
|
xBytes
|
待写入的字节总数。
当使用中断驱动传输模式时,
如果并非所有字节都能在外围设备的写入超时到期前写入,
则写入外围设备的实际字节数
可能小于请求的
字节数。 FreeRTOS_ioctl() 用于
设置写入超时值。
|
返回:
使用轮询传输模式时,
返回值为
实际写入外围设备的总字节数。 假定未发生错误,
这就是所请求的总字节数。
使用中断驱动字符队列传输模式
时,
返回值为实际写入写队列的
总字节数。 如果队列中
没有足够空间用于立即写入所有待写字节,
并且外围设备的写入超时
在获取到足够空间之前已过期,则这将小于请求的字节数。 实际数据传输
由
FreeRTOS-Plus-IO 中断服务程序控制,
返回对 FreeRTOS_write() 的调用后即可完成。
使用中断驱动时零拷贝传输模式时,
则:
-
如果调用 FreeRTOS_write() 的任务保存了写互斥锁
则返回值为待传输的总字节数,
此时假定未发生错误。 实际数据传输
由FreeRTOS-Plus-IO 中断服务程序控制,
返回对 FreeRTOS_write() 的调用后即可完成。
-
如果调用 FreeRTOS_write() 的任务未保存写
互斥锁,或者如果 FreeRTOSIO Config.h 未配置为包括
外围设备的零拷贝写入传输模式,
则返回零。
FreeRTOS_ioctl() 用于设置
写入超时值。
用法示例:
示例 1 的代码片段展示了当外围设备
被配置为使用轮询传输模式时,应如何进行读取操作。 打开外围设备时
默认采用轮询模式。
xBytesWritten = FreeRTOS_write( xPort, ucBuffer, sizeof( ucBuffer ) );
configASSERT( xBytes == sizeof( ucBuffer ) );
Example 1: Writing bytes to a peripheral that is configured to use the polled transfer mode.
示例 2 的代码片段展示了当外围设备
被配置为使用中断驱动的字符队列传输模式时如何执行写入。
在此模式下,执行 FreeRTOS_write() 调用的任务会保持在
已阻塞状态(不占用任何 CPU 时间) ,直到请求的所有字节数
均已发送到队列,或者写入超时到期。 FreeRTOS_ioctl()
与 ioctlSET_TX_TIMEOUT 请求代码一起用于配置写入超时,
ioctlWAIT_PREVIOUS_WRITE_COMPLETE 请求代码
等待写队列为空。
xBytesWritten = FreeRTOS_write( xPort, ucBuffer, sizeof( ucBuffer ) );
if( xBytesWritten < sizeof( ucBuffer ) )
{
}
else
{
}
Example 2: Writing bytes to a peripheral that is configured to use the interrupt
driven character queue transfer mode.
示例 3 的代码片段展示了当外围设备
被配置为使用中断驱动的零拷贝传输模式时如何执行写入。
在此模式下,执行 FreeRTOS_write() 调用的任务始终会
立即返回。 如果返回值等于待写入字节数,
则 FreeRTOS_write() 调用成功启动了
中断驱动的传输。 如果返回值为零,则
FreeRTOS_write() 调用无法启动传输,
因为它没有保存写互斥锁,或者 FreeRTOSIO Config.h 的配置不支持。
xMutexObtained = FreeRTOS_ioctl( xPort,
ioctlOBTAIN_WRITE_MUTEX,
( void * ) ( 50 / portTICK_PERIOD_MS ) );
if( xMutexObtained != pdFAIL )
{
xBytesWritten = FreeRTOS_write( xPort, ucBuffer, sizeof( ucBuffer ) );
configASSERT( xBytesWritten == sizeof( ucBuffer ) );
xMutexObtained = FreeRTOS_ioctl( xPort,
ioctlOBTAIN_WRITE_MUTEX,
( void * ) ( 50 / portTICK_PERIOD_MS ) );
if( xMutexObtained != pdFAIL )
{
FreeRTOS_ioctl( xPort, ioctlRELEASE_WRITE_MUTEX, NULL );
}
}
Example 3: Writing bytes to a peripheral that is configured to use the interrupt
driven zero copy transfer mode.
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.