回Computer00,您提到的那篇**在博客的哪一页,没找到.

[复制链接]
8322|40
wangkj 发表于 2009-3-30 14:48 | 显示全部楼层

热肠的脑袋还在单片机转呢

过两年就转过来了。<br />原来,只有1两银子,现在有一屋子的金子,不知道咋用。
 楼主| 古道热肠 发表于 2009-3-30 16:50 | 显示全部楼层

22楼的说得很好,很在理,鼓掌

也很有指导性.
wangkj 发表于 2009-3-30 18:21 | 显示全部楼层

俺的群共享有硬件spi的例子,香肠自己找找吧。

  
avocationA 发表于 2009-3-30 22:33 | 显示全部楼层

平时调程序多用VC,???????

VC&nbsp;是啥东西啊?
alex74 发表于 2009-3-31 08:40 | 显示全部楼层

Visual&nbsp;C++,&nbsp;呵呵
goosen 发表于 2009-4-2 12:56 | 显示全部楼层

re

1)uchar&nbsp;ucCount&nbsp;-&gt&nbsp;uint&nbsp;ucCount<br />2)&nbsp;for循环适当展开。
 楼主| 古道热肠 发表于 2009-4-2 17:29 | 显示全部楼层

哈哈,难道32位变量体做的循环控制直比8位的快?

楼上网友的这建议,俺再来仿真验证验证,如的确可行,在ARM平台上那就改变习惯,尽量用32位数做循环变量了.
computer00 发表于 2009-4-2 17:35 | 显示全部楼层

临时变量尽量用32位的,这个你可以参考俺blog有篇**分析

  
 楼主| 古道热肠 发表于 2009-4-3 12:02 | 显示全部楼层

用软件仿真调试了一下,没有改进速度.

对单字节无符号数与字的操作完全用的一样的指令.变量长度够用的原则对低档单片机较为适用.
 楼主| 古道热肠 发表于 2009-4-3 12:12 | 显示全部楼层

回Computer00,您提到的那篇**在博客的哪一页,没找到.

  
computer00 发表于 2009-4-3 12:16 | 显示全部楼层

这里:

<a href="http://blog.**/computer00/20132/message.aspx" target=_blank>http://blog.**/computer00/20132/message.aspx</a><br /><br /><br />看看编译后的汇编代码就清楚了。
三块石头 发表于 2009-4-3 15:06 | 显示全部楼层

古道

如果32位机循环还用8位变量来计数的话,反而慢<br />因为编译器会在自增后,把多余的高24位mask掉,“与”出一个8位结果来给你;而32位变量自增一条指令就完成了
 楼主| 古道热肠 发表于 2009-4-3 17:16 | 显示全部楼层

俺用的那MDK3.2版,经过三级优化,测试的结果速度是一样的.

