嵌入式操作系统核原理开发(消息队列)
嵌入式linux操作系统原理与应用

嵌入式Linux操作系统是一种针对嵌入式设备设计和优化的Linux操作系统。
它在嵌入式系统中发挥着关键作用,为嵌入式设备提供了丰富的功能和灵活性。
以下是嵌入式Linux操作系统的原理和应用方面的概述:嵌入式Linux操作系统原理:内核:嵌入式Linux操作系统的核心是Linux内核,它提供了操作系统的基本功能,包括处理器管理、内存管理、设备驱动程序、文件系统和网络协议栈等。
裁剪:为了适应嵌入式设备的资源限制,嵌入式Linux操作系统通常经过裁剪和优化,只选择必要的功能和驱动程序,以减小内存占用和存储空间,并提高性能和响应速度。
交叉编译:由于嵌入式设备通常具有不同的硬件架构和处理器,所以嵌入式Linux操作系统需要通过交叉编译来生成适用于目标设备的可执行文件和库。
设备驱动:嵌入式Linux操作系统需要适配各种硬件设备,因此需要编写和集成相应的设备驱动程序,以使操作系统能够正确地与硬件进行通信和交互。
嵌入式Linux操作系统应用:嵌入式设备:嵌入式Linux操作系统广泛应用于各种嵌入式设备,如智能手机、平板电脑、家用电器、工业控制系统、车载设备等。
物联网(IoT):随着物联网的快速发展,嵌入式Linux操作系统被广泛应用于连接的嵌入式设备,用于数据采集、通信、远程控制和智能化管理。
嵌入式开发板:嵌入式Linux操作系统在开发板上提供了丰富的开发环境和工具链,用于嵌入式软件开发和调试。
自定义嵌入式系统:开发者可以基于嵌入式Linux操作系统构建自定义的嵌入式系统,根据特定需求进行定制和开发,实现各种功能和应用。
嵌入式Linux操作系统的原理和应用非常广泛,它为嵌入式设备提供了灵活性、可定制性和强大的功能支持,使得开发者能够构建高度定制化和功能丰富的嵌入式系统。
嵌入式系统开发

嵌入式系统开发嵌入式系统是指内嵌在其他设备或系统中,实现特定功能的计算机系统。
它通常集成了硬件和软件,通过专门的开发平台进行开发和编程。
嵌入式系统广泛应用于各个领域,如汽车、家电、医疗设备、通信设备等。
本文将围绕嵌入式系统开发展开,介绍嵌入式系统的基本原理、开发流程以及相关技术。
一、嵌入式系统的基本原理嵌入式系统的基本原理是将处理器、存储器、输入输出设备等硬件组件集成在一起,通过操作系统和应用程序实现特定的功能需求。
常见的嵌入式系统采用单片机或微处理器作为核心处理器,具有较小的体积和功耗。
嵌入式系统的设计需要考虑硬件平台的选择、外设的接口设计、系统调度和任务管理等方面。
同时,软件开发也是嵌入式系统的重要组成部分,包括操作系统的移植、设备驱动程序的编写以及应用程序的开发。
二、嵌入式系统开发流程嵌入式系统的开发流程包括需求分析、硬件设计、软件开发、集成测试和发布等环节。
下面将逐一介绍各个环节的内容。
1. 需求分析在嵌入式系统开发之前,需要明确系统的功能需求和性能要求。
通过与用户沟通和需求分析,确定硬件平台、输入输出设备和外部接口等方面的需求。
2. 硬件设计硬件设计是指基于嵌入式系统的功能需求,选择合适的处理器、存储器、外设等硬件组件,并进行相应的电路设计和PCB布局。
硬件设计需要考虑系统的稳定性、扩展性和功耗等因素。
3. 软件开发软件开发是嵌入式系统开发的关键环节。
首先,根据硬件平台的选择,进行操作系统的移植和配置。
然后,编写设备驱动程序,实现对外设的控制和数据交换。
最后,根据系统需求,开发应用程序,实现特定功能。
4. 集成测试集成测试是将硬件和软件进行整合,测试系统的功能和性能是否满足需求。
通过功能测试、性能测试和稳定性测试,发现并修复系统中的缺陷和问题。
5. 发布在集成测试通过后,将嵌入式系统制作成最终产品,进行出厂测试和质量控制。
然后,将产品发布给客户或上线市场。
三、嵌入式系统开发的相关技术嵌入式系统开发涉及到多个技术领域,下面将介绍几个重要的技术。
freertos基础概念

