Advertisement
Guest User

Untitled

a guest
Oct 10th, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. /*
  2.  
  3. ASM optimization strategy:
  4.  
  5. Chan A handler:
  6. Load r0 = a_i4, ip = a_i5, lr = a_i6, r1 = a_i7 - they will be in LS side halfwords.
  7. Get r0 = b_i0, ip = b_i1, lr = b_i2, r1 = b_i3 at the same time for free (in MS side halfwords.)
  8.  
  9. Zero MS side of r11.
  10. Sum halfword-wise r0+ip+lr+r1+r11, store in r11.
  11. sum(a_i0..7) is in LS side of r11
  12. sum(b_i0..3) is in MS side of r11.
  13.  
  14. zero extend LS side of r11 to r0, which will be int32_t i_avg.
  15.  
  16.  
  17. Chan B handler
  18. Load r0 = a_i0, ip = a_i1, lr = a_i2, r1 = a_i3 - they will be in LS side halfwords.
  19. Get r0 = b_i4, ip = b_i5, lr = b_i6, r1 = b_i7 at the same time for free (in MS side halfwords.)
  20.  
  21. Zero LS side of r11.
  22. Sum halfword-wise r0+ip+lr+r1+r11, store in r11.
  23. sum(a_i0..3) is in LS side of r11
  24. sum(b_i4..7) is in MS side of r11.
  25.  
  26. zero extend MS side of r11 to r0, which will be int32_t i_avg.
  27.  
  28. COMPILED WITH -ffixed-r11
  29.  
  30. */
  31.  
  32. void chan_a_loop_cha_handler()
  33. {
  34. int time = TIM2->CNT;
  35.  
  36. // Compiled with -Wno-strict-aliasing to suppress warnings:
  37. register uint32_t b0a4 asm("r0") = *((uint32_t*)&adc_data.a_i4);
  38. register uint32_t b1a5 asm("ip") = *((uint32_t*)&adc_data.a_i5);
  39. register uint32_t b2a6 asm("lr") = *((uint32_t*)&adc_data.a_i6);
  40. register int32_t i_avg asm("r0");
  41.  
  42. asm volatile
  43. ("bfc r11, #16, #16\n\t"
  44. "uadd16 r11, r11, r0\n\t"
  45. "uadd16 r11, r11, ip\n\t"
  46. "uadd16 r11, r11, lr"
  47. /* outputs: */ :
  48. /* inputs: */ : "r" (b0a4), "r" (b1a5), "r" (b2a6)
  49. /* clobbers: */ : );
  50.  
  51. register uint32_t b3a7 asm("r1") = *((uint32_t*)&adc_data.a_i7);
  52. asm volatile
  53. (
  54. "uadd16 r11, r11, r1\n\t"
  55. "uxth r0, r11"
  56. /* outputs: */ : "=r" (i_avg)
  57. /* inputs: */ : "r" (b3a7)
  58. /* clobbers: */ : );
  59.  
  60. i_avg -= chans[0].cm_corr_table[(((uint16_t)chans[0].last_vdir)&0b1111110000000000)>>10];
  61. avg_i_accum[0] += i_avg;
  62.  
  63. //unrelated stuff truncated
  64. }
  65.  
  66. void chan_b_loop_cha_handler()
  67. {
  68. int time = TIM2->CNT;
  69.  
  70. register uint32_t b4a0 asm("r0") = *((uint32_t*)&adc_data.a_i0);
  71. register uint32_t b5a1 asm("ip") = *((uint32_t*)&adc_data.a_i1);
  72. register uint32_t b6a2 asm("lr") = *((uint32_t*)&adc_data.a_i2);
  73. register int32_t i_avg asm("r0");
  74.  
  75. asm volatile
  76. ("bfc r11, #0, #16\n\t"
  77. "uadd16 r11, r11, r0\n\t"
  78. "uadd16 r11, r11, ip\n\t"
  79. "uadd16 r11, r11, lr"
  80. /* outputs: */ :
  81. /* inputs: */ : "r" (b4a0), "r" (b5a1), "r" (b6a2)
  82. /* clobbers: */ : );
  83.  
  84. register uint32_t b7a3 asm("r1") = *((uint32_t*)&adc_data.a_i3);
  85. asm volatile
  86. ("uadd16 r11, r11, r1\n\t"
  87. "uxth r0, r11, ROR #16"
  88. /* outputs: */ : "=r" (i_avg)
  89. /* inputs: */ : "r" (b7a3)
  90. /* clobbers: */ : );
  91.  
  92. i_avg -= chans[1].cm_corr_table[(((uint16_t)chans[1].last_vdir)&0b1111110000000000)>>10];
  93. avg_i_accum[1] += i_avg;
  94.  
  95. //unrelated stuff truncated
  96. }
  97.  
  98.  
  99. main()
  100. {
  101.  
  102. . . .
  103. ADC1_2->CCR = 1UL<<23 /*Temp sensor enable*/ | 0b01UL<<16 /*clk=HCLK*/ |
  104. 0b10UL<<14 /*Dual mode DMA*/ | 1UL<<13 /*Dual mode DMA circular*/ |
  105. 0b00110UL /*Regular simultaneous dual mode*/;
  106.  
  107. DMA1_Channel1->CPAR = (uint32_t)&(ADC1_2->CDR); // common 32-bit data register for dual-mode ADC
  108. DMA1_Channel1->CMAR = (uint32_t)(&adc_data);
  109. DMA1_Channel1->CNDTR = DMA_INITIAL_CNDTR;
  110. DMA1_Channel1->CCR = 0b11UL<<12 /*highest prio*/ | 0b10UL<<10 /*32b mem*/ | 0b10UL<<8 /*32b periph*/ |
  111. 1UL<<7 /*memory increment*/ | 1UL<<5 /*circular*/;
  112. . . .
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement