||
注:对于例程,我将只翻译 注释和说明性文字。
例程1 示例如何从一个已经打开和配置好的外设读入字节,这个例程对所有数据传输模式都有效。
/* 包含FreeRTOS+IO */ #include "FreeRTOS_IO.h" /* 缓冲大小 */ #define BUFFER_SIZE 200 /* 定义缓冲 */ const int8_t cBuffer[ 200 ] = { 0 }; /* The Peripheral_Descriptor_t type is the FreeRTOS+IO equivalent of a descriptor. 外设描述符 和 FreeRTOS+IO等效的描述符???*/ void vReadExample( Peripheral_Descriptor_t xOpenPort ) { size_t xBytesTransferred; /* 该外设已经打开和配置好,读BUFFER_SIZE字节的内容进入cBuffer,此处不管使用哪种传输模式,语法都是一样的。 */ xBytesTransferred = FreeRTOS_read( xOpenPort, cBuffer, BUFFER_SIZE ); /* xBytesTransferred现在将保持读入一定数目的字节,直到超时*/ } Example 1: Reading bytes from a descriptor that has already been opened and configured. |
Example 2 demonstrates how to write bytes to a peripheral that has already been opened and configured to use the interrupt driven zero copy write transfer mode.
例程2 示例如何为已打开和配置好的外设写入数据,使用的是 interrupt driven zero copy write方式(下一篇我一定要把那篇传输模式啥的先给端了!)
下列注释中,同上的不再赘述
/* */ #include "FreeRTOS_IO.h" /* */ #define BUFFER_SIZE 200 /* */ const int8_t cBuffer[ 200 ] = { 0 }; /* */ void vWriteExample( Peripheral_Descriptor_t xOpenPort ) { size_t xBytesTransferred; BaseType_t xReturn; /* 这个端口被配置为使用zero copy 发送模式,所以写操作锁必须在写之前获得,等待锁最多200ms,等待时这个任务不会消耗任何CPU时间 */ xReturn = FreeRTOS_ioctl( xOpenPort, iocltOBTAIN_WRITE_MUTEX, ( void * ) ( 200 / portTICK_PERIOD_MS ) ); if( xReturn != pdFAIL ) { /* 写操作锁获得了,所以现在可以安全地进行写操作,它将写BUFFER_SIZE 字节到外设里去 */ xBytesTransferred = FreeRTOS_write( xOpenPort, cBuffer, BUFFER_SIZE ); /*实际上,外设传输是通过中断进行的,使用zero copy的传输方式的情形,xBytesTransferred将为0, 如果transfer不能开始,或者等于BUFFER_SIZE,要注意的是,这个中断仍然会在传输数据,尽管当时 该函数已经返回,所以实际的数据传输将在锁重新可获得时才完成 */ } } Example 2: Writing bytes to a descriptor that has already been opened and configured to use the zero copy write transfer mode. |
例程3 战士如何打开和配置一个描述符,一开始,一个I2C口是打开的,然后,假设打开是成功,这个通信口配置成 zero copy 写传输模式 和 环形读缓冲模式,读超时和写超时都设置成200ms
/* */ #include "FreeRTOS_IO.h" Peripheral_Descriptor_t xOpenAndConfigureI2CPort( void ) { /* */ Peripheral_Descriptor_t xI2CPort; /* 打开I2C0口,存储它的返回值作为这个端口的描述符,这个外设实际上能不能成功打开,则看实际板子上是否支持。 第二个参数现在用不着,则可以设置成任何东西。尽管,为了将来可能的需求,推荐设置成NULL,作为默认,这个口 将以 polling模式打开*/ xI2CPort = FreeRTOS_open( "/I2C0/", NULL ); /* FreeRTOS_open()返回NULL当操作失败,检查返回值是不是非NULL */ configASSERT( xI2CPort ); /* 把端口配置成zero copy发送模式,第三个参数暂时不需要用*/ FreeRTOS_ioctl( xI2CPort, iocltUSE_ZERO_COPY_TX, NULL ); /*同样的,把接收设置成环形缓冲,第三个参数用上了,它是设置缓冲长度*/ FreeRTOS_ioctl( xI2CPort, iocltUSE_CIRCULAR_BUFFER_RX, ( void * ) 100 ); /* 设置读超时200s,这是FreeRTOS_read()调用会等待所要读回数目的数据的等待时间,当这个端口被配置成使用中断时, 这个任务将会使读阻塞在当前进程中,所以并不会占用CPU时间,而使用中断的zero copy写方式不需要设置超时时间*/ FreeRTOS_ioctl( xI2CPort, iocltSET_RX_TIMEOUT, ( void * ) ( 200 / portTICK_PERIOD_MS ) ); /* I2C频率设置400K */ FreeRTOS_ioctl( xI2CPort, iocltSET_SPEED, ( void * ) 400000 ); /* 设I2C从机地址50 */ FreeRTOS_ioctl( xI2CPort, iocltSET_I2C_SLAVE_ADDRESS, ( void * ) 50 ); /* 返回一个打开的i2c端口的描述符,以后便可以用FreeRTOS_read() 和 FreeRTOS_write()调用了 */ return xI2CPort; } Example 3: Opening and configuring a descriptor |