freertos基础概念FreeRTOS(Real-time Operating System)是一款开源的实时操作系统内核,它提供了一系列基础概念和功能,使得嵌入式系统的开发变得更加便捷和可靠。
本文将详细介绍FreeRTOS的基础概念,帮助读者更好地了解和使用这个强大的实时操作系统。
一、任务(Task)任务是FreeRTOS中最基本的执行单元,每个任务都是一个独立的、独立调度的执行流。
任务是由用户定义的函数组成,通过创建任务并指定任务函数,可以将一个普通的函数转化为一个可以被FreeRTOS调度的任务。
任务函数可以包含任意的C语言代码,通过任务切换(Task Switching)机制,FreeRTOS能够在不同的任务间切换执行,实现多任务并发执行。
二、调度器(Scheduler)调度器是FreeRTOS核心的组成部分,它负责管理和调度所有的任务。
调度器按照优先级和时间片(Time Slice)来决定任务的执行顺序,优先级高的任务将被优先调度,时间片机制保证了任务之间的公平执行。
调度器的运行是非抢占式的,即任务只有在主动让出CPU时才会被切换,这保证了任务执行的稳定性和可预测性。
三、信号量(Semaphore)信号量是一种用于任务间同步和互斥的机制。
FreeRTOS提供了两种类型的信号量:二值信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。
二值信号量用于实现互斥锁,用于任务之间的互斥访问共享资源;计数信号量用于实现任务间的同步,用于等待和唤醒任务。
信号量能够有效地避免竞态条件和资源争用,提高系统的并发性和响应能力。
四、消息队列(Message Queue)消息队列是一种用于任务间通信的机制,允许任务通过发送和接收消息来实现信息的传递。
消息队列可以实现任务的异步通信和解耦,用于解决任务之间的数据交换和协作问题。
FreeRTOS提供了灵活且高效的消息队列机制,能够提供稳定和可靠的通信服务。
嵌入式工作原理

嵌入式工作原理
嵌入式系统是一种专门设计用于执行特定任务的计算机系统。
它通常被嵌入到其他设备或系统中,以控制和监测其操作。
嵌入式系统的工作原理主要包括以下几个方面:
1. 硬件设计:嵌入式系统的硬件设计是基于特定需求和功能进行的。
它通常包括中央处理器(CPU)、存储器、输入输出接口、传感器等组件。
硬件设计的目标是满足系统的性能、功耗和成本等要求。
2. 软件开发:嵌入式系统的软件开发包括编写应用程序和驱动程序。
应用程序是实现特定功能的代码,驱动程序用于控制硬件设备和与外部设备的通信。
软件开发的过程中需要考虑系统的实时性、稳定性和资源利用效率。
3. 实时操作系统(RTOS):嵌入式系统通常需要实时响应外
部事件,并及时采取相应的措施。
为了满足这一要求,常使用实时操作系统来管理系统资源和任务调度。
实时操作系统在多任务环境下,通过任务优先级、中断处理和时间片轮转等方式,确保任务能够按时完成。
4. 通信与接口:嵌入式系统通常需要与外部设备或其他系统进行通信。
这可以通过串口、以太网、无线通信等方式实现。
接口的设计需要考虑通信协议、数据传输速率、数据完整性等因素。
5. 电源管理:嵌入式系统通常需要工作在低功耗状态下,以延长电池寿命或降低能耗。
因此,电源管理是嵌入式系统设计中的重要考虑因素。
电源管理技术包括动态电压调整、功耗优化和睡眠模式等方法。
总体而言,嵌入式系统的工作原理是硬件和软件之间密切配合,根据特定需求和功能设计,通过实时操作系统控制和调度任务,与外部设备或系统进行通信,并采用电源管理技术降低能耗。
嵌入式实时操作系统中零拷贝消息队列的设计

