找回密码
 立即注册
查看: 655|回复: 11

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

919

积分

高级会员

积分
919
发表于 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[iByte]))
                {
                        P03 = 1;
                }
                else
                {
                        P03 = 0;
                }
                P01 = 1;
                iIndex++;
               
        }
        
}

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

919

积分

高级会员

积分
919
发表于 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[iBit] & aiData[iByte])
                {
                        P03 = 1;
                }
                else
                {
                        P03 = 0;
                }
                P01 = 1;
                iIndex++;
               
        }
       
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

919

积分

高级会员

积分
919
发表于 2024-5-19 22:19:39 | 显示全部楼层
                P03 = aiFlag[iBit] & aiData[iByte];
//                if (aiFlag[iBit] & aiData[iByte])
//                {
//                        P03 = 1;
//                }
//                else
//                {
//                        P03 = 0;
//                }
这样又快了,请高手帮忙看看,还有办法提速吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:340
  • 最近打卡:2025-05-06 19:09:22
已绑定手机

14

主题

600

回帖

2215

积分

荣誉版主

积分
2215
发表于 2024-5-20 00:44:47 | 显示全部楼层
  1. //都查表了,内存又那么大,直接来个大点的数组好了
  2. aiData[]={
  3.     0,0,0,0,0,0,0,1,//0x01
  4.     0,0,0,0,0,0,1,1,//0x03
  5.     0,0,0,0,0,1,1,1,//0x07
  6.     0,0,0,0,1,1,1,1,//0x0f
  7.     //0x1f
  8.     //0x3f
  9.     //0x7f
  10.     //0xff
  11. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

919

积分

高级会员

积分
919
发表于 2024-5-20 00:46:03 | 显示全部楼层
#include <STC32G.H>

volatile unsigned char aiData[] = {0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF};
//bit abtData[8];
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[iBit] & aiData[iByte];
//                if (aiFlag[iBit] & aiData[iByte])
//                {
//                        P03 = 1;
//                }
//                else
//                {
//                        P03 = 0;
//                }
                P01 = 1;
                iIndex++;
               
        }
       
}
换成int型,用移位代替除法,用与取代取余,目前速度最快,1us不到了,还能快吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-29 08:51:26

4

主题

75

回帖

877

积分

荣誉版主

积分
877
发表于 2024-5-20 03:35:02 | 显示全部楼层
不管怎么运算,要想快,必须先把变量定义为data类型
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

919

积分

高级会员

积分
919
发表于 2024-5-20 06:16:12 | 显示全部楼层

aiData[]里的数据不固定,是变的,程序里只是举个粟子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

919

积分

高级会员

积分
919
发表于 2024-5-20 06:21:49 | 显示全部楼层
lijun*** 发表于 2024-5-20 03:35
不管怎么运算,要想快,必须先把变量定义为data类型

变量名前加data,速度慢了120ns
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-5-20 09:34:46 | 显示全部楼层
  1. #include <STC32G.H>
  2. volatile unsigned char aiData[] = {0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,0xFF};
  3. volatile unsigned char iIndex;
  4. volatile unsigned char iIndexa;
  5. volatile unsigned char edata iByte;
  6. volatile unsigned char iBit;
  7. sbit iByte0 = iByte^0;
  8. sbit iByte1 = iByte^1;
  9. sbit iByte2 = iByte^2;
  10. sbit iByte3 = iByte^3;
  11. sbit iByte4 = iByte^4;
  12. sbit iByte5 = iByte^5;
  13. sbit iByte6 = iByte^6;
  14. sbit iByte7 = iByte^7;
  15. void main()
  16. {
  17.         WTST = 0;
  18.         EAXFR = 1;
  19.         CKCON = 0;
  20.         
  21.         P0M1 = 0xF0;
  22.         P0M0 = 0x00;        
  23.         EA = 0;
  24.         
  25.         iIndex = 0;
  26.         
  27.         while (1)
  28.         {
  29.                 if (iIndex > 63)
  30.                 {
  31.                         iIndex = 0;
  32.                         P03 = 0;
  33.                 }
  34.                 P01 = 0;
  35.                 iIndexa = 63 - iIndex;
  36.                 iByte = iIndexa >> 4;
  37.                 iBit = iIndexa & 0x0F;
  38.                                 switch(iBit)
  39.                                 {
  40.                                         case 0:P03=iByte0;break;
  41.                                         case 1:P03=iByte1;break;
  42.                                         case 2:P03=iByte2;break;
  43.                                         case 3:P03=iByte3;break;
  44.                                         case 4:P03=iByte4;break;
  45.                                         case 5:P03=iByte5;break;
  46.                                         case 6:P03=iByte6;break;
  47.                                         case 7:P03=iByte7;break;
  48.                                 }
  49.                 P01 = 1;
  50.                 iIndex++;
  51.                
  52.         }
  53.         
  54. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-01-10 20:43:38

11

主题

58

回帖

919

积分

高级会员

积分
919
发表于 2024-5-20 13:00:10 | 显示全部楼层
本帖最后由 microEC 于 2024-5-20 13:19 编辑

感谢,CSAE语句有选择,我想会造成执行时间有长短,但是有一个思路,应该尝试指针
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 11:56 , Processed in 0.159326 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表