经过优化,MDK把8位无符号变量直接用一32位寄存器来装载,并初始化成无符号字节的初始值,代码如下.<br /><br />0x00100244&nbsp;&nbsp;E3A00000&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,#0x00000000<br />0x00100248&nbsp;&nbsp;E583C030&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R12,[R3,#0x0030]<br />&nbsp;&nbsp;&nbsp;&nbsp;33:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(ucCount=8;&nbsp;ucCount;&nbsp;--ucCount)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;34:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />0x0010024C&nbsp;&nbsp;E3A01008&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,#0x00000008<br />&nbsp;&nbsp;&nbsp;&nbsp;35:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucReadData&nbsp;&lt&lt=&nbsp;1;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;36:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;37:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Macro_Set_CLK_Low();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;38:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Macro_Set_CLK_High();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;39:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;40:&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(GetSDCard_SO_Value())&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;41:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(AT91F_PIO_GetInput(&nbsp;AT91C_BASE_PIOA)&nbsp;&&nbsp;SD_SO)&nbsp;&nbsp;//内联函数,无调用开销&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;42:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;43:&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucReadData&nbsp;|=&nbsp;0x01;&nbsp;<br />0x00100250&nbsp;&nbsp;E1A00C80&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,R0,LSL&nbsp;#25<br />0x00100254&nbsp;&nbsp;E1A00C20&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,R0,LSR&nbsp;#24<br />0x00100258&nbsp;&nbsp;E5834034&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R4,[R3,#0x0034]<br />0x0010025C&nbsp;&nbsp;E5834030&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R4,[R3,#0x0030]<br />&nbsp;&nbsp;&nbsp;586:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pPio-&gtPIO_PDSR;&nbsp;<br />0x00100260&nbsp;&nbsp;E593203C&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,[R3,#0x003C]<br />&nbsp;&nbsp;&nbsp;&nbsp;44:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucReadData++;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;45:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;46:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;47:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(ucReadData);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;48:&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;49:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;50:&nbsp;void&nbsp;&nbsp;VS1003B_SPIPutChar(unsigned&nbsp;char&nbsp;ucSendData)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;51:&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;52:&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;S0SPDR&nbsp;=&nbsp;c;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;53:&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;while((S0SPSR&nbsp;&&nbsp;0x80)&nbsp;==&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待SPI将数据发送完毕&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;54:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;register&nbsp;ucCount;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;55:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;register&nbsp;ucMaskCode;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;56:&nbsp;&nbsp;<br />0x00100264&nbsp;&nbsp;E2411001&nbsp;&nbsp;SUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R1,#0x00000001<br />&nbsp;&nbsp;&nbsp;&nbsp;41:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(AT91F_PIO_GetInput(&nbsp;AT91C_BASE_PIOA)&nbsp;&&nbsp;SD_SO)&nbsp;&nbsp;//内联函数,无调用开销&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;42:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;43:&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucReadData&nbsp;|=&nbsp;0x01;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;44:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucReadData++;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;45:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;46:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;47:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(ucReadData);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;48:&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;49:&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;50:&nbsp;void&nbsp;&nbsp;VS1003B_SPIPutChar(unsigned&nbsp;char&nbsp;ucSendData)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;51:&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;52:&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;S0SPDR&nbsp;=&nbsp;c;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;53:&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;while((S0SPSR&nbsp;&&nbsp;0x80)&nbsp;==&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待SPI将数据发送完毕&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;54:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;register&nbsp;ucCount;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;55:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;register&nbsp;ucMaskCode;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;56:&nbsp;&nbsp;<br />0x00100268&nbsp;&nbsp;E3120A01&nbsp;&nbsp;TST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,#0x00001000<br />0x0010026C&nbsp;&nbsp;12800001&nbsp;&nbsp;ADDNE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,R0,#0x00000001<br />0x00100270&nbsp;&nbsp;120000FF&nbsp;&nbsp;ANDNE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,R0,#0x000000FF<br />0x00100274&nbsp;&nbsp;E21110FF&nbsp;&nbsp;ANDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R1,#0x000000FF<br />0x00100278&nbsp;&nbsp;1AFFFFF4&nbsp;&nbsp;BNE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00100250<br />&nbsp;&nbsp;&nbsp;&nbsp;57:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucMaskCode&nbsp;=&nbsp;0x80;&nbsp;<br /><br />说明:&nbsp;R1为uCount;<br />执行ucCount--的汇编语句为:<br />SUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R1,#0x00000001<br />执行检查循环终止条件是否为0并退出的语句为<br />ANDS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R1,#0x000000FF<br />BNE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00100250<br /><br /><br />
guet 发表于 2009-4-4 15:52 | 显示全部楼层

re

我在UCOS里几个任务,放320KPB/S的MP3,播放任务还可以挂起30ms不卡
 楼主| 古道热肠 发表于 2009-4-5 10:19 | 显示全部楼层

楼上的说说详细点听听,用的什么平台.挂起30mS,有些不可信.

320Kbps,要求数据流是40K字节/s,每毫秒40个字节.30ms是1200个字节,VS1003B总共只有32字节缓冲,怎么来得及缓冲.
computer00 发表于 2009-4-5 10:28 | 显示全部楼层

估计人家用的硬件SPI和硬件DMA啊,这个可差得N远了。

  
goosen 发表于 2009-4-5 11:53 | 显示全部楼层

re

可以试下把for循环展开<br /><br />至于具体细节,可以参考《ARM嵌入式系统开发—软件设计与优化》(沈建华译,北航出版社)的第五章:高效的C编程。那介绍比较详细。<br />
 楼主| 古道热肠 发表于 2009-4-5 12:06 | 显示全部楼层

哈哈,除非DMA,硬件SPI理论上是不可能的

俺在37楼计算时,已经把送数据的时间按0计算了.DMA+SPI那是无敌的,等于请了个不吃饭光干活的工人,发现VS1003B没数据了,自己去SRAM中找数据,把VS1003B喂饱.只有SRAM中的数据用完了,才通知MCU,运一车过来.慢慢用.
 楼主| 古道热肠 发表于 2009-4-5 12:10 | 显示全部楼层

哈哈,俺有空时去看看北航译的那本书,不会For循环展开

只会使用不带循环的写法,循环多少次,俺就把循环代码体Ctrl+V多少次,估计效率是高,但代码长度也高.
guet 发表于 2009-4-5 16:54 | 显示全部楼层

楼上的说说详细点听听,用的什么平台.挂起30mS,有些不可信

用NXP的LPC2148,都是用硬件SPI模式,没有DMA,VS1003B并不止32字节缓冲,你没有好好看英文手册,实际上1003内部的5K&nbsp;RAM都可以做缓冲,这才是关键。<br />我的播放任务确实挂起30ms才去给VS1003送数,320K的MP3播放流畅。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
0