blob: f131db06fcb7c8df31e927cebafb88da126e40ad [file] [log] [blame]
/*
* Copyright (c) 2017 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <ztest.h>
#include <kernel.h>
#include <cmsis_os.h>
#define TIMEOUT (100)
#define SIGNAL1 (0x00000020)
#define SIGNAL2 (0x00000004)
#define SIGNAL (SIGNAL1 | SIGNAL2)
void Thread_1(void const *arg)
{
int signals = osSignalSet((osThreadId)arg, SIGNAL1);
zassert_not_equal(signals, 0x80000000, "");
}
void Thread_2(void const *arg)
{
int signals = osSignalSet((osThreadId)arg, SIGNAL2);
zassert_not_equal(signals, 0x80000000, "");
}
osThreadDef(Thread_1, osPriorityHigh, 3, 0);
osThreadDef(Thread_2, osPriorityHigh, 1, 0);
void test_signal_events_no_wait(void)
{
osThreadId id1;
osEvent evt;
id1 = osThreadCreate(osThread(Thread_1), osThreadGetId());
zassert_true(id1 != NULL, "Thread creation failed");
/* Let id1 run to trigger SIGNAL1 */
osDelay(10);
/* wait for SIGNAL1. It should return immediately as it is
* already triggered.
*/
evt = osSignalWait(SIGNAL1, 0);
zassert_equal(evt.status, osEventSignal, "");
zassert_equal((evt.value.signals & SIGNAL1), SIGNAL1, "");
}
void test_signal_events_timeout(void)
{
osThreadId id1;
int signals;
osEvent evt;
id1 = osThreadCreate(osThread(Thread_1), osThreadGetId());
zassert_true(id1 != NULL, "Thread creation failed");
/* Let id1 run to trigger SIGNAL1 */
osDelay(10);
signals = osSignalClear(osThreadGetId(), SIGNAL1);
zassert_not_equal(signals, 0x80000000, "");
/* wait for SIGNAL1. It should timeout here as the signal
* though triggered, gets cleared in the previous step.
*/
evt = osSignalWait(SIGNAL1, TIMEOUT);
zassert_equal(evt.status, osEventTimeout, "");
}
void test_signal_events_signalled(void)
{
osThreadId id1, id2;
osEvent evt;
id1 = osThreadCreate(osThread(Thread_1), osThreadGetId());
zassert_true(id1 != NULL, "Thread creation failed");
id2 = osThreadCreate(osThread(Thread_2), osThreadGetId());
zassert_true(id2 != NULL, "Thread creation failed");
/* wait for a signal */
evt = osSignalWait(SIGNAL, TIMEOUT);
zassert_equal(evt.status, osEventSignal, "");
zassert_equal((evt.value.signals & SIGNAL), SIGNAL, "");
}