!"##$%" &’"’" () *"+( ) ,(-. /0 1234
89:; <=>$?@>, 46A B0>C 56#7+$,7 : D> =??E3@0> F0 = ?0F 0G H10I?JK3 L=E3JM IN FOJ KJLO=>@3K 0G KJ33=CJ PEJEJ @> L0KK0> Q4ARS FO@3 H=HJ1 H1J3J>F3 = 1JT@3JM KJ33=CJ PEJEJ 0G UJ10 ) L0HNV 4OJ MJ3@C> H1@>L@H=? 0G FOJ UJ10 ) L0HN KJ33=CJ PEJEJ @3 MJ3L1@IJM MJ?@IJ1=FJ?NS =>M FOJ L1@F@L=? =1@FOKJF@L @3 =?30 H10T@MJMV <@>=??N FOJ M@GGJ1J>LJ 0G FOJ M@3H=FLO KJ33=CJ F@KJ =>M KJK01N L0>3EKHF@0> IJFWJJ> FOJ -./0123 KJ33=CJ PEJEJ =>M UJ10 ) L0HN KJ33=CJ PEJEJ =1J L0KH=1JM =>M FJ3FJMV 8". 9(+:#; KJ33=CJ PEJEJS UJ10 ) L0HNS T./0123X Q4AR "* 前言
嵌入式实时操作系统以其良好的可靠性和卓越的实 时性被广泛地应用在通信、 军事、 控制等对高精尖技术及 实时性要求极高的领域中。目前常用的嵌入式实时操作 系统包括 -./0123 , HRAR , 嵌 入式 Y@>E., /@>M0W3 Z9 等, 但上述操作系统在消息收发过程中存在多次的消息内存 拷贝, 一方面 大量消耗系统资源, 另一方面通信效率也大 大降低了。为此我们设计了一种没有内存拷贝的消息队 列, 用该消息 队列在任务间进行消息发送和接收, 大大提 高了系统的性能。下面就典型的 商用实时 操作系 统 -.$ /0123 的消息队列实现 机制, 以 及零 拷贝 消息 队列 的原 理作详细地介绍。 图 %* -./0123 消息通信时内存拷贝示意图
freertos中messagequeue 用法

