OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4599|回复: 1

如果消息队列或信号量失效是怎么回事?

[复制链接]

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2018-7-10
在线时间
17 小时
发表于 2018-11-10 09:40:16 | 显示全部楼层 |阅读模式
3金钱
我使用的是UCOS3+STM32F407,串口收发用的是DMA的空闲接收与DMA直接发送。程序里起了8个任务,现在有个现象:      比如我的串口1--DMA空闲中断收到得数据用消息队列传递到任务里,一开始任务1用着还行,后来这个任务1挂起了,任务2再去接收这个队列的数据,传的size全是0,无奈我只好使用信号量通知任务收到串口数据了,在任务里直接处理串口数据,但用着用着,别的串口2的收发处理也这么做,会发现遇到一次大数组传递(7-8K数据量)我的串口里打印接收字节是对的,但在任务里看竟然接收字节数是0


想求问大家遇到传递后数据不对该怎么做啊?求谢!

部分代码如下:

volatile u16 USART6_ReceiveSize = 0;
//空闲中断
void USART6_IRQHandler(void)
{
        #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
                OSIntEnter();   
        #endif       
       
        OS_ERR err;
        volatile u16 data,j;
        if(USART_GetITStatus(USART6,USART_IT_IDLE) != RESET)
        {
                DMA_Cmd(DMA2_Stream2, DISABLE); //关闭DMA,防止处理其间有数据

                data = USART6->SR;
                data = USART6->DR;
               
                USART6_ReceiveSize = USART6_REC_LEN - DMA_GetCurrDataCounter(DMA2_Stream2);
                if(USART6_ReceiveSize !=0)
                {                                                                       
                        if(Qcamera_flag != 0)
                        {
                                OSSemPost(&PHOTO_SEM, OS_OPT_POST_ALL, &err);  //发送信号量       
                                DEBUG("USART6_ReceiveSize: %d\r\n", USART6_ReceiveSize);      这块收的数据没问题
                        }


任务里
u8 read_photo(u8 waittick)
{
        u8 i = 0, readphoto_flag = 0;
        u16 start_flag = 0, stop_flag = 0;
        u8 buff[20] = {0x00};
        u16 j = 0, photo_templen = 0;
        OS_ERR err;
       
        buff[i++] = 0x56;
        buff[i++] = 0x00;
        buff[i++] = 0x32;
        buff[i++] = 0x0C;
        buff[i++] = 0x00;
        buff[i++] = 0x0A;
        buff[i++] = 0x00;         //启始地址(起始地址必须是8的倍数,一般设00 00)
        buff[i++] = 0x00;
        buff[i++] = 0x00;
        buff[i++] = 0x00;
        buff[i++] = 0x00;          //图片数据长度(先高位字节,后低位字节)
        buff[i++] = 0x00;
        buff[i++] = photo_length_hi;
        buff[i++] = photo_length_lo;
        photo_length = ( photo_length_hi << 8) | photo_length_lo;  //2个字节合并为1个u16类型数据
        buff[i++] = 0x00; //间隔时间(= ZZ ZZ*0。01 毫秒 ,最好设小点如 00 0A)
        buff[i++] = 0x00; //根据我的需要还是设大点
        photo_length_hi = 0x00;
        photo_length_lo = 0x00;

        SendBytesInfoProc(USART6_TX, buff, i);
        OSSemPend(&PHOTO_SEM, waittick, OS_OPT_PEND_BLOCKING, 0, &err); //请求信号量       
        printf("uart6_size: %d\r\n",  USART6_ReceiveSize);   这块打的是0

        for(j = 0; j < USART6_ReceiveSize; j++)
        {

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2018-11-12 01:38:49 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 08:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表