打印
[uCOS/RTOS]

我的程序为什么没有等待信号量呢

[复制链接]
1118|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
少先队员|  楼主 | 2015-6-5 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 少先队员 于 2015-6-5 11:32 编辑

求助,折腾好几天了。
程序如下,在任务中等待一个信号量,pend信号量之后调用一个函数发送一个数据包,这个数据包发送完毕再post这个信号量。现在的问题是:nfc_cmd_flag为1的时候发送完"cmd has recv.\r\n"之后没有发送 "pack check ok.\r\n",如果在"pack check ok.\r\n"前一句的pend一行打上断点,停一下再继续运行就能发送"pack check ok.\r\n"。
真是奇怪,
第一、为什么打上断点再运行就能发送,直接全速运行就发不出来呢?
第二、为什么第一句的cmd recv还没有发送完,这时信号量还没有释放,为什么没有等待信号量呢?
求指点,谢谢!
void nfc_task(void *p_arg)
{
        nfc_hard_init();
        sem_u3_tx = OSSemCreate(1);
        
        while(1)
        {
                if(nfc_cmd_flag==1)
                {
                        nfc_cmd_flag = 0;
                        OSSemPend(sem_u3_tx,0,&err);
                        u3_send("cmd has recv.\r\n", sizeof("cmd has recv.\r\n"));
                        if(nfc_pack_check((&u3_rcv_buf[5]), u3_rcv_cnt-6))
                        {
                                OSSemPend(sem_u3_tx,100,&err);
                                u3_send("pack check ok.\r\n", sizeof("pack check ok.\r\n"));
                        }
                        u3_rcv_cnt = 0;
                }
                OSTimeDlyHMSM(0, 0,0,10);
        }
}

void USART3_IRQHandler(void)
{
        if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
        {
                USART3->DR = *(u3_tx_ptr+u3_tx_cur);
                u3_tx_cur++;
                if(u3_tx_cur==u3_tx_size)
                {
                        USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
                        OSSemPost(sem_u3_tx);
                }
                USART_ClearITPendingBit(USART3, USART_IT_TXE);        //
        }
}

相关帖子

沙发
duzhongliang| | 2015-6-14 17:07 | 只看该作者
OSSemPend(sem_u3_tx,100,&err);改成OSSemPend(sem_u3_tx,0,&err);试试

使用特权

评论回复
板凳
duzhongliang| | 2015-6-14 18:05 | 只看该作者
void USART3_IRQHandler(void)
{
        if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
        {
                USART3->DR = *(u3_tx_ptr+u3_tx_cur);
                u3_tx_cur++;
                if(u3_tx_cur==u3_tx_size)
                {
                        USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
                        OSSemPost(sem_u3_tx);
                }
                USART_ClearITPendingBit(USART3, USART_IT_TXE);        //
        }
}
应该改为:
void USART3_IRQHandler(void)
{
   OS_CPU_SR cpu_sr;
   OS_ENTER_CRITICAL();                                
      OSIntNesting++;                          
   OS_EXIT_CRITICAL();                  
        if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
        {
                USART3->DR = *(u3_tx_ptr+u3_tx_cur);
                u3_tx_cur++;
                if(u3_tx_cur==u3_tx_size)
                {
                        USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
                        OSSemPost(sem_u3_tx);
                }
                USART_ClearITPendingBit(USART3, USART_IT_TXE);        //
        }
OSIntExit();
}

使用特权

评论回复
地板
wxjcan| | 2015-6-15 12:02 | 只看该作者
楼主问题解决了没

使用特权

评论回复
5
少先队员|  楼主 | 2015-6-15 14:09 | 只看该作者
wxjcan 发表于 2015-6-15 12:02
楼主问题解决了没

用的其他方法做的,楼上的方法等晚上有空试一下。

使用特权

评论回复
6
少先队员|  楼主 | 2015-6-15 14:10 | 只看该作者
duzhongliang 发表于 2015-6-14 17:07
OSSemPend(sem_u3_tx,100,&err);改成OSSemPend(sem_u3_tx,0,&err);试试

试过无限等待,也是不可以,

使用特权

评论回复
7
duzhongliang| | 2015-6-16 00:18 | 只看该作者
你那样写的是裸机中断,

使用特权

评论回复
8
duzhongliang| | 2015-6-16 00:29 | 只看该作者
少先队员 发表于 2015-6-15 14:10
试过无限等待,也是不可以,

基于嵌入式实时操作系统的程序设计技术.pdf
网上搜搜这本书看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

173

帖子

0

粉丝