FreeRTOS 基础系列文章
基本对象
FreeRTOS——任务
FreeRTOS——队列
FreeRTOS——信号量
FreeRTOS——互斥量
FreeRTOS——任务通知
FreeRTOS——流和消息缓冲区
FreeRTOS——软件定时器
FreeRTOS——事件组
内存管理
FreeRTOS——静态与动态内存分配
FreeRTOS——堆内存管理
FreeRTOS——栈溢出保护
代码组织
FreeRTOS——源代码组织
FreeRTOS——创建新的项目
FreeRTOS——配置文件
队列
队列是任务间通信的主要形式。它们可用于在任务之间、中断和任务之间发送消息。在大多数情况下,它们被用作线程安全的FIFO(先入先出)缓冲区,新数据被发送到队列的后部,尽管数据也可以发送到前端。
用户模型
用户模型:最大的简单性,最大的灵活性。。。
FreeRTOS队列使用模型设法将简单性与灵活性结合起来——这些属性通常是互斥的。消息发送是通过复制队列来实现的,这意味着数据(可以是指向大缓冲区的指针)本身被复制到队列中,而不是队列总是存储对数据的引用。这是最好的方法,因为:
-
已经包含在C变量(整数、小型结构等)中的小消息可以直接发送到队列中。不需要为消息分配缓冲区,然后将变量复制到已分配的缓冲区中。同样,消息可以直接从队列读取到C变量中。
此外,以这种方式发送到队列允许发送任务立即覆盖发送到队列的变量或缓冲区,即使已发送的消息仍在队列中。因为变量中包含的数据被复制到队列中,所以变量本身可以重用。发送消息的任务和接收消息的任务不需要就哪个任务拥有消息以及哪个任务负责在不再需要消息时释放消息达成一致。
-
使用按复制传递数据的队列并不会妨碍使用队列来按引用传递数据。当消息的大小达到一定程度,不能将整个消息以字节为单位复制到队列中时,可以定义队列来保存指针,并将指向该消息的指针复制到队列中。
-
内核完全负责分配用作队列存储区域的内存。
-
可变大小的消息可以通过定义队列来保存结构,该结构包含一个指向队列消息的成员,以及另一个保存队列消息大小的成员。
-
单个队列可以用来接收不同的消息类型和来自多个位置的消息,方法是将队列定义为持有结构,该结构拥有一个持有消息类型的成员,以及另一个持有消息数据(或指向消息数据的指针)的成员。如何解释数据取决于消息类型。
-
该实现自然地适合于在内存保护环境中使用。一个被限制在受保护内存区域的任务可以将数据传递给一个被限制在不同受保护内存区域的任务,因为通过调用队列发送函数来调用RTOS将提高微控制器的特权级别。队列存储区域只被RTOS(具有完全权限)访问。
-
提供了一个单独的API供中断内部使用。将RTOS任务使用的API与中断服务例程使用的API分离意味着RTOS API函数的实现不需要在每次执行时检查它们的调用上下文。使用单独的中断API也意味着,在大多数情况下,创建RTOS感知的中断服务例程对终端用户来说比其他RTOS产品更简单。
-
无论如何,API都更简单。
队列阻塞
队列API函数允许指定阻塞时间。
当一个任务尝试从一个空队列中读取时,该任务将被放置到阻塞状态(因此它不消耗任何CPU时间,其他任务可以运行),直到队列上的数据可用,或者阻塞时间过期。
当一个任务尝试写满一个队列时,该任务将被置于阻塞状态(因此它不消耗任何CPU时间,其他任务可以运行),直到队列中有可用空间或阻塞时间到期。
如果同一个队列上有多个任务阻塞,那么优先级最高的任务将首先被解除阻塞。
注意,中断不能使用不以“FromISR
”结尾的API函数。