ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收

串口发送部分代码:

//通过信号量的方法发送数据
void usart1SendData(CPU_INT08U ch)
{
    OS_ERR err;
    CPU_INT08U isTheFirstCh;

    OSSemPend(&Usart1Sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待串口发送资源
    OSSemPend(&Usart1TxBufSem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待发送
    isTheFirstCh = 0;
    if(pTxBufRead == pTxBufWrite){  //若读指针等于写指针,表明要写入缓冲区的为当前第一个数据
        isTheFirstCh = 1; //置位第一个数据标志
    }
    *pTxBufWrite = ch;//向当前写指针对应的地址写入数据
    if((pTxBufWrite++) == &Usart1TxBuf[USART1_TX_BUFFER_LEN - 1]){ //若当前写指针写到缓冲区最后一个地址,否则地址自增1
        pTxBufWrite = Usart1TxBuf; //写指针更新为缓冲区第一个地址,环形队列
    }
    if(isTheFirstCh){ //写入的是第一个数据
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//开启缓冲区发送空中断,下一步将会进入中断处理数据
    }
    OSSemPost(&Usart1Sem, OS_OPT_POST_1, &err);
}

串口接收部分代码:

//串口1中断处理程序
void USART1_IRQHandler(void)                    //串口1中断服务程序
{
    OS_ERR err;
    OSIntEnter();    //通知UCOS进入中断
    //发送缓冲区空中断
    if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)  {
        USART_SendData(USART1, *pTxBufRead);//向串口发送缓冲区写入一个字节
        if((pTxBufRead++) == &Usart1TxBuf[USART1_TX_BUFFER_LEN - 1]){ //读到最后一个字节
            pTxBufRead = Usart1TxBuf;  //移动读指针到第首地址
        }
        if(pTxBufRead == pTxBufWrite){ //若读写指针相等,表明本次缓冲区数据已经读完
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//关闭中断
        }
        OSSemPost(&Usart1TxBufSem, OS_OPT_POST_1, &err); //释放缓冲区信号量
    }
    //串口接收到数据中断
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
        *pRxBufWrite = USART_ReceiveData(USART1); //读取一个字节到缓冲区
        OSTaskQPost(&Usart1RxTaskTCB, pRxBufWrite, 1, OS_OPT_POST_FIFO, &err);   //发送该字节所在缓冲区的地址到消息队列,等待任务处理
        if((pRxBufWrite++) == &Usart1RxBuf[USART1_RX_BUFFER_LEN - 1]){ //若当前写指针写到缓冲区最后一个地址
            pRxBufWrite = Usart1RxBuf; //写指针更新为缓冲区第一个地址,环形队列
        }
    }
    OSIntExit();    //通知UCOS退出中断
}

例程:

http://www.openedv.com/forum.php?mod=attachment&aid=Njg0MnxmMzFkMzdmN3wxNTQ1MDQ0NjE5fDB8MzM2MTE%3D

原文地址:https://www.cnblogs.com/jiangzhaowei/p/10133234.html

时间: 2024-07-30 06:22:44

ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收的相关文章

任务内建消息队列——OSTaskQ???()

一.知识背景 实际应用中,多个任务同时等待一个消息队列的情况很少见,也就是说OSQ???()用的并不多,因此,在uC/OS-III 中,每一个任务都有其内建的消息队列.用户可以通过外部消息队列直接发送消息给任务. 这个特性不仅简化了代码, 还提高了效率.如下示意图, uC/OS-III 中与任务消息队列相关的服务都是以 OSTask???()开头的.设置 OS_CFG.H 中的 OS_CFG_TASK_EN 使能任务的消息队列服务.与任务消息队列相关的代码在 OS_TASK.C 中. 当用户清楚

消息队列入门(一)关于消息队列

什么是消息队列 消息是指在两个独立的系统间传递的数据,这两个系统可以是两台计算机,也可以是两个进程. 消息可以非常简单,可以是简单的字符串,也可以是保存了数据持久化的各种类型的文档集合. 队列是在消息的传输过程中的通道,是保存消息的容器,根据不同的情形,可以有先进先出,优先级队列等区别 . 为什么使用消息队列 个人觉得消息队列主要的意义是解耦和异步处理,以及在高并发场景下平滑短时间内大量的服务请求. 消息队列不仅被用于系统内部组件之间的通信,同时也被用于系统跟其它服务之间的交互. 消息队列的使用

skynet源码学习 - 从全局队列中弹出/压入一个消息队列过程

学习云风的skynet源码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue *q= Q; uint32_t tail = GP(__sync_fetch_and_add(&q->tail,1)); // only one thread can set the slot (change q->queue[tail] from NULL to queue) if (!_

skynet源代码学习 - 从全局队列中弹出/压入一个消息队列过程

学习云风的skynet源代码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue *q= Q; uint32_t tail = GP(__sync_fetch_and_add(&q->tail,1)); // only one thread can set the slot (change q->queue[tail] from NULL to queue) if (!

消息队列状态:struct msqid_ds

Linux的消息队列(queue)实质上是一个链表, 它有消息队列标识符(queue ID). msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添加一条新消息; msgrcv从队列中取消息, 取消息是不一定遵循先进先出的, 也可以按消息的类型字段取消息. 1. 标识符(des)和键(key): 消息队列, 信号量和共享存储段, 都属于内核中的IPC结构, 它们都用标识符来描述. 这个标识符是一个非负整数, 与文件描述符不同的是, 创建时并不会重复利用通过删除回收的整数,

Linux进程间通信 -- 消息队列 msgget()、msgsend()、msgrcv()、msgctl()

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信 -- 使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条

消息队列(二)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka). 四.JMS消息服务 讲消息队列就不得不提JMS .JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建.发送.接收和读取消息.它使分布式通信耦合度更低,消息服务更加可靠以及异步性. 在EJB架构中,有消息bean可以无缝的与JM消息服务集成.在J2EE架构模

大型网站架构系列:消息队列

出处:ITFLY8 网址:http://www.cnblogs.com/itfly8/p/5156155.html 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间件. 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等. 二.消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景.异

大型网站架构系列:消息队列(二)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本