microEC 发表于 2024-5-19 21:55:57

求助!这个功能怎么写完成的速度快

本帖最后由 microEC 于 2024-5-19 21:57 编辑

我想完成这样的功能,
在一个数组中,根据index的值,取出相应位的值输出到管脚。我写了一段程序,根据iIndex的值,读取aiData[]中的某个位输出到P03,
用逻辑分析仪测量P01信号,从取数据到输出大约要2.5us,STC32G@33.1776M。
请高手指导,有没有办法更快一些。



#include <STC32G.H>

volatile unsigned char aiData[] = {0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF};
volatile unsigned char iIndex;
volatile unsigned char iIndexa;
volatile unsigned char iByte;
volatile unsigned char iBit;

void main()
{
      WTST = 0;
      EAXFR = 1;
      CKCON = 0;
      
      P0M1 = 0xF0;
      P0M0 = 0x00;      

      EA = 0;
      
      iIndex = 0;
      
      while (1)
      {
                if (iIndex > 63)
                {
                        iIndex = 0;
                        P03 = 0;
                }
                P01 = 0;
                iIndexa = 63 - iIndex;
                iByte = iIndexa / 8;
                iBit = iIndexa % 8;
                if ((1<<(iBit)) & (aiData))
                {
                        P03 = 1;
                }
                else
                {
                        P03 = 0;
                }
                P01 = 1;
                iIndex++;
               
      }
      
}

microEC 发表于 2024-5-19 22:10:42

移位改查表,快了
#include <STC32G.H>

volatile unsigned char aiData[] = {0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF};
volatile unsigned char aiFlag[] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
volatile unsigned char iIndex;
volatile unsigned char iIndexa;
volatile unsigned char iByte;
volatile unsigned char iBit;

void main()
{
        WTST = 0;
        EAXFR = 1;
        CKCON = 0;
       
        P0M1 = 0xF0;
        P0M0 = 0x00;       

        EA = 0;
       
        iIndex = 0;
       
        while (1)
        {
                if (iIndex > 63)
                {
                        iIndex = 0;
                        P03 = 0;
                }
                P01 = 0;
                iIndexa = 63 - iIndex;
                iByte = iIndexa / 8;
                iBit = iIndexa % 8;
                if (aiFlag & aiData)
                {
                        P03 = 1;
                }
                else
                {
                        P03 = 0;
                }
                P01 = 1;
                iIndex++;
               
        }
       
}

microEC 发表于 2024-5-19 22:19:39

                P03 = aiFlag & aiData;
//                if (aiFlag & aiData)
//                {
//                        P03 = 1;
//                }
//                else
//                {
//                        P03 = 0;
//                }
这样又快了,请高手帮忙看看,还有办法提速吗?

xiangzichen 发表于 2024-5-20 00:44:47

//都查表了,内存又那么大,直接来个大点的数组好了

aiData[]={
    0,0,0,0,0,0,0,1,//0x01
    0,0,0,0,0,0,1,1,//0x03
    0,0,0,0,0,1,1,1,//0x07
    0,0,0,0,1,1,1,1,//0x0f
    //0x1f
    //0x3f
    //0x7f
    //0xff
}

microEC 发表于 2024-5-20 00:46:03

#include <STC32G.H>

volatile unsigned char aiData[] = {0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF};
//bit abtData;
volatile unsigned char aiFlag[] = {0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
volatile unsigned int iIndex;
volatile unsigned int iIndexa;
volatile unsigned int iByte;
volatile unsigned int iBit;

void main()
{
        WTST = 0;
        EAXFR = 1;
        CKCON = 0;
       
        P0M1 = 0xF0;
        P0M0 = 0x00;       

        EA = 0;
       
        iIndex = 0;
       
        while (1)
        {
                if (iIndex > 63)
                {
                        iIndex = 0;
                        P03 = 0;
                }
                P01 = 0;
                iIndexa = 63 - iIndex;
                iByte = iIndexa >> 3;
                iBit = iIndexa & 0x7;
                P03 = aiFlag & aiData;
//                if (aiFlag & aiData)
//                {
//                        P03 = 1;
//                }
//                else
//                {
//                        P03 = 0;
//                }
                P01 = 1;
                iIndex++;
               
        }
       
}
换成int型,用移位代替除法,用与取代取余,目前速度最快,1us不到了,还能快吗?

lijun4545 发表于 2024-5-20 03:35:02

不管怎么运算,要想快,必须先把变量定义为data类型

microEC 发表于 2024-5-20 06:16:12

xiangzichen 发表于 2024-5-20 00:44


aiData[]里的数据不固定,是变的,程序里只是举个粟子

microEC 发表于 2024-5-20 06:21:49

lijun4545 发表于 2024-5-20 03:35
不管怎么运算,要想快,必须先把变量定义为data类型

变量名前加data,速度慢了120ns

Lkck8210 发表于 2024-5-20 09:34:46

#include <STC32G.H>

volatile unsigned char aiData[] = {0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF};
volatile unsigned char iIndex;
volatile unsigned char iIndexa;
volatile unsigned char edata iByte;
volatile unsigned char iBit;
sbit iByte0 = iByte^0;
sbit iByte1 = iByte^1;
sbit iByte2 = iByte^2;
sbit iByte3 = iByte^3;
sbit iByte4 = iByte^4;
sbit iByte5 = iByte^5;
sbit iByte6 = iByte^6;
sbit iByte7 = iByte^7;

void main()
{
      WTST = 0;
      EAXFR = 1;
      CKCON = 0;
      
      P0M1 = 0xF0;
      P0M0 = 0x00;      

      EA = 0;
      
      iIndex = 0;
      
      while (1)
      {
                if (iIndex > 63)
                {
                        iIndex = 0;
                        P03 = 0;
                }
                P01 = 0;
                iIndexa = 63 - iIndex;
                iByte = iIndexa >> 4;
                iBit = iIndexa & 0x0F;
                                switch(iBit)
                                {
                                        case 0:P03=iByte0;break;
                                        case 1:P03=iByte1;break;
                                        case 2:P03=iByte2;break;
                                        case 3:P03=iByte3;break;
                                        case 4:P03=iByte4;break;
                                        case 5:P03=iByte5;break;
                                        case 6:P03=iByte6;break;
                                        case 7:P03=iByte7;break;
                                }
                P01 = 1;
                iIndex++;
               
      }
      
}

microEC 发表于 2024-5-20 13:00:10

本帖最后由 microEC 于 2024-5-20 13:19 编辑

Lkck8210 发表于 2024-5-20 09:34

感谢,CSAE语句有选择,我想会造成执行时间有长短,但是有一个思路,应该尝试指针
页: [1] 2
查看完整版本: 求助!这个功能怎么写完成的速度快