钻石会员
主题
回帖0
积分10948
阅读权限50
注册时间2012-3-28
最后登录1970-1-1
在线时间 小时
|
本帖最后由 jimmy_xt 于 2013-12-13 21:15 编辑
嗯,那么看来我原来的程序没必要改了。(不对应该是我优化的程序,这个转换程序的框架是用别人的。)
我用最传统的方式,就是算出来就发的方式,扫描一个栅平均需要49us(测试结果)。
我专门反汇编了生成的程序,大概算了一下,每生成一个需要发送的字节,消耗的时钟周期最长28个,最短20个,加上各种控制,最后计算出也是约49us。
这是其中生成某个byte数据的汇编程序,需要23个时钟周期完成(这里sbrc按可能消耗的最长时间即3周期计算)- 14e6: 08 81 ld r16, Y
- 14e8: 02 fb bst r16, 2
- 14ea: 11 27 eor r17, r17
- 14ec: 10 f9 bld r17, 0
- 14ee: fc 90 ld r15, X
- 14f0: f3 fc sbrc r15, 3
- 14f2: 14 60 ori r17, 0x04 ; 4
- 14f4: f5 01 movw r30, r10
- 14f6: f0 80 ld r15, Z
- 14f8: f3 fc sbrc r15, 3
- 14fa: 10 61 ori r17, 0x10 ; 16
- 14fc: 03 fd sbrc r16, 3
- 14fe: 10 64 ori r17, 0x40 ; 64
- 1500: 1f b9 out 0x0f, r17 ; 15
复制代码- tmp = 0;
- if((a_buf[i][base_a + 2] & 0x04) == 0x04)
- {
- tmp = 0x01;
- }
- if((a_buf[i][base_a + 0] & 0x08) == 0x08)
- {
- tmp |= 0x04;
- }
- if((a_buf[i][base_a + 1] & 0x08) == 0x08)
- {
- tmp |= 0x10;
- }
- if((a_buf[i][base_a + 2] & 0x08) == 0x08)
- {
- tmp |= 0x40;
- spi_send_byte(tmp);
复制代码 下面是对应的C语言程序。代码太长没必要全贴出,仅仅举例。
还是LZ的方式更加节省时间,读取6个字节,并把它们分离成8个所用的计算量肯定比这样小得多。
|
|