打印
[uCOS/RTOS]

ucos 中断问题

[复制链接]
1751|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
s290484188|  楼主 | 2017-2-22 14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用IO口模拟SPI从机,每次通过中断获取主机的数据,这个时钟有1M多;用硬件中断刚好接收完数据,基本上没有多的时间

在UCOS里面,如果不管理中断会出现什么意外
        OS_ENTER_CRITICAL();                        
        OSIntNesting++;
        OS_EXIT_CRITICAL();
        ...
        ...
        OSIntExit();

执行以上代码,我肯定接不得数据


相关帖子

沙发
s290484188|  楼主 | 2017-2-23 08:05 | 只看该作者
求助

使用特权

评论回复
板凳
airwill| | 2017-2-27 18:04 | 只看该作者
这个代码是需要的,所谓重入限制。
你可以
1。 在进行数据传输的时候禁止中断的
2。 最好改用硬件实现数据传输

使用特权

评论回复
地板
s290484188|  楼主 | 2017-2-28 14:36 | 只看该作者
airwill 发表于 2017-2-27 18:04
这个代码是需要的,所谓重入限制。
你可以
1。 在进行数据传输的时候禁止中断的

因为时序特殊,不能用硬件方式
SPI中断每20ms一次,相当于经常发生;
感觉肯定会影响ucos运行啊

使用特权

评论回复
5
airwill| | 2017-2-28 15:22 | 只看该作者
会多占用点时间,但影响不大

       OS_ENTER_CRITICAL();                        
        OSIntNesting++;
        OS_EXIT_CRITICAL();

这几个都是非常精练的代码,不要担心

使用特权

评论回复
6
s290484188|  楼主 | 2017-2-28 17:07 | 只看该作者
airwill 发表于 2017-2-28 15:22
会多占用点时间,但影响不大

       OS_ENTER_CRITICAL();                        

因为硬件问题,现在中断里面最多允许增加3行i++;
这个从机SPI是为了跟别人的配合
CPU时钟只有72M

使用特权

评论回复
7
airwill| | 2017-2-28 21:19 | 只看该作者
这个中断这么紧张?
中断每20ms一次,不应该这么紧张,你可以外面的程序设置缓冲区,中断只读写缓冲区

使用特权

评论回复
8
lishutong| | 2017-3-2 08:30 | 只看该作者
s290484188 发表于 2017-2-28 17:07
因为硬件问题,现在中断里面最多允许增加3行i++;
这个从机SPI是为了跟别人的配合
CPU时钟只有72M

你是不是在中断里面做了太多工作了,也许你可以尝试精简中断里的代码。
在中断中只完成接受spi数据的操作,然后将数据通过写入消息队列。这个过程应该很快的。然后再由一个单独的任务从消息队列中取数据然后处理。

Ps:如果是觉得对ucos底层工作原理不太了解的话,可以学下我的公开课:http://open.21ic.com/Video/index/id/6034

使用特权

评论回复
9
djyos| | 2017-3-2 11:06 | 只看该作者
超过1M从时钟,IO模拟,只有72M主频,ucosii实时性估计不够。
要求这么高实时性,要么裸跑,要么用djyos吧。

使用特权

评论回复
10
s290484188|  楼主 | 2017-3-3 09:07 | 只看该作者
djyos 发表于 2017-3-2 11:06
超过1M从时钟,IO模拟,只有72M主频,ucosii实时性估计不够。
要求这么高实时性,要么裸跑,要么用djyos吧 ...

我现在没由用ucos的系统管理SPI的中断,程序也正常运行的,但不知道会有什么隐患

使用特权

评论回复
11
s290484188|  楼主 | 2017-3-3 09:10 | 只看该作者
airwill 发表于 2017-2-28 21:19
这个中断这么紧张?
中断每20ms一次,不应该这么紧张,你可以外面的程序设置缓冲区,中断只读写缓冲区 ...

9楼说的就是我现在的问题,中断里只能执行大概9条命令
程序是跑起来了,但是没有用下面的代码管理,不知道会不会有隐患
        OS_ENTER_CRITICAL();                        
        OSIntNesting++;
        OS_EXIT_CRITICAL();
我测试了一天,运行正常

使用特权

评论回复
12
s290484188|  楼主 | 2017-3-3 09:10 | 只看该作者
lishutong 发表于 2017-3-2 08:30
你是不是在中断里面做了太多工作了,也许你可以尝试精简中断里的代码。
在中断中只完成接受spi数据的操作 ...

好的,是得慢慢学

使用特权

评论回复
13
夏亦初阳| | 2017-4-18 15:56 | 只看该作者
你可以测一下你的中断时钟是否是想要的1M    应该不会是准确的1M  可以在Tim中断里Post信号量  然后再在ucos任务里Pend信号量
接收数据

使用特权

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

本版积分规则

16

主题

54

帖子

0

粉丝