注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
辛昕.九门.上 https://home.eeworld.com.cn/space-uid-115166.html [收藏] [复制] [分享] [RSS]
日志

FreeRTOS中文尝试 FreeRTOS+IO 例程

已有 6780 次阅读2015-7-11 23:21 |个人分类:FreeRTOS中文| detailed, examples, provided, source, 中文

原文网址:

http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_IO/Quick_FreeRTOS_Plus_IO_Example.shtml

快速FreeRTOS+IO例程

这页面(这篇文章)包含了很简单的例程去表现FreeRTOS+IO的概念。更多的细节的例子将在 
更深入的应用实例将与BSP一并提供,和其他值得关注的项目一起放在Featured Demos页面。

注:对于例程,我将只翻译 注释和说明性文字。

例程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
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章