求助!这个功能怎么写完成的速度快
本帖最后由 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++;
}
}
移位改查表,快了
#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++;
}
} P03 = aiFlag & aiData;
// if (aiFlag & aiData)
// {
// P03 = 1;
// }
// else
// {
// P03 = 0;
// }
这样又快了,请高手帮忙看看,还有办法提速吗?
//都查表了,内存又那么大,直接来个大点的数组好了
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
}
#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不到了,还能快吗? 不管怎么运算,要想快,必须先把变量定义为data类型 xiangzichen 发表于 2024-5-20 00:44
aiData[]里的数据不固定,是变的,程序里只是举个粟子 lijun4545 发表于 2024-5-20 03:35
不管怎么运算,要想快,必须先把变量定义为data类型
变量名前加data,速度慢了120ns #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:19 编辑
Lkck8210 发表于 2024-5-20 09:34
感谢,CSAE语句有选择,我想会造成执行时间有长短,但是有一个思路,应该尝试指针
页:
[1]
2