Browse Source

update zthread

master
zhaohe 2 years ago
parent
commit
84d2587e59
  1. 31
      os/zthread.cpp
  2. 6
      os/zthread.hpp

31
os/zthread.cpp

@ -7,14 +7,22 @@ using namespace std;
static void zosthread_default_task(void const *argument) { static void zosthread_default_task(void const *argument) {
ZThread *thread = (ZThread *)argument; ZThread *thread = (ZThread *)argument;
ZASSERT(thread); ZASSERT(thread);
thread->m_threadisworkingFlag = false;
thread->m_threadisWaitingForStopFlag = false;
while (true) { while (true) {
thread->m_threadisworking = false;
if (thread->m_threadisworkingFlagCallSide) {
thread->m_threadisworkingFlag = true;
thread->m_taskfunction();
// µÈ´ýtaskworking
xEventGroupWaitBits(thread->m_zthreadstartworkevent, 0x01, pdTRUE, pdTRUE, portMAX_DELAY);
thread->m_threadisworking = true;
thread->m_taskfunction();
thread->m_threadisWaitingForStopFlag = true;
while (thread->m_threadisworkingFlagCallSide) {
vTaskDelay(10);
}
thread->m_threadisworkingFlag = false;
thread->m_threadisWaitingForStopFlag = false;
}
vTaskDelay(10);
} }
}; };
@ -40,8 +48,10 @@ void ZThread::start(zosthread_cb_t cb) {
ZASSERT(m_taskfunction); ZASSERT(m_taskfunction);
xSemaphoreTake(m_lock, portMAX_DELAY); xSemaphoreTake(m_lock, portMAX_DELAY);
xEventGroupSetBits(m_zthreadstartworkevent, 0x01);
while (m_threadisworking != true) {
m_threadisworkingFlagCallSide = true;
// xEventGroupSetBits(m_zthreadstartworkevent, 0x01);
while (!m_threadisworkingFlag) {
xTaskNotifyGive(m_defaultTaskHandle);
vTaskDelay(1); vTaskDelay(1);
} }
xSemaphoreGive(m_lock); xSemaphoreGive(m_lock);
@ -49,16 +59,15 @@ void ZThread::start(zosthread_cb_t cb) {
void ZThread::stop() { void ZThread::stop() {
xSemaphoreTake(m_lock, portMAX_DELAY); xSemaphoreTake(m_lock, portMAX_DELAY);
m_expect_stop = true;
while (m_threadisworking) {
m_threadisworkingFlagCallSide = false;
// xEventGroupSetBits(m_zthreadstartworkevent, 0x01);
while (m_threadisworkingFlag) {
xTaskNotifyGive(m_defaultTaskHandle); xTaskNotifyGive(m_defaultTaskHandle);
vTaskDelay(1); vTaskDelay(1);
} }
m_expect_stop = false;
xSemaphoreGive(m_lock); xSemaphoreGive(m_lock);
} }
bool ZThread::isExpectStop() { return m_expect_stop; }
void ZThread::sleep(uint32_t ms) { ulTaskNotifyTake(pdFALSE, pdMS_TO_TICKS(ms)); } void ZThread::sleep(uint32_t ms) { ulTaskNotifyTake(pdFALSE, pdMS_TO_TICKS(ms)); }
void ZThread::wake() { void ZThread::wake() {
BaseType_t state; BaseType_t state;

6
os/zthread.hpp

@ -10,8 +10,9 @@ class ZThread {
size_t m_stacksize; size_t m_stacksize;
osPriority m_uxPriority; osPriority m_uxPriority;
bool m_threadisworking;
bool m_expect_stop;
bool m_threadisworkingFlag = false;
bool m_threadisWaitingForStopFlag = false;
bool m_threadisworkingFlagCallSide = false;
zosthread_cb_t m_taskfunction; zosthread_cb_t m_taskfunction;
EventGroupHandle_t m_zthreadstartworkevent; EventGroupHandle_t m_zthreadstartworkevent;
@ -25,7 +26,6 @@ class ZThread {
void start(zosthread_cb_t cb); void start(zosthread_cb_t cb);
void stop(); void stop();
bool isExpectStop();
void sleep(uint32_t ms); void sleep(uint32_t ms);
void wake(); void wake();
}; };

Loading…
Cancel
Save