hwsem_counter.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /**************************************************************************//**
  2. *
  3. * @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2022-10-5 Wayne First version
  10. *
  11. ******************************************************************************/
  12. #include <rtthread.h>
  13. #if defined(BSP_USING_HWSEM)
  14. #include "drv_common.h"
  15. #include "drv_hwsem.h"
  16. #define DEF_COUNTER_ADDR_RTP (3*1024*1024)
  17. #define DEF_COUNTER_ADDR_A35 ((0x80000000+DEF_COUNTER_ADDR_RTP)|UNCACHEABLE)
  18. #if defined(USE_MA35D1_SUBM)
  19. #define DEF_COUNTER_ADDR DEF_COUNTER_ADDR_RTP
  20. #else
  21. #define DEF_COUNTER_ADDR DEF_COUNTER_ADDR_A35
  22. #endif
  23. static void hwsem_counter_go(void *parameter)
  24. {
  25. rt_err_t ret;
  26. rt_device_t psNuHwSem = (rt_device_t)parameter;
  27. uint32_t *pu32Counter = (uint32_t *)DEF_COUNTER_ADDR;
  28. nu_mutex_t psNuMutex = nu_mutex_init(psNuHwSem, evHWSEM0);
  29. if (psNuMutex == RT_NULL)
  30. return;
  31. *pu32Counter = 0;
  32. while (1)
  33. {
  34. ret = nu_mutex_take(psNuMutex, RT_WAITING_FOREVER);
  35. if (ret != RT_EOK)
  36. continue;
  37. if (*pu32Counter >= 10)
  38. {
  39. nu_mutex_release(psNuMutex);
  40. break;
  41. }
  42. else
  43. *pu32Counter = *pu32Counter + 1;
  44. #ifdef RT_USING_SMP
  45. rt_kprintf("[%08x@CPU-%d] ->Inc %d@%08x\n", rt_thread_self(), rt_hw_cpu_id(), *pu32Counter, DEF_COUNTER_ADDR);
  46. #else
  47. rt_kprintf("[%08x]-> Inc %d@%08x\n", rt_thread_self(), *pu32Counter, DEF_COUNTER_ADDR);
  48. #endif /* RT_USING_SMP */
  49. nu_mutex_release(psNuMutex);
  50. /* Relax, fair to get the mutex. */
  51. rt_thread_mdelay(500);
  52. }
  53. nu_mutex_deinit(psNuHwSem, evHWSEM0);
  54. }
  55. static int hwsem_counter_app(void)
  56. {
  57. rt_err_t result = 0;
  58. rt_thread_t thread;
  59. rt_device_t psNuHwSem = rt_device_find("hwsem0");
  60. if (psNuHwSem == RT_NULL)
  61. return -1;
  62. thread = rt_thread_create("hwsa35", hwsem_counter_go, (void *)psNuHwSem, 2048, 25, 20);
  63. if (thread != RT_NULL)
  64. {
  65. #ifdef RT_USING_SMP
  66. rt_thread_control(thread, RT_THREAD_CTRL_BIND_CPU, (void *)0);
  67. #endif
  68. result = rt_thread_startup(thread);
  69. RT_ASSERT(result == RT_EOK);
  70. }
  71. return 0;
  72. }
  73. INIT_APP_EXPORT(hwsem_counter_app);
  74. MSH_CMD_EXPORT(hwsem_counter_app, demo hwsem);
  75. #endif /* #if defined(BSP_USING_HWSEM)*/