| 
钻石会员 主题
回帖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
下面是对应的C语言程序。代码太长没必要全贴出,仅仅举例。复制代码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);
 还是LZ的方式更加节省时间,读取6个字节,并把它们分离成8个所用的计算量肯定比这样小得多。
 
 
 
 | 
 |