打印

达不到要求!求高手!

[复制链接]
3007|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a868247|  楼主 | 2013-1-10 08:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 a868247 于 2013-1-11 10:40 编辑

#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_IDR_Addr (GPIOA_BASE+0x10) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+0x10) //0x40010808
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //"输入 "
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //"输入 "

uint32_t  AD_value1[]={0};
uint32_t  AD_value2[]={0};
uint32_t  AD_value3[]={0};


void EXTI9_5_IRQHandler(void)
{
  register uint32_t ans1,ans2,ans3;
  register uint32_t i;
  Spinum_flag++;
  ans1=0;
  ans2=0;
  ans3=0;
for(i=0;i<32;i++)
{
ans1<<=1;  
  ans2<<=1;
  ans3<<=1;
  GPIOB->BSRRL = GPIO_Pin_3;  //SCLK_HIGH;               
  ans1 += PBin(4);
  ans2 += PAin(11);   
  ans3 += PAin(12);   
  GPIOB->BSRRH = GPIO_Pin_3; //SCLK_LOW;
}
AD_value1[Spinum_flag]=ans1;
AD_value2[Spinum_flag]=ans2;
AD_value3[Spinum_flag]=ans3;

  EXTI->PR=EXTI_Line8;
  
  if(Spinum_flag==98)
  {
   Spinum_flag=0;
    EXTI->IMR &= 0Xfffffeff;  //屏蔽外部中断
  }
}
以前有贴过帖子问了些小细节,但还是达不到要求。我用的是低功耗系列,晶振最大32M,上面那个中断要求在7.5US完成。上面这个我测了要16US,差很多,能达到要求?能精简指令?上面的人让嵌入汇编,试下。但不会。求高手啊!

沙发
jifuele| | 2013-1-10 09:15 | 只看该作者
帮顶一下:victory:

使用特权

评论回复
板凳
hechnology| | 2013-1-10 09:28 | 只看该作者
1、看你的程序ans2,ans3没啥用,应该是下面吧
ans1 += PBin(4);
  ans2 += PAin(11);   
  ans3 += PAin(12);
2、循环展开也没用,32次循环,光循环里面的语句已经超过7.5周期了,肯定时间不够
如果算法非得这样的话,只能改方案了

使用特权

评论回复
地板
LDTEST| | 2013-1-10 09:44 | 只看该作者

EXTI_ClearITPendingBit(EXTI_Line8);   直接操作寄存器少个函数调用时间,而且省点操作时间

使用特权

评论回复
5
uet_cache| | 2013-1-10 09:51 | 只看该作者
你什么系统啊,为什么中断必须在7.5US内完成, 还是那个32位三个口读取非要在7.5US内完成。。。。你想想有没有别的办法解决你系统的要求。。。

使用特权

评论回复
6
rider1| | 2013-1-10 13:32 | 只看该作者
  static uint32_t ans1,ans2,ans3;
  static uint16_t i;

把static去掉,uint16_t改成uint32_t, static变量会分配到ram中,降低速度。

使用特权

评论回复
7
平常人| | 2013-1-10 15:34 | 只看该作者
ans1 += PBin(4);    <-- 不知道你的编译器是否能够正确地处理这样的宏操作,如果处理的好,这句话只产生一条汇编指令;否则会有很多条指令,肯定会浪费不少时间。看看反汇编码,确认编译器正确处理了宏。

还有,如果编译器支持的话,把static换成register,把这些局部变量显式地分配到寄存器中。

使用特权

评论回复
8
tonly0212| | 2013-1-10 16:30 | 只看该作者

使用特权

评论回复
9
a868247|  楼主 | 2013-1-11 08:55 | 只看该作者
hechnology 发表于 2013-1-10 09:28
1、看你的程序ans2,ans3没啥用,应该是下面吧
ans1 += PBin(4);
  ans2 += PAin(11);   

那C语言嵌入汇编能达到要求?

使用特权

评论回复
10
liaowei230509| | 2013-1-11 09:36 | 只看该作者
1、滥用static,按楼上的,去掉它,或者加上register
2、EXTI_ClearITPendingBit(EXTI_Line8); 改成寄存器操作
3、  ans1 += PBin(4);ans1 += PAin(11);   ans1 += PAin(12);   改成寄存器操作。还有,这里应该错了吧

使用特权

评论回复
11
a868247|  楼主 | 2013-1-11 11:44 | 只看该作者
//  AD_value1[Spinum_flag]=ans1;
// AD_value2[Spinum_flag]=ans2;
// AD_value3[Spinum_flag]=ans3;
已按各位说的改了!试了下,没加上面几个赋值就5.5US左右,加了就要15US左右,为什么呢!


使用特权

评论回复
12
平常人| | 2013-1-11 12:01 | 只看该作者
一般来说下标操作都是很花时间的。

使用特权

