打印

紧急求救——是S3C2440昏了还是我昏了?

[复制链接]
2621|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tearsman520|  楼主 | 2009-8-26 19:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tearsman520 于 2009-8-26 20:24 编辑

最近在做一个音频信号分析仪,AD部分采用了一个非主流的芯片——AD7366,前期没有上操作系统,未发挥触摸功能,已经实现了基本要求。后期加入了μC-OS操作系统,触摸功能也实现了,可现在I/O速度上不去了……

在没有μC-OS的情况下,写一个while循环,往I/O口写“1”写“0”,翻转速度可以达到2MHz;
现在上了操作系统,在μC-OS下写同样的循环,翻转速度仅有50KHz左右,为什么啊?

是我昏了还是2440昏了……

上了操作系统以后,该如何让I/O翻转速度仍保持2MHz啊……

囧……求救,在此谢过

相关帖子

沙发
tearsman520|  楼主 | 2009-8-26 20:23 | 只看该作者
补充:
补充一下,放在Timer中断里翻转,最大能达到50K
如果我Timer设置成2M的,中断异或一次,只有20K
Timer设置成100K,中断异或一次,有50K

求救……

使用特权

评论回复
板凳
arm4u| | 2009-8-26 20:47 | 只看该作者
很明显,你没昏,2440也没昏,是uc/os昏

使用特权

评论回复
地板
tearsman520|  楼主 | 2009-8-26 20:48 | 只看该作者
补充说明到有大侠帮忙:
是这样的,用100K的Timer,每次中断反转一下,50K的是正确的。没有重叠


关键问题是

同样一个语句。。。

while(1)
{
IOPort ^=1;

}


在没有OS的情况下
IOPort用示波器看,是2M


在ucOS下(没有开其他任务,只开了MainTask)
IOPort用示波器看,是500K

我们要读取AD的值,有一些IO口的操作,但是现在采样率一直上不去,估计是不是这个问题
也不知道怎么解决

使用特权

评论回复
5
auzxj| | 2009-8-26 21:24 | 只看该作者
ucos处理中断会比前后台方式费时间
中断响应时间=中断延迟+保存CPU内部寄存器时间+内核进入ISR的时间
中断恢复时间=ucos判断是否有更高优先级的任务的时间+恢复更高优先级的任务的CPU内部寄存器时间+执行中断返回命令

以上红字部分就是和楼主前后台时间的差异,可以查阅相关资料,看这段时间到底有多长,我能力有限,暂时不知道,但你可以尽量减少你的MainTask的任务堆栈的容量
楼主的程序只有MainTask,在执行中断恢复的时候要轻松一些,不用做任务切换,否则会更加费时

good luck

使用特权

评论回复
6
tearsman520|  楼主 | 2009-8-26 21:50 | 只看该作者
5# auzxj

可关键问题在于,我们现在还未使用中断,就只是在maintask中做while循环,

为何与不跑OS时的翻转速度有那么大的差异?

您说的问题,我们现在还没有涉及到……

还是感谢你!!

使用特权

评论回复
7
tearsman520|  楼主 | 2009-8-26 21:52 | 只看该作者
补充,μC-OS的任务调度时间我已经从原来的5ms改成1ms了,结果还是不行……

还让不让人活了

使用特权

评论回复
8
tearsman520|  楼主 | 2009-8-26 21:52 | 只看该作者
3# arm4u

哎,我确信是我昏了……昏得问题都无法解决了……

使用特权

评论回复
9
tearsman520|  楼主 | 2009-8-26 21:57 | 只看该作者
5# auzxj

2440啊……μC-OS啊……

都做我老婆吧……乖一点啊……

今天七夕啊……囧   ORZ

使用特权

评论回复
10
auzxj| | 2009-8-26 21:59 | 只看该作者
maintask一直运行吗?是不是做了任务切换了

使用特权

评论回复
11
Asland| | 2009-8-26 22:04 | 只看该作者
10# auzxj

我晕死,一小时只能发5个帖,没办法,重新注册一个来!

现在跑的有且只有一个任务——MainTask,MainTask中有且只有一个while循环,

I/O翻转速度还是那么点……我囧晕了

使用特权

评论回复
12
auzxj| | 2009-8-26 22:11 | 只看该作者
11# Asland

把maintask任务和他的创建函数贴出来

使用特权

评论回复
13
auzxj| | 2009-8-26 22:12 | 只看该作者
ucos自己还有个空闲任务,呵呵,不会只有maintask的

使用特权

评论回复
14
Asland| | 2009-8-26 22:15 | 只看该作者
12# auzxj

稍等……马上贴出来!别离开……

使用特权

评论回复
15
Asland| | 2009-8-26 22:22 | 只看该作者
13# auzxj

鼠兄&有没有直接的联系方式,比如QQ啥的,在这里实在不方便……

这代码,是我同组的另外一个朋友写的,我让她加你~

使用特权

评论回复
16
samehere| | 2009-8-26 22:30 | 只看该作者
13# auzxj

你好,我又试验了一下。。。在创建MainTask之前(把所有跟OS都无关的东西都没设置)就来翻转那个IO口
结果还是500K的速度

是不是2440板的初始化跟IO口反转有关呢??

另外一套程序,是开发板的例程,初始化以后,再执行
#define nCS   (0x1<<8) //GPJ8
while(1)
{
          rGPJDAT ^= nCS;   
}
能达到2M

使用特权

评论回复
17
mpuhome| | 2009-8-27 09:16 | 只看该作者
要在中断里处理,并且将中断优先级设置为最高,比任务调度的中断高
这样中断就很实时了

我就是这么做的,不过我用FREERTOS

使用特权

评论回复
18
FDLock| | 2009-8-27 09:37 | 只看该作者
1. “是不是2440板的初始化跟IO口反转有关呢??”,  CPU的系统时钟初始化,总线配置,是会影响程序运行速度的。

2. 程序放在那里运行也很关键,放在内部SRAM(4KB)和放在外部NOR FLASH或SDRAM,运行速度会相差很大(因为各存储器的访问速度的差异)。

如果“开发板的例程”是在内部RAM调试运行,而μC-OS的程序是在外部SDRAM中调试运行,控制I/O翻转的速度会相差很大。

使用特权

评论回复
19
稆序匠人| | 2009-8-29 16:40 | 只看该作者
山寨版程序匠人帮顶!

使用特权

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

本版积分规则

4

主题

22

帖子

0

粉丝