• FreeRTOS——队列管理


    1. 队列主要用于任务与任务、中断与任务之间的消息传递。

    2. 创建队列时,请注意队列中数据单元的长度。

    3. 通常情况,队列被作为FIFO(先进先出)使用,即数据从队列尾写入,从队列首读。当然,数据也可由队列首写入。

    4. 向队列中写入数据是通过字节拷贝,将数据拷贝到队列中;从队列中读取数据也是通过字节拷贝,将数据从队列中拷贝出来。

    说明:读数据分为两种情况:① 读取后,删除队列中的数据;② 读数据后,不删除队列中的数据。

    5. 队列不属于任何任务。所有的任务或中断函数都可以向同一队列写入或读出。一般情况,一个队列可由多方写入,一方读出。

    6. 多个任务因等待同一队列而阻塞,当队列有效时,只能有一个任务会被解除阻塞,这个任务就是所有等待任务中,优先级最高的任务。若优先级最高的任务有多个,那么解除阻塞的态的任务是对待时间最长的任务。

    7. 写队列阻塞同读队列阻塞一样。

    8. 队列传递结构体,实现混合型数据的传递。

    9. 如果队列存储的数据单元较大,最好用队列传递数据的指针,而不是单字节的拷贝,但需要注意以下几点:

    1)指针指向内存空间的所有权必须明确;

    当任务间通过指针共享内存时,必须保证不会有任意两个任务同时修改内存中的数据,或其他行为使得数据无效或产生不一致的现象。

    原则上,共享内存在其指针发送到队列前,其内容只允许被发送的任务间访问,共享内存指针从队列中被读出后,其内容也只允许被接收任务访问。

    2)指针指向的内存空间必须有效。

    如果内存是动态分配的,只应该有一个任务负责对其进行内存释放。当这段内存空间被释放后就不能以任何方式(任何任务),对这段内存进行访问。

    3)不要使用指针访问任务栈上分配的空间。

    因为栈帧发生改变时,栈上的数据将不再有效。

    10. 在中断服务函数中使用队列相关函数,请使用中断安全版本,只有以”FromISR”或”FROM_ISR”结束的API 函数或宏才可以在中断服务例程中,详见参考手册。http://i.cnblogs.com/Files.aspx

  • 相关阅读:
    hive的常用操作
    更改Oracle字符集避免乱码
    SQLLDR导入乱码问题的解决
    linux环境下安装oracle步骤和自启动oracle
    解决Sql Server 日志满了,设置收缩
    解决sql server死锁
    boolean b=true?false:true==true?false:true;
    "无法删除数据库,因为该数据库当前正在使用"问题解决
    C#使用wkhtmltopdf,把HTML生成PDF(包含分页)
    小技巧:方便开机打开多个程序
  • 原文地址:https://www.cnblogs.com/risunlee/p/5300937.html
Copyright © 2020-2023  润新知