context_switch_tc.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * Copyright (c) 2006-2025, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2025-07-03 rcitach test case for context_switch
  9. */
  10. #include <rtthread.h>
  11. #include <rthw.h>
  12. #include <rtdevice.h>
  13. #include <utest.h>
  14. #include <utest_assert.h>
  15. #include <perf_tc.h>
  16. static rt_sem_t sem1, sem2;
  17. static rt_sem_t complete_sem = RT_NULL;
  18. static void local_modify_time(rt_perf_t *perf)
  19. {
  20. if(perf)
  21. perf->real_time = perf->real_time - perf->tmp_time;
  22. }
  23. static void perf_thread_event1(void *parameter)
  24. {
  25. while (1)
  26. {
  27. rt_sem_take(sem1, RT_WAITING_FOREVER);
  28. rt_sem_release(sem2);
  29. }
  30. }
  31. static void perf_thread_event2(void *parameter)
  32. {
  33. rt_perf_t *perf = (rt_perf_t *)parameter;
  34. for (rt_uint32_t i = 0; i < UTEST_SYS_PERF_TC_COUNT; i++)
  35. {
  36. perf->tmp_time = 0;
  37. rt_perf_start(perf);
  38. rt_sem_take(sem2, RT_WAITING_FOREVER);
  39. rt_sem_release(sem2);
  40. rt_perf_stop(perf);
  41. rt_mutex_take(perf->lock,RT_WAITING_FOREVER);
  42. perf->count -= 1;
  43. perf->tmp_time = perf->real_time;
  44. rt_mutex_release(perf->lock);
  45. rt_perf_start(perf);
  46. rt_sem_take(sem2, RT_WAITING_FOREVER);
  47. rt_sem_release(sem1);
  48. rt_perf_stop(perf);
  49. }
  50. rt_sem_release(complete_sem);
  51. }
  52. rt_err_t context_switch_test(rt_perf_t *perf)
  53. {
  54. rt_thread_t thread1 = RT_NULL;
  55. rt_thread_t thread2 = RT_NULL;
  56. # if __STDC_VERSION__ >= 199901L
  57. rt_strcpy(perf->name,__func__);
  58. #else
  59. rt_strcpy(perf->name,"context_switch_test");
  60. #endif
  61. perf->local_modify = local_modify_time;
  62. sem1 = rt_sem_create("sem1", 1, RT_IPC_FLAG_FIFO);
  63. sem2 = rt_sem_create("sem2", 0, RT_IPC_FLAG_FIFO);
  64. complete_sem = rt_sem_create("complete_sem", 0, RT_IPC_FLAG_FIFO);
  65. thread1 = rt_thread_create("perf_thread_event1", perf_thread_event1, perf,
  66. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  67. if (thread1 == RT_NULL)
  68. {
  69. LOG_E("perf_thread_event1 create failed.");
  70. return -RT_ERROR;
  71. }
  72. thread2 = rt_thread_create("perf_thread_event2", perf_thread_event2, perf,
  73. THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE);
  74. if (thread2 == RT_NULL)
  75. {
  76. LOG_E("perf_thread_event2 create failed.");
  77. return -RT_ERROR;
  78. }
  79. rt_thread_startup(thread1);
  80. rt_thread_startup(thread2);
  81. rt_sem_take(complete_sem, RT_WAITING_FOREVER);
  82. rt_perf_dump(perf);
  83. rt_thread_delete(thread1);
  84. rt_sem_delete(complete_sem);
  85. rt_sem_delete(sem1);
  86. rt_sem_delete(sem2);
  87. return RT_EOK;
  88. }