blob: b47d4e77d2248a741c3466b7229aff9af2a48306 [file] [log] [blame]
/*
* Copyright (c) 2018 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/ztest.h>
#include <cmsis_os2.h>
#include <zephyr/irq_offload.h>
#include <zephyr/kernel.h>
uint32_t tick;
osStatus_t status_val;
typedef struct {
osVersion_t os_info;
char info[100];
} versionInfo;
void get_version_check(const void *param)
{
char infobuf[100];
osVersion_t osv;
osStatus_t status;
versionInfo *version_i = (versionInfo *)param;
status = osKernelGetInfo(&osv, infobuf, sizeof(infobuf));
if (status == osOK) {
version_i->os_info.api = osv.api;
version_i->os_info.kernel = osv.kernel;
strcpy(version_i->info, infobuf);
}
}
void lock_unlock_check(const void *arg)
{
int32_t state_before_lock, state_after_lock, current_state;
ARG_UNUSED(arg);
state_before_lock = osKernelLock();
if (k_is_in_isr()) {
zassert_true(state_before_lock == osErrorISR);
}
state_after_lock = osKernelUnlock();
if (k_is_in_isr()) {
zassert_true(state_after_lock == osErrorISR);
} else {
zassert_true(state_before_lock == !state_after_lock);
}
current_state = osKernelRestoreLock(state_before_lock);
if (k_is_in_isr()) {
zassert_true(current_state == osErrorISR);
} else {
zassert_equal(current_state, state_before_lock);
}
}
ZTEST(cmsis_kernel, test_kernel_apis)
{
versionInfo version = {
.os_info = {
.api = 0xfefefefe,
.kernel = 0xfdfdfdfd,
},
.info = "local function call info is uninitialized"
};
versionInfo version_irq = {
.os_info = {
.api = 0xfcfcfcfc,
.kernel = 0xfbfbfbfb,
},
.info = "irq_offload function call info is uninitialized"
};
get_version_check(&version);
irq_offload(get_version_check, (const void *)&version_irq);
/* Check if the version value retrieved in ISR and thread is same */
zassert_equal(strcmp(version.info, version_irq.info), 0);
zassert_equal(version.os_info.api, version_irq.os_info.api);
zassert_equal(version.os_info.kernel, version_irq.os_info.kernel);
lock_unlock_check(NULL);
irq_offload(lock_unlock_check, NULL);
}
void delay_until(const void *param)
{
ARG_UNUSED(param);
tick = osKernelGetTickCount();
tick += 50U;
status_val = osDelayUntil(tick);
}
ZTEST(cmsis_kernel, test_delay)
{
delay_until(NULL);
zassert_true(tick <= osKernelGetTickCount());
zassert_equal(status_val, osOK);
irq_offload(delay_until, NULL);
zassert_equal(status_val, osErrorISR);
}
ZTEST_SUITE(cmsis_kernel, NULL, NULL, NULL, NULL, NULL);