搜索
bottom↓
回复: 13

ucos在执行IIC通信时序延时时,任务应该调度吗

[复制链接]

出0入0汤圆

发表于 2015-1-29 16:29:36 | 显示全部楼层 |阅读模式
做项目第一次用到ucos,也没有时间自习阅读远吗?请大神们帮忙看一下。比如在执行读取II2数据时,时序时需要延时的,那么在延时的时候,会进行任务调度吗?如果我没有把时序延时放在临界区,任务多了以后会不会影响稳定呢

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2015-1-29 16:57:02 | 显示全部楼层
你用ucos提供的延时函数的话,任务就会主动让出处理器,然后进行任务调度。

出0入8汤圆

发表于 2015-1-29 17:11:54 | 显示全部楼层
如果用系统的延时函数,那么同2楼所说。
如果是软件延时的话,也是可能会发生调度切换的,调度时间片到了,该调度还是要调度。
不过IIC一般对时间不太敏感,只要总线中断时间不大的话,被暂时中断掉,是OK的,这要看具体的芯片。

出0入0汤圆

 楼主| 发表于 2015-1-29 17:17:46 | 显示全部楼层
嗯呐 明白了 多谢

出0入0汤圆

 楼主| 发表于 2015-1-30 13:28:59 | 显示全部楼层
security 发表于 2015-1-29 17:11
如果用系统的延时函数,那么同2楼所说。
如果是软件延时的话,也是可能会发生调度切换的,调度时间片到了, ...

你好,再顺便问一下ucos中的串口中断太过频繁会不会影响系统的稳定呢

出0入0汤圆

发表于 2015-1-30 22:30:31 来自手机 | 显示全部楼层
能上操作系统的单片机都有硬件iic吧,用系统管理硬iic不更好,为啥要软件模拟时序啊

出0入8汤圆

发表于 2015-1-30 22:30:32 | 显示全部楼层
一寒 发表于 2015-1-30 13:28
你好,再顺便问一下ucos中的串口中断太过频繁会不会影响系统的稳定呢

影响稳定要看你的设计,一般来说是不会,最多影响的是响应速度
另外中断处理时间过长的话才是影响的最大因素。

出0入0汤圆

 楼主| 发表于 2015-1-31 08:50:29 | 显示全部楼层
AHTY 发表于 2015-1-30 22:30
能上操作系统的单片机都有硬件iic吧,用系统管理硬iic不更好,为啥要软件模拟时序啊 ...

老工程师说stm32的I2C外设不如模拟的稳定

出0入0汤圆

 楼主| 发表于 2015-1-31 08:52:06 | 显示全部楼层
security 发表于 2015-1-30 22:30
影响稳定要看你的设计,一般来说是不会,最多影响的是响应速度
另外中断处理时间过长的话才是影响的最大 ...

使用ucos信号量,未使用Post函数释放信号量,任务却能请求到


使用ucosII做一个任务的同步,为了找出问题所在把其他任务全部屏蔽了,只剩下一个任务

void mpu6050_task(void *pdata)
{
  u8 err;
        pdata = pdata ;
        while(1)
        {

     OSSemPend(sem_mpu6050,0,&err);
        
           mpu6050_times++;
           disp_num(200,130,mpu6050_times);//液晶显示该数字
                 delay_ms(100);
   
  }
}

创建任务前已经初始化信号量 sem_mpu6050

sem_mpu6050 = OSSemCreate(0);

释放该信号量的函数位于串口3中断服务子程序中

void USART3_IRQHandler(void)                  
{
   OSIntEnter();
   if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断有效
     {
                         OSSemPost(sem_mpu6050);
                       Temp0[counter] = USART_ReceiveData(USART3);   //
     
        
     }
         OSIntExit();

}

由于是第一次用到ucos,为了测试信号量到底有没有起作用,我将中断服务程序中的释放函数OSSemPost(sem_mpu6050)屏蔽,但是不知为什么任务仍能请求到信号继续向下执行,你有没有碰到过这种现象的呢

出0入8汤圆

发表于 2015-1-31 10:01:18 | 显示全部楼层
一寒 发表于 2015-1-31 08:52
使用ucos信号量,未使用Post函数释放信号量,任务却能请求到

我也没用过ucos,自己也只是纸上谈兵。
不过你这样的情况,首先要看看OSSemPend(sem_mpu6050,0,&err)的err返回值是否正确。
而后也可以单步调试,跟进去,看看哪里出问题了
等你找到问题点了,再来教我们一下,一块学习学习。

出0入0汤圆

发表于 2015-1-31 10:05:02 | 显示全部楼层
有的IIC外设对时钟间隔有要求,如果在一个超时参数内没收到ACK及其时钟,那芯片认为失败自己会复位,所以这个在OS中似乎有问题,万一OS插断你的ACK发生就不好了。

出0入0汤圆

 楼主| 发表于 2015-1-31 10:34:39 | 显示全部楼层
security 发表于 2015-1-31 10:01
我也没用过ucos,自己也只是纸上谈兵。
不过你这样的情况,首先要看看OSSemPend(sem_mpu6050,0,&err)的er ...

找到原因了,创建信号量的函数一定要写在OSInit()和OSStart()函数之间,之前写在了INIT前面,所以信号量没有创建成功,指针没有指向信号量,所以每次都能请求到信号量

出0入0汤圆

 楼主| 发表于 2015-1-31 10:35:41 | 显示全部楼层
NJ8888 发表于 2015-1-31 10:05
有的IIC外设对时钟间隔有要求,如果在一个超时参数内没收到ACK及其时钟,那芯片认为失败自己会复位,所以这 ...

那就把它放在临界区行吗

出0入0汤圆

发表于 2017-1-24 17:44:55 | 显示全部楼层
security 发表于 2015-1-29 17:11
如果用系统的延时函数,那么同2楼所说。
如果是软件延时的话,也是可能会发生调度切换的,调度时间片到了, ...

挖坟

ucos ii 是抢占式的,软件延时不会发生调度切换,只有主动调用系统提供的延时函数 或者 那些 sem,mutex 主动挂起才会调度。
可以看一下 os_core.c 中 void  OSTimeTick (void) 这个系统 ticker,这里面只涉及到了任务的状态(挂起,就绪)转换,并没有切换任务。
真正的任务切换则由 void OS_Sched(void) 完成。

ucos iii 才支持时间片轮转,这时你说的情况才成立。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 17:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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