static void test_002_004_execute(void) { systime_t time; msg_t msg; /* The function chThdSuspendTimeoutS() is invoked, the thread is remotely resumed with message @p MSG_OK. On return the message and the state of the reference are tested.*/ test_set_step(1); { msg = chThdSuspendTimeoutS(>r1, TIME_INFINITE); test_assert(NULL == gtr1, "not NULL"); test_assert(MSG_OK == msg, "wrong returned message"); } /* The function chThdSuspendTimeoutS() is invoked, the thread is not resumed so a timeout must occur. On return the message and the state of the reference are tested.*/ test_set_step(2); { time = chVTGetSystemTimeX(); msg = chThdSuspendTimeoutS(&tr1, MS2ST(1000)); test_assert_time_window(time + MS2ST(1000), time + MS2ST(1000) + 1, "out of time window"); test_assert(NULL == tr1, "not NULL"); test_assert(MSG_TIMEOUT == msg, "wrong returned message"); } }
static void test_003_001_execute(void) { systime_t time; msg_t msg; /* [3.1.1] The function chThdSuspendTimeoutS() is invoked, the thread is remotely resumed with message @p MSG_OK. On return the message and the state of the reference are tested.*/ test_set_step(1); { threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread1, "A"); chSysLock(); msg = chThdSuspendTimeoutS(&tr1, TIME_INFINITE); chSysUnlock(); test_assert(NULL == tr1, "not NULL"); test_assert(MSG_OK == msg,"wrong returned message"); test_wait_threads(); } /* [3.1.2] The function chThdSuspendTimeoutS() is invoked, the thread is not resumed so a timeout must occur. On return the message and the state of the reference are tested.*/ test_set_step(2); { chSysLock(); time = chVTGetSystemTimeX(); msg = chThdSuspendTimeoutS(&tr1, MS2ST(1000)); chSysUnlock(); test_assert_time_window(time + MS2ST(1000), time + MS2ST(1000) + CH_CFG_ST_TIMEDELTA + 1, "out of time window"); test_assert(NULL == tr1, "not NULL"); test_assert(MSG_TIMEOUT == msg, "wrong returned message"); } }
static void nil_test_004_001_execute(void) { systime_t time; msg_t msg; /* [4.1.1] The function chThdSuspendTimeoutS() is invoked, the thread is remotely resumed with message @p MSG_OK. On return the message and the state of the reference are tested.*/ test_set_step(1); { chSysLock(); msg = chThdSuspendTimeoutS(>r1, TIME_INFINITE); chSysUnlock(); test_assert(NULL == gtr1, "not NULL"); test_assert(MSG_OK == msg,"wrong returned message"); } /* [4.1.2] The function chThdSuspendTimeoutS() is invoked, the thread is not resumed so a timeout must occur. On return the message and the state of the reference are tested.*/ test_set_step(2); { chSysLock(); time = chVTGetSystemTimeX(); msg = chThdSuspendTimeoutS(&tr1, TIME_MS2I(1000)); chSysUnlock(); test_assert_time_window(chTimeAddX(time, TIME_MS2I(1000)), chTimeAddX(time, TIME_MS2I(1000) + 1), "out of time window"); test_assert(NULL == tr1, "not NULL"); test_assert(MSG_TIMEOUT == msg, "wrong returned message"); } }
uint8_t i2c_t::Write(uint32_t Addr, uint8_t *WPtr, uint32_t WLength) { if(chBSemWait(&BSemaphore) != MSG_OK) return FAILURE; uint8_t Rslt; msg_t r; I2C_TypeDef *pi2c = PParams->pi2c; // To make things shorter if(WLength == 0 or WPtr == nullptr) { Rslt = CMD_ERROR; goto WriteEnd; } if(IBusyWait() != OK) { Rslt = BUSY; goto WriteEnd; } IReset(); // Reset I2C // Prepare TX DMA dmaStreamSetMode(PParams->PDmaTx, DMA_MODE_TX); dmaStreamSetMemory0(PParams->PDmaTx, WPtr); dmaStreamSetTransactionSize(PParams->PDmaTx, WLength); // Prepare tx IState = istWrite; // Nothing to read pi2c->CR2 = (Addr << 1) | (WLength << 16); dmaStreamEnable(PParams->PDmaTx); // Enable TX DMA // Enable IRQs: TX completed, error, NAck pi2c->CR1 |= (I2C_CR1_TCIE | I2C_CR1_ERRIE | I2C_CR1_NACKIE); pi2c->CR2 |= I2C_CR2_START; // Start transmission // Wait completion chSysLock(); r = chThdSuspendTimeoutS(&PThd, MS2ST(I2C_TIMEOUT_MS)); chSysUnlock(); // Disable IRQs pi2c->CR1 &= ~(I2C_CR1_TCIE | I2C_CR1_ERRIE | I2C_CR1_NACKIE); if(r == MSG_TIMEOUT) { pi2c->CR2 |= I2C_CR2_STOP; Rslt = TIMEOUT; } else Rslt = (IState == istFailure)? FAILURE : OK; WriteEnd: chBSemSignal(&BSemaphore); return Rslt; }
// Enter RX mode and wait reception for Timeout_st. uint8_t cc1101_t::Receive_st(systime_t Timeout_st, void *Ptr, int8_t *PRssi) { FlushRxFIFO(); chSysLock(); EnterRX(); msg_t Rslt = chThdSuspendTimeoutS(&ThdRef, Timeout_st); // Wait IRQ chSysUnlock(); // Will be here when IRQ will fire, or timeout occur - with appropriate message if(Rslt == MSG_TIMEOUT) { // Nothing received, timeout occured EnterIdle(); // Get out of RX mode return TIMEOUT; } else return ReadFIFO(Ptr, PRssi); return OK; }
msg_t ThreadStayPoint::suspendS(systime_t timeout) { return chThdSuspendTimeoutS(&thread_ref, timeout); }