Advertisement
petrdynin

Static_branch_prediction_CH32V003

Feb 26th, 2025
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.68 KB | None | 0 0
  1. #define ARRAY_SIZE 256
  2.  
  3. volatile uint32_t time_unsorted;
  4. volatile uint32_t time_sorted;
  5.  
  6. volatile uint32_t start_time, end_time;
  7.  
  8. volatile uint16_t sorted_array[ARRAY_SIZE];
  9. volatile uint16_t unsorted_array[ARRAY_SIZE];
  10. volatile uint32_t cnt_tick;
  11.  
  12.  
  13. volatile uint32_t dummy = 0; // Переменная для предотвращения оптимизации
  14.  
  15. void SysTick_Init(void){
  16.    SysTick->SR = 0;
  17.    SysTick->CNT = 0;
  18.    SysTick->CTLR = 5;
  19. }
  20.  
  21. static uint32_t random_seed = 123456789;
  22.  
  23. uint32_t rand_xorshift() {
  24.     random_seed ^= random_seed << 13;
  25.     random_seed ^= random_seed >> 17;
  26.     random_seed ^= random_seed << 5;
  27.     return random_seed;
  28. }
  29.  
  30. uint32_t measure_time(volatile uint16_t *array) {
  31.  
  32.    start_time = SysTick->CNT;
  33.  
  34.    for (uint32_t i = 0; i < ARRAY_SIZE; i++) {
  35.        //if (array[i] > ARRAY_SIZE/2) {  // 0x2512 - время
  36.        if (array[i] > 2 ) {            // 0x260f - время
  37.        //if (array[i] > ARRAY_SIZE-2){     // 0x2416 - время "Always Not Taken" !!!!!
  38.                                          //"Always Not Taken" можно перевести на русский как "Всегда не выполняется"
  39.             dummy++;
  40.         } else {
  41.             dummy--;
  42.         }
  43.     }
  44.  
  45.     end_time = SysTick->CNT;
  46.  
  47.     return end_time - start_time;
  48. }
  49.  
  50. int main() {
  51.  
  52.    SysTick_Init();
  53.  
  54.    for (uint32_t i = 0; i < ARRAY_SIZE; i++) {
  55.         sorted_array[i] = i;
  56.         unsorted_array[i] = (uint16_t)rand_xorshift();
  57.        }
  58.  
  59.    while (1){
  60.       time_sorted   = measure_time(sorted_array);
  61.       time_unsorted = measure_time(unsorted_array);
  62.       cnt_tick = SysTick->CNT;
  63.       asm("nop");
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement