irq_latency_tc.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 irq latency
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include <utest.h>
  13. #include <utest_assert.h>
  14. #include <perf_tc.h>
  15. static rt_device_t hw_dev = RT_NULL;
  16. static rt_sem_t complete_sem = RT_NULL;
  17. static rt_hwtimerval_t timeout = {0};
  18. static rt_perf_t *perf_local = RT_NULL;
  19. static void modify_time(rt_perf_t *perf)
  20. {
  21. if(perf)
  22. perf->real_time = perf->real_time - perf->tmp_time;
  23. }
  24. static rt_err_t timer_callback(rt_device_t dev, rt_size_t size)
  25. {
  26. rt_perf_stop(perf_local);
  27. if (perf_local->count >= UTEST_SYS_PERF_TC_COUNT)
  28. {
  29. rt_sem_release(complete_sem);
  30. return RT_EOK;
  31. }
  32. rt_perf_start_impl(perf_local, &timeout);
  33. return RT_EOK;
  34. }
  35. rt_err_t rt_perf_irq_latency(rt_perf_t *perf)
  36. {
  37. # if __STDC_VERSION__ >= 199901L
  38. rt_strcpy(perf->name,__func__);
  39. #else
  40. rt_strcpy(perf->name,"rt_perf_irq_latency");
  41. #endif
  42. int ret = RT_EOK;
  43. rt_hwtimer_mode_t mode = HWTIMER_MODE_PERIOD;
  44. perf_local = perf;
  45. hw_dev = rt_device_find(UTEST_HWTIMER_DEV_NAME);
  46. if (hw_dev == RT_NULL)
  47. {
  48. ret = RT_ERROR;
  49. LOG_E("hwtimer sample run failed! can't find %s device!", UTEST_HWTIMER_DEV_NAME);
  50. return ret;
  51. }
  52. complete_sem = rt_sem_create("complete", 0, RT_IPC_FLAG_FIFO);
  53. timeout.sec = 0;
  54. timeout.usec = 50; /* No modification is necessary here, use the fixed value */
  55. rt_mutex_take(perf->lock,RT_WAITING_FOREVER);
  56. perf_local->tmp_time = (rt_uint32_t)(timeout.sec * 1000000u + timeout.usec);
  57. perf_local->local_modify = modify_time;
  58. rt_mutex_release(perf->lock);
  59. rt_device_set_rx_indicate(hw_dev, timer_callback);
  60. rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, (void *)&mode);
  61. rt_perf_start_impl(perf_local, &timeout);
  62. rt_sem_take(complete_sem, RT_WAITING_FOREVER);
  63. rt_perf_dump(perf_local);
  64. rt_sem_delete(complete_sem);
  65. rt_device_close(hw_dev);
  66. return RT_EOK;
  67. }