ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收
串口发送部分代码:
//通过信号量的方法发送数据
void usart1SendData(CPU_INT08U ch)
{
OS_ERR err;
CPU_INT08U isTheFirstCh; OSSemPend(&Usart1Sem, , OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待串口发送资源
OSSemPend(&Usart1TxBufSem, , OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待发送
isTheFirstCh = ;
if(pTxBufRead == pTxBufWrite){ //若读指针等于写指针,表明要写入缓冲区的为当前第一个数据
isTheFirstCh = ; //置位第一个数据标志
}
*pTxBufWrite = ch;//向当前写指针对应的地址写入数据
if((pTxBufWrite++) == &Usart1TxBuf[USART1_TX_BUFFER_LEN - ]){ //若当前写指针写到缓冲区最后一个地址,否则地址自增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 - ]){ //读到最后一个字节
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, , OS_OPT_POST_FIFO, &err); //发送该字节所在缓冲区的地址到消息队列,等待任务处理
if((pRxBufWrite++) == &Usart1RxBuf[USART1_RX_BUFFER_LEN - ]){ //若当前写指针写到缓冲区最后一个地址
pRxBufWrite = Usart1RxBuf; //写指针更新为缓冲区第一个地址,环形队列
}
}
OSIntExit(); //通知UCOS退出中断
}
例程:
http://www.openedv.com/forum.php?mod=attachment&aid=Njg0MnxmMzFkMzdmN3wxNTQ1MDQ0NjE5fDB8MzM2MTE%3D
ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收的更多相关文章
- UCOSIII内建消息队列
使能内建消息队列 将OS_CFG_TASK_Q_EN置1 API函数 #if OS_CFG_TASK_Q_EN > 0u //删除 OS_MSG_QTY OSTaskQFlush (OS_TCB ...
- XP局域网内专用消息队列
网上能找到DELPHI消息队列的方法,在XP下试了总是不成功,后来在2003上试就行了,对比发现消息队列属性->安全 2003中多了个用户ANONYMOUS_LOGON. 然后在XP下消息队列属 ...
- skynet源代码学习 - 从全局队列中弹出/压入一个消息队列过程
学习云风的skynet源代码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue ...
- 获取和设置消息队列的属性msgctl,删除消息队列
消息队列的属性保存在系统维护的数据结构msqid_ds中,用户可以通过函数msgctl获取或设置消息队列的属性. int msgctl(int msqid, int cmd, struct msqid ...
- RabbitMQ消息队列入门(一)——RabbitMQ消息队列的安装(Windows环境下)
一.RabbitMQ介绍1.RabbitMQ简介RabbitMQ是一个消息代理:它接受和转发消息.你可以把它想象成一个邮局:当你把你想要发布的邮件放在邮箱中时,你可以确定邮差先生最终将邮件发送给你的收 ...
- 【消息队列】windows下安装RabbitMQ消息队列服务器
RabbitMQ是什么 ? RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. 1:安装RabbitMQ需要先安装Erla ...
- μC/OS-III---I笔记9---任务等待多个内核对象和任务内建信号量与消息队列
在一个任务等待多个内核对象在之前,信号量和消息队列的发布过程中都有等待多个内核对象判断的函数,所谓任务等待多个内核对象顾名思义就是一任务同时等待多个内核对象而被挂起,在USOC-III中一个任务等待多 ...
- 1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)
补充: 程序优化 为避免普通发送和中断发送造成冲突(造成死机,复位重启),printf修改为中断发送 写这篇文章的目的呢,如题目所言,我承认自己是一个程序猿.....应该说很多很多学单片机的对于... ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
随机推荐
- sizeof和strlen区别(转)
char str[20]="0123456789"; int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记. int ...
- Python之路PythonThread,第一篇,进程1
python3 进程1 多任务编程: 可以有效的利用计算机资源,同时执行多个任务, 进程:进程就是程序在计算机中一次执行的结果: 进程和程序的区别: 程序是一个静态文件的描述,不占用计算机的系统资源: ...
- The NMEA 0183 Protocol
The NMEA 0183 Protocol NMEA0183 协议是由美国国家海洋电子协会开发.维护并发布的标准,用于航海远洋时使用的电子仪器之间的通信. 目前大部分的 GPS 接受设备都遵循这一标 ...
- go:基于时间轮定时器方案
/* * http://blog.csdn.net/yueguanghaidao/article/details/46290539 * 修改内容:为定时器增加类型和参数属性,修改回调函数类型 */ p ...
- 配置apache-maven-3.6.0时所遇到的坑(二)
在命令行窗口中输入:mvn -v 或 直接 mvn 时出现如下问题: The JAVA_HOME environment variable is not defined corre ...
- linux php.ini文件没有指向 不生效
phpinfo下查看: 命令行下查看 :php -i | grep "Loaded Configuration File" 解决: 使用命令去追踪错误: strace /usr/ ...
- BFS模板
bool visit[maxn];///访问标记 ,,,,-,,-,}; ///向左上右下,左下,右上,右下,左上 ,,,-,-,,,-}; struct node { int r; int c; i ...
- (25)Django中操作cookie与session组件(添加cookie和删除cookie)
cookie是存在于客户端浏览器上的键值对,是明文的 cookie是当用户访问网站时候和数据提起携带过去,安全性比较差, 容易被拦截 session存在于服务端的键值对,是一串加密的字符串 当用户登陆 ...
- 【HDOJ1598】【枚举+最小生成树】
http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000/1000 ...
- git使用之放弃本地修改
一,未使用 git add 缓存代码时. 可以使用 git checkout -- filepathname (比如: git checkout -- readme.md ,不要忘记中间的 “-- ...