freertos中messagequeue 用法FreeRTOS是一个开源的实时操作系统内核,可以在嵌入式系统中使用。
它提供了多种功能,其中之一是消息队列(Message Queue)。
本文将逐步介绍FreeRTOS的消息队列的使用方法。
一、什么是消息队列消息队列是一种在多任务操作系统中用于线程间通信的机制。
它允许一个任务向另一个任务发送消息,以实现数据传递和同步的目的。
消息队列通常具有先进先出(FIFO)的特性,确保消息以正确的顺序传递。
在FreeRTOS中,消息队列是一种用于在任务之间传递数据的机制。
每个任务都可以读取和写入消息队列,从而实现任务间的数据交换。
二、为什么需要消息队列在多任务操作系统中,各个任务并行执行,因此需要某种方式来实现任务间的协调和通信。
消息队列提供了一种简单而有效的方式,使得任务可以以异步和同步的方式进行数据传递。
使用消息队列可以解决以下几个问题:1. 数据传递:任务可以通过消息队列将数据从一个任务传递到另一个任务,实现数据共享和交换。
2. 同步操作:任务可以通过消息队列实现同步操作,例如等待某个特定消息的到达,然后再执行后续操作。
3. 解耦合:消息队列可以将任务之间的耦合度降低,每个任务只需要关注自己所需的消息,而不需要知道消息的发送方和处理方是哪个任务。
三、创建消息队列在FreeRTOS中创建消息队列非常简单。
首先,需要确定消息队列的大小和每个消息项的大小。
然后,可以使用`xQueueCreate()`函数创建一个消息队列对象。
下面是创建一个消息队列的示例代码:xQueueHandle messageQueue;const uint8_t queueSize = 10;const uint8_t itemSize = sizeof(uint32_t);messageQueue = xQueueCreate(queueSize, itemSize);在这个示例中,我们创建了一个最大容量为10,每个消息项大小为4字节的消息队列。
嵌入式系统开发了解嵌入式系统的设计和开发过程
嵌入式系统开发了解嵌入式系统的设计和开发过程嵌入式系统开发:了解嵌入式系统的设计和开发过程嵌入式系统是指集成在其他设备或系统中的计算机系统,它负责控制、监测或处理特定的任务。
这些系统常见于各种日常用品,包括智能手机、电视机、冰箱、汽车等。
本文将针对嵌入式系统的设计和开发过程进行详细介绍。
一、嵌入式系统的设计过程嵌入式系统的设计过程主要包括需求分析、系统设计、硬件设计、软件设计以及系统集成等阶段。
1. 需求分析在开始设计嵌入式系统之前,必须首先明确系统的需求。
这需要与相关的利益相关者进行沟通,包括产品经理、业务团队和终端用户。
通过深入了解他们的期望和要求,设计团队能够清楚地确定系统需要实现的功能和特性。
2. 系统设计系统设计阶段是将需求转化为具体设计的过程。
设计团队根据需求规格书绘制系统结构图和模块图,并明确定义各个模块之间的关系和功能。
此外,团队还需要选择合适的处理器、传感器、通信接口等硬件组件,并进行系统资源规划和预算。
3. 硬件设计硬件设计是嵌入式系统设计的重要组成部分,主要涉及电路设计、PCB设计以及硬件接口设计等。
设计团队需要根据系统设计阶段的要求,选择合适的元器件和芯片,并绘制各个电路板的原理图。
然后,使用PCB设计软件设计电路板布局,并完成相应的元器件布线。
4. 软件设计嵌入式系统的软件设计是将系统设计转化为可执行代码的过程。
在这个阶段,设计团队会编写嵌入式软件,并进行模块化设计,以实现系统的各个功能。
软件设计需要根据硬件设备和操作系统的特性进行相关的优化和配置。
5. 系统集成在软件和硬件设计完成后,就需要进行系统的集成和测试。
这一阶段包括硬件和软件的调试、系统的验证以及性能测试等。
通过严格的测试流程,设计团队可以确保系统的稳定性和可靠性,以满足客户的需求。
二、嵌入式系统的开发过程嵌入式系统的开发过程通常包括原型开发、系统开发、验证和调试、生产以及迭代更新等阶段。
1. 原型开发嵌入式系统的原型开发是为了验证系统设计的可行性和正确性。
ucosiii操作系统工作原理
ucosiii操作系统工作原理ucosiii是一个实时嵌入式操作系统,它的工作原理是基于任务管理和时间管理。
本文将从任务管理、时间管理等方面详细介绍ucosiii的工作原理。
一、任务管理ucosiii通过任务管理来实现多任务的并行执行。
在ucosiii中,每个任务都是一个独立的执行单元,具有自己的任务控制块(TCB)。
任务控制块中保存了任务的状态、堆栈指针和优先级等信息。
ucosiii通过任务调度器来决定哪个任务获得执行权。
在ucosiii中,任务的优先级决定了任务的执行顺序。
优先级高的任务具有更高的执行优先级,优先级低的任务具有较低的执行优先级。
ucosiii采用优先级抢占式调度算法,当一个优先级更高的任务就绪时,ucosiii会暂停当前任务的执行,切换到优先级更高的任务执行。
二、时间管理ucosiii通过时间管理来实现任务的调度和时间的划分。
在ucosiii 中,时间被划分为时间片和时间延迟。
时间片是指每个任务获得的最大执行时间。
当一个任务的时间片用完后,ucosiii会暂停该任务的执行,切换到下一个任务执行。
时间片的大小可以根据任务的需求和系统性能进行调整。
时间延迟是指任务在执行过程中需要暂停一段时间。
ucosiii提供了延迟函数来实现时间延迟。
任务可以使用延迟函数来暂停自己的执行,等待一段时间后再继续执行。
ucosiii通过定时器来实现延迟函数的功能。
三、任务间通信ucosiii提供了一系列的同步和通信机制来实现任务间的数据传递和协作。
其中最常用的机制是信号量和消息队列。
信号量是一种计数器,用来控制对共享资源的访问。
任务可以使用信号量来同步对共享资源的访问,避免资源竞争和冲突。
消息队列是一种用来存储和传递消息的缓冲区。
任务可以使用消息队列来发送和接收消息,实现任务间的数据传递和通信。
ucosiii还提供了其他的同步和通信机制,如互斥锁、事件标志组和邮箱等,可以根据具体的需求选择合适的机制。
嵌入式实时操作系统FreeRTOS原理 架构与开发
读书笔记
01 思维导图
03 精彩摘录 05 目录分析
目录
02 内容摘要 04 阅读感受 06 作者简介
思维导图
本书关键字分析思维导图
深入
操作系统
操作系统
嵌入
大家
开发
介绍
架构
原理
freertos 系统
任务
实时
架构
包括
原理
提供
实时
管理
内容摘要
内容摘要
阅读感受
《嵌入式实时操作系统FreeRTOS原理、架构与开发》读后感
近日,我阅读了一本名为《嵌入式实时操作系统FreeRTOS原理、架构与开发》 的书籍,深感其内容丰富、深入浅出,为我在嵌入式实时操作系统领域提供了 宝贵的指导。下面,我将从不同的角度分享我的阅读感受。
这本书所使用的FreeRTOS版本为0,对于想要了解这一特定版本的朋友来说, 无疑是一份宝贵的资料。FreeRTOS作为一个轻量级的操作系统,其功能强大 且全面,包括任务管理、时间管理、信号量、消息队列、内存管理以及记录功 能等。这使它能够满足大多数小型系统的需求。而FreeRTOS的实时性,更是 使其在许多需要快速响应的场景中得到了广泛应用。
书中还提到了轮换调度算法。在没有更高优先级任务就绪的情况下,同一优先 级的任务可以共享CPU的使用时间。这一设计使得系统能够更为均衡地处理各 种任务,避免某些任务因等待资源而被长时间挂起。
在开发部分,书中提供了丰富的实例和代码片段,使读者能够更为直观地了解 FreeRTOS的实际应用。这些示例不仅涵盖了FreeRTOS的基本功能,还深入到 了内存管理、任务间通信等高级主题,为读者提供了全面的学习资源。
嵌入式环形队列和消息队列是如何去实现的?
嵌入式环形队列和消息队列是如何去实现的?嵌入式环形队列和消息队列是实现数据缓存和通信的常见数据结构,广泛应用于嵌入式系统中的通信协议和领域。
环形队列是一种先进先出(FIFO)的数据结构,其中数据被存储在一个环形缓冲区中。
它使用两个指针,分别指向队列的头和尾,以便在读写操作时追踪队列的状态。
当队列满时,新数据将覆盖旧数据,以确保队列的长度保持不变。
环形队列在实现嵌入式通信协议时特别有用,例如UART,CAN等。
消息队列是一种多个发送者和接收者之间共享数据的通信机制。
它允许多个任务或线程向队列发送消息,并允许多个任务或线程从队列中接收消息。
每个消息都有一个固定的大小和格式,并可以根据需要进行排队和检索。
在嵌入式系统中,消息队列广泛用于处理异步事件,例如中断处理和任务之间的通信。
主要应用于:1.网络通信协议(例如TCP/IP,UDP等)中的数据缓存和队列管理。
2.嵌入式操作系统(例如FreeRTOS,uC/OS等)中的任务通信和事件处理。
3.汽车电子领域中的CAN和LIN通信协议。
4.工业自动化领域中的Modbus,Profibus等通信协议。
5.无线通信领域中的蓝牙,Zigbee,LoRa等通信协议。
大致应用1.串口通信中,可以使用环形队列来接收和发送数据。
当接收到新的数据时,将其存储到环形队列中,并在需要发送数据时从队列中取出数据发送。
这种方式可以减少中断处理的时间,提高系统的响应速度。
2.多任务系统中,消息队列用于任务之间的通信。
每个任务都可以向消息队列中发送消息,其他任务可以从队列中获取消息并进行相应的处理。
这种方式可以实现任务之间的解耦,提高系统的可扩展性和可维护性。
3.实时控制系统中,环形队列可以用于缓存传感器数据或控制命令。
当传感器或其他设备向系统发送数据时,可以将其存储到环形队列中,然后由控制任务从队列中获取数据并进行相应的处理。
这种方式可以减少系统对硬件的依赖性,提高系统的灵活性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式操作系统内核原理和开发(消息队列)消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。
在嵌入式系统上,这可以说这是用的最多的一种方法。
通过消息队列,无论是发送者,还是接受者都可以循环地处理各种消息。
而我们知道,存储消息最好的方式就是循环队列,如果消息已满,那么发送者可以把自己pend到等待队列上;而如果此时没有消息,那么接受者也可以把自己pend到等待队列上。
当然实现消息队列的方法很多,甚至用户可以自己利用互斥量和信号量来实现,而嵌入式系统常常会默认提供这样的功能函数,我想主要的目的还是为了方便用户,让他们可以更多地从业务的角度来看问题,而不是把重点关注在这些底层的细节上面。
首先,我们还是看看rawos上面关于消息队列的数据结构是怎么定义的,1typedef struct RAW_MSG_Q {23 RAW_VOID **queue_start; /* Pointer to start of queue data*/4 RAW_VOID **queue_end; /* Pointer to end of queue data*/5 RAW_VOID **write; /* Pointer to where next message willbe inserted in the Q */6 RAW_VOID **read; /* Pointer to where next message will beextracted from the Q */7 RAW_U32 size; /* Size of queue (maximum number of entries)*/8 RAW_U32 current_numbers; /* Current number of entries in thequeue */9 RAW_U16 blocked_send_task_numbers; /*number of blocked send tasknumbers */10 RAW_U16 blocked_receive_task_numbers; /*number of blocked send tasknumbers */1112 } RAW_MSG_Q;1314typedef struct RAW_QUEUE15 {16 RAW_COMMON_BLOCK_OBJECT common_block_obj;17 RAW_MSG_Q msg_q;1819 } RAW_QUEUE;上面的代码中有两段数据结构,第一段主要表示循环队列的内容,其中包括了队列首地址、队列末尾地址、当前队列读取地址、当前队列插入地址、队列大小、消息个数、阻塞的发送线程数据、阻塞的接受线程数目。
而第二段数据结构就比较简单,它把通用等待结构和循环队列合在了一起,共同构成了消息队列的数据结构。
根据我们以前的经验,互斥同步数据结构的操作都会分成几个部分,当然消息队列也不例外,也会分成初始化、发送消息、接受消息、清除消息、删除消息队列等几种操作函数。
当然,消息队列还是增加了一个新的选项,那就是插入消息的时候可以插入在队列的前方,还是插入在队列的尾部,这在某种程度上决定了消息的优先级。
说到这,我们还是看看消息队列是怎么初始化的,20RAW_U16 raw_queue_create(RAW_QUEUE *p_q, RAW_U8 *p_name, RAW_VOID**msg_start, RAW_U32 number)21 {2223 #if (RAW_QUEUE_FUNCTION_CHECK > 0)2425if (p_q == 0) {2627return RAW_NULL_OBJECT;28 }2930if ( msg_start == 0) {3132return RAW_NULL_POINTER;33 }3435if (number == 0) {3637return RAW_ZERO_NUMBER;38 }3940 #endif4142 list_init(&p_q->common_block_obj.block_list);4344 p_q->common_block_ = p_name;45 p_q->common_block_obj.block_way = 0;46 p_q->msg_q.queue_start = msg_start; /* Initializethe queue */47 p_q->msg_q.queue_end = &msg_start[number];48 p_q->msg_q.write = msg_start;49 p_q->msg_q.read = msg_start;50 p_q->msg_q.size = number;51 p_q->msg_q.current_numbers = 0;52 p_q->msg_q.blocked_send_task_numbers = 0;53 p_q->msg_q.blocked_receive_task_numbers = 0;54return RAW_SUCCESS;55 }56虽然相比较之前的互斥函数,消息队列的初始化内容好像多一些。
但是大家如果对循环队列的知识比较了解的话,其实也不是很复杂的。
我们看到,函数除了对通用阻塞结构进行初始化之外,就是对这些循环队列进行初始化。
接着,我们就可以看看消息发送函数是怎么样的,57static RAW_U16 internal_msg_post(RAW_QUEUE *p_q, RAW_VOID *p_void, RAW_U8 opt_send_method, RAW_U8 opt_wake_all, RAW_U32 wait_option)58 {59 RAW_U16 error_status;60 LIST *block_list_head;61 RAW_U8 block_way;6263 RAW_SR_ALLOC();6465 #if (RAW_QUEUE_FUNCTION_CHECK > 0)6667if (raw_int_nesting) {6869if (wait_option != RAW_NO_WAIT) {7071return RAW_NOT_CALLED_BY_ISR;72 }73 }7475if (p_q == 0) {7677return RAW_NULL_OBJECT;78 }7980if (p_void == 0) {8182return RAW_NULL_POINTER;83 }8485 #endif8687 block_list_head = &p_q->common_block_obj.block_list;89 RAW_CRITICAL_ENTER();9091/*queue is full condition, there should be no received task blocked on queue object!*/92if (p_q->msg_q.current_numbers >= p_q->msg_q.size) {9394if (wait_option == RAW_NO_WAIT) {95 RAW_CRITICAL_EXIT();96return RAW_MSG_MAX;97 }9899else {100101/*system is locked so task can not be blocked just return immediately*/ 102if (raw_sched_lock) {103 RAW_CRITICAL_EXIT();104return RAW_SCHED_DISABLE;105 }106/*queue is full and SEND_TO_FRONT method is not allowd*/107if (opt_send_method == SEND_TO_FRONT) {108109 RAW_CRITICAL_EXIT();110return RAW_QUEUE_FULL_OPT_ERROR;111 }112113 p_q->msg_q.blocked_send_task_numbers++;114 raw_task_active->msg = p_void;115 block_way = p_q->common_block_obj.block_way;116 p_q->common_block_obj.block_way = RAW_BLOCKED_WAY_FIFO;117/*there should be no blocked received task beacuse msg exits*/118 raw_pend_object(&p_q->common_block_obj, raw_task_active,wait_option);119 p_q->common_block_obj.block_way = block_way;120121 RAW_CRITICAL_EXIT();122123 raw_sched();124125 error_status = block_state_post_process(raw_task_active, 0);126127return error_status;128129 }131 }132133/*Queue is not full here, there should be no blocked send task*/134/*If there is no blocked receive task*/135if (is_list_empty(block_list_head)) {136137 p_q->msg_q.current_numbers++; /* Update the nbr of entries in the queue */138139if (opt_send_method == SEND_TO_END) {140141 *p_q->msg_q.write++ = p_void;142143if (p_q->msg_q.write == p_q->msg_q.queue_end) {144145 p_q->msg_q.write = p_q->msg_q.queue_start;146147 }148149 }150151else {152153if (p_q->msg_q.read == p_q->msg_q.queue_start) { 154 p_q->msg_q.read = p_q->msg_q.queue_end;155 }156157 p_q->msg_q.read--;158 *p_q->msg_q.read = p_void; /* Insert message into queue */159160 }161162 RAW_CRITICAL_EXIT();163164return RAW_SUCCESS;165 }166167/*wake all the task blocked on this queue*/168if (opt_wake_all) {169170while (!is_list_empty(block_list_head)) {171 wake_send_msg(list_entry(block_list_head->next, RAW_TASK_OBJ,task_list), p_void);172 }173174 p_q->msg_q.blocked_receive_task_numbers = 0;175 }176177/*wake hignhest priority task blocked on this queue and send msg to it*/ 178else {179180 wake_send_msg(list_entry(block_list_head->next, RAW_TASK_OBJ,task_list), p_void);181 p_q->msg_q.blocked_receive_task_numbers--;182 }183184 RAW_CRITICAL_EXIT();185186 raw_sched();187return RAW_SUCCESS;188 }189这里消息发送函数稍显冗长,这主要是因为消息发送的情况比较复杂,方方面面考虑的情况比较多。