评论回复
13
liaowei230509| | 2013-1-11 12:34 | 只看该作者
a868247 发表于 2013-1-11 11:44
//  AD_value1[Spinum_flag]=ans1;
// AD_value2[Spinum_flag]=ans2;
// AD_value3[Spinum_flag]=ans3;

并不是你这三句耗时间的,你没有这三句,编译器把ans1、ans2和ans3给优化掉了,包括 PBin,PAin,当然快了。建议你把PBin和PAin这两条优化以下看看

使用特权

评论回复
14
a868247|  楼主 | 2013-1-11 13:52 | 只看该作者
liaowei230509 发表于 2013-1-11 12:34
并不是你这三句耗时间的,你没有这三句,编译器把ans1、ans2和ans3给优化掉了,包括 PBin,PAin,当然快了 ...

如何优化呢!

使用特权

评论回复
15
rider1| | 2013-1-11 15:08 | 只看该作者
把编译完的汇编文件贴出来看有没有优化余地

使用特权

评论回复
16
a868247|  楼主 | 2013-1-14 17:29 | 只看该作者
本帖最后由 a868247 于 2013-1-15 08:52 编辑

   133:   ans1<<=1;
   134:   ans2<<=1;  
   135:   ans3<<=1;   
0x08000420 F8DFA3F4  LDR.W    r10,[pc,#1012]  ; @0x08000818
   136:   GPIOB->BSRRL = GPIO_Pin_3;  //SCLK_HIGH;                 
0x08000424 4AFD      LDR      r2,[pc,#1012]  ; @0x0800081C
0x08000426 F89A1000  LDRB     r1,[r10,#0x00]
0x0800042A 1C49      ADDS     r1,r1,#1
0x0800042C B2CD      UXTB     r5,r1
0x0800042E F88A5000  STRB     r5,[r10,#0x00]
0x08000432 2008      MOVS     r0,#0x08
0x08000434 8010      STRH     r0,[r2,#0x00]
0x08000436 4BFA      LDR      r3,[pc,#1000]  ; @0x08000820
   137:   ans1 += *((volatile unsigned long *)(0x42408210));  
0x08000438 681E      LDR      r6,[r3,#0x00]
0x0800043A 49FA      LDR      r1,[pc,#1000]  ; @0x08000824
   138:   ans2 += *((volatile unsigned long *)(0x4240022c));      
0x0800043C 680F      LDR      r7,[r1,#0x00]
   139:   ans3 += *((volatile unsigned long *)(0x42400230));   
0x0800043E F8D1C004  LDR      r12,[r1,#0x04]
   140:   GPIOB->BSRRH = GPIO_Pin_3; //SCLK_LOW;  
   141:  
   142:   ans1<<=1;
   143:   ans2<<=1;  
   144:   ans3<<=1;   
0x08000442 F1020402  ADD      r4,r2,#0x02
0x08000446 8020      STRH     r0,[r4,#0x00]
   145:   GPIOB->BSRRL = GPIO_Pin_3;  //SCLK_HIGH;                 
0x08000448 8010      STRH     r0,[r2,#0x00]
   146:   ans1 += *((volatile unsigned long *)(0x42408210));  
0x0800044A F8D38000  LDR      r8,[r3,#0x00]
0x0800044E EB080946  ADD      r9,r8,r6,LSL #1
   147:   ans2 += *((volatile unsigned long *)(0x4240022c));      
0x08000452 680E      LDR      r6,[r1,#0x00]
0x08000454 EB060747  ADD      r7,r6,r7,LSL #1
   148:   ans3 += *((volatile unsigned long *)(0x42400230));   
0x08000458 684E      LDR      r6,[r1,#0x04]
   149:   GPIOB->BSRRH = GPIO_Pin_3; //SCLK_LOW;  
   150:  
   151:   ans1<<=1;
   152:   ans2<<=1;  
0x0800045A 8020      STRH     r0,[r4,#0x00]
0x0800045C EB06084C  ADD      r8,r6,r12,LSL #1
   153:   ans3<<=1;   
0x08000460 EA4F0648  LSL      r6,r8,#1
   154:   GPIOB->BSRRL = GPIO_Pin_3;  //SCLK_HIGH;                 
0x08000464 8010      STRH     r0,[r2,#0x00]
   155:   ans1 += *((volatile unsigned long *)(0x42408210));  
0x08000466 F8D38000  LDR      r8,[r3,#0x00]
   156:   ans2 += *((volatile unsigned long *)(0x4240022c));      
0x0800046A F8D1C000  LDR      r12,[r1,#0x00]
0x0800046E EB080849  ADD      r8,r8,r9,LSL #1
0x08000472 EB0C0C47  ADD      r12,r12,r7,LSL #1
   157:   ans3 += *((volatile unsigned long *)(0x42400230));   
0x08000476 684F      LDR      r7,[r1,#0x04]
   158:   GPIOB->BSRRH = GPIO_Pin_3; //SCLK_LOW;  
   159:  
感觉汇编好怪啊!我for里面32个都是是展开的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

97

帖子

1

粉丝