You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.5 KiB

2 years ago
2 years ago
2 years ago
  1. #include "zthread.h"
  2. #include "stdbool.h"
  3. #include "stm32sdk.h"
  4. // #include "Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.h"
  5. #include "zassert.h"
  6. #define TAG "zthread"
  7. extern uint32_t vPortGetIPSR(void);
  8. static __inline bool IS_IRQ(void)
  9. {
  10. if (vPortGetIPSR())
  11. return true;
  12. return false;
  13. }
  14. static void tasksleep(uint32_t ms) { ulTaskNotifyTake(pdFALSE, pdMS_TO_TICKS(ms)); }
  15. static void taskwake(zthread_t *thread) {
  16. BaseType_t state;
  17. if (IS_IRQ())
  18. vTaskNotifyGiveFromISR(thread->handler, &state);
  19. else
  20. xTaskNotifyGive(thread->handler);
  21. }
  22. static void prvtaskfunction(void *_taskhandler) {
  23. zthread_t *thread = (zthread_t *)_taskhandler;
  24. Z_ASSERT(_taskhandler);
  25. while (true) {
  26. thread->threadisworking = false;
  27. // 等待taskworking
  28. xEventGroupWaitBits(thread->zthreadstartworkevent, 0x01, pdTRUE, pdTRUE, portMAX_DELAY);
  29. // ZLOGI(TAG, "thread %s startwork", thread->name);
  30. ZLOGI(TAG, "thread %s startwork", thread->name);
  31. thread->threadisworking = true;
  32. thread->taskfunction(NULL);
  33. ZLOGI(TAG, "thread %s end work", thread->name);
  34. }
  35. };
  36. void zthread_init(zthread_t *thread, const char *name, TaskFunction_t taskfunction) {
  37. Z_ASSERT(thread);
  38. Z_ASSERT(taskfunction);
  39. Z_ASSERT(name);
  40. thread->lock = xSemaphoreCreateMutex();
  41. Z_ASSERT(thread->lock);
  42. if (thread->stacksize == 0) {
  43. thread->stacksize = ZTHREAD_DEFAULT_STACK_SIZE;
  44. }
  45. if (thread->uxPriority == 0) {
  46. thread->uxPriority = ZTHREAD_DEFAULT_PRIORITY;
  47. }
  48. thread->taskfunction = taskfunction;
  49. thread->zthreadstartworkevent = xEventGroupCreate();
  50. thread->name = name;
  51. xTaskCreate(prvtaskfunction, name, thread->stacksize, (void *)thread, thread->uxPriority, &thread->handler);
  52. }
  53. void zthread_start(zthread_t *thread) {
  54. /**
  55. * @brief
  56. */
  57. Z_ASSERT(thread);
  58. xSemaphoreTake(thread->lock, portMAX_DELAY);
  59. xEventGroupSetBits(thread->zthreadstartworkevent, 0x01);
  60. while (thread->threadisworking != true) {
  61. vTaskDelay(10);
  62. }
  63. xSemaphoreGive(thread->lock);
  64. }
  65. bool zthread_is_expect_stop(zthread_t *thread) { return thread->_expect_stop; }
  66. void zthread_stop(zthread_t *thread) {
  67. Z_ASSERT(thread);
  68. xSemaphoreTake(thread->lock, portMAX_DELAY);
  69. thread->_expect_stop = true;
  70. while (thread->threadisworking == true) {
  71. taskwake(thread);
  72. vTaskDelay(10);
  73. }
  74. thread->_expect_stop = false;
  75. xSemaphoreGive(thread->lock);
  76. }
  77. void zthread_sleep(uint32_t ms) { tasksleep(ms); }
  78. void zthread_weak(zthread_t *thread) { taskwake(thread); }