271 lines
6.6 KiB
C
271 lines
6.6 KiB
C
|
|
#include "typesdef.h"
|
||
|
|
#include "errno.h"
|
||
|
|
#include "list.h"
|
||
|
|
#include "osal/string.h"
|
||
|
|
#include "osal/task.h"
|
||
|
|
|
||
|
|
#ifdef CSKY_OS
|
||
|
|
#include <csi_kernel.h>
|
||
|
|
#include <k_api.h>
|
||
|
|
|
||
|
|
extern uint32_t csi_kernel_task_runtime(struct os_task_info *tsk_rumtime, int count);
|
||
|
|
extern void csi_kernel_task_dump(k_task_handle_t task_handle, void *stack);
|
||
|
|
extern void csi_kernel_task_print(void);
|
||
|
|
extern int csi_kernel_task_count(void);
|
||
|
|
|
||
|
|
static void os_task_entry(void *args)
|
||
|
|
{
|
||
|
|
os_task_t *task = (os_task_t *)args;
|
||
|
|
task->func((void *)task->args);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_init(const uint8 *name, os_task_t *task, os_task_func_t func, uint32 data)
|
||
|
|
{
|
||
|
|
//ASSERT(task);
|
||
|
|
os_memset(task, 0, sizeof(os_task_t));
|
||
|
|
task->args = data;
|
||
|
|
task->func = func;
|
||
|
|
task->name = (const char *)name;
|
||
|
|
return RET_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_priority(os_task_t *task)
|
||
|
|
{
|
||
|
|
//ASSERT(task);
|
||
|
|
return task->priority;
|
||
|
|
}
|
||
|
|
int32 os_task_priority2(void *hdl)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_get_prio(hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_stacksize(os_task_t *task)
|
||
|
|
{
|
||
|
|
//ASSERT(task);
|
||
|
|
return task->stack_size;
|
||
|
|
}
|
||
|
|
int32 os_task_stacksize2(void *hdl)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_get_stack_size(hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 _os_task_set_priority(os_task_t *task, uint32 prio)
|
||
|
|
{
|
||
|
|
int32 pri = KPRIO_NORMAL;
|
||
|
|
uint8 priority = prio & 0xff;
|
||
|
|
|
||
|
|
//ASSERT(task);
|
||
|
|
//ASSERT(!task->hdl);
|
||
|
|
if (priority < OS_TASK_PRIORITY_LOW) {
|
||
|
|
pri = KPRIO_LOW0;
|
||
|
|
} else if (priority < OS_TASK_PRIORITY_BELOW_NORMAL) {
|
||
|
|
pri = KPRIO_LOW0 + (priority - OS_TASK_PRIORITY_LOW);
|
||
|
|
if (pri > KPRIO_LOW7) { pri = KPRIO_LOW7; }
|
||
|
|
} else if (priority >= OS_TASK_PRIORITY_BELOW_NORMAL && priority < OS_TASK_PRIORITY_NORMAL) {
|
||
|
|
pri = KPRIO_NORMAL_BELOW0 + (priority - OS_TASK_PRIORITY_BELOW_NORMAL);
|
||
|
|
if (pri > KPRIO_NORMAL_BELOW7) { pri = KPRIO_NORMAL_BELOW7; }
|
||
|
|
} else if (priority >= OS_TASK_PRIORITY_NORMAL && priority < OS_TASK_PRIORITY_ABOVE_NORMAL) {
|
||
|
|
pri = KPRIO_NORMAL + (priority - OS_TASK_PRIORITY_NORMAL);
|
||
|
|
if (pri > KPRIO_NORMAL7) { pri = KPRIO_NORMAL7; }
|
||
|
|
} else if (priority >= OS_TASK_PRIORITY_ABOVE_NORMAL && priority < OS_TASK_PRIORITY_HIGH) {
|
||
|
|
pri = KPRIO_NORMAL_ABOVE0 + (priority - OS_TASK_PRIORITY_ABOVE_NORMAL);
|
||
|
|
if (pri > KPRIO_NORMAL_ABOVE7) { pri = KPRIO_NORMAL_ABOVE7; }
|
||
|
|
} else if (priority >= OS_TASK_PRIORITY_HIGH && priority < OS_TASK_PRIORITY_REALTIME) {
|
||
|
|
pri = KPRIO_HIGH0 + (priority - OS_TASK_PRIORITY_HIGH);
|
||
|
|
if (pri > KPRIO_HIGH7) { pri = KPRIO_HIGH7; }
|
||
|
|
} else if (priority >= OS_TASK_PRIORITY_REALTIME && priority < OS_TASK_PRIORITY_ISR) {
|
||
|
|
pri = KPRIO_REALTIME0 + (priority - OS_TASK_PRIORITY_REALTIME);
|
||
|
|
if (pri > KPRIO_REALTIME7) { pri = KPRIO_REALTIME7; }
|
||
|
|
} else {
|
||
|
|
pri = KPRIO_ISR;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (task) {
|
||
|
|
task->priority = pri;
|
||
|
|
task->lprun = (prio & OS_TASK_FLAGS_LPRUN) ? 1 : 0;
|
||
|
|
if (task->hdl) {
|
||
|
|
csi_kernel_task_set_prio(task->hdl, task->priority);
|
||
|
|
csi_kernel_task_set_lprun(task->hdl, task->lprun);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return pri;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_set_priority(os_task_t *task, uint32 pri)
|
||
|
|
{
|
||
|
|
uint8 priority = pri & 0xff;
|
||
|
|
if (priority >= OS_TASK_PRIORITY_HIGH) {
|
||
|
|
priority = OS_TASK_PRIORITY_HIGH - 1;
|
||
|
|
pri &= 0xffffff00;
|
||
|
|
pri |= priority;
|
||
|
|
os_printf("INVALID PRIORITY\r\n");
|
||
|
|
}
|
||
|
|
return _os_task_set_priority(task, pri);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_set_stack(os_task_t *task, void *stack, int32 stack_size)
|
||
|
|
{
|
||
|
|
//ASSERT(task);
|
||
|
|
//ASSERT(!task->hdl);
|
||
|
|
task->stack = stack;
|
||
|
|
task->stack_size = stack_size;
|
||
|
|
return RET_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_run(os_task_t *task)
|
||
|
|
{
|
||
|
|
//ASSERT(task);
|
||
|
|
int32 ret = csi_kernel_task_new(os_task_entry, task->name,
|
||
|
|
(void *)task, task->priority, 0, task->stack,
|
||
|
|
task->stack_size, &task->hdl);
|
||
|
|
if(ret == RET_OK){
|
||
|
|
csi_kernel_task_set_lprun(task->hdl, task->lprun);
|
||
|
|
}
|
||
|
|
//ASSERT(!ret);
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_stop(os_task_t *task)
|
||
|
|
{
|
||
|
|
//ASSERT(0);
|
||
|
|
csi_kernel_task_terminate(task->hdl);
|
||
|
|
return RET_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_del(os_task_t *task)
|
||
|
|
{
|
||
|
|
int32 ret = 0;
|
||
|
|
//ASSERT(task);
|
||
|
|
ASSERT(task->hdl);
|
||
|
|
void *hdl = task->hdl;
|
||
|
|
task->hdl = NULL;
|
||
|
|
ret = csi_kernel_task_del(hdl);
|
||
|
|
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_runtime(struct os_task_info *tsk_times, int32 count)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_runtime(tsk_times, count);
|
||
|
|
}
|
||
|
|
|
||
|
|
void os_task_print(void)
|
||
|
|
{
|
||
|
|
csi_kernel_task_print();
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_count(void)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_count();
|
||
|
|
}
|
||
|
|
|
||
|
|
void *os_task_current(void)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_get_cur();
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_suspend(os_task_t *task)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_suspend(task->hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_resume(os_task_t *task)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_resume(task->hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
void os_task_dump(void *hdl, void *stack)
|
||
|
|
{
|
||
|
|
csi_kernel_task_dump(hdl, stack);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_yield(void)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_yield();
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_sched_disable(void)
|
||
|
|
{
|
||
|
|
krhino_sched_disable();
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_sched_enbale(void)
|
||
|
|
{
|
||
|
|
krhino_sched_enable();
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
os_task_t *os_task_hdl2tsk(void *hdl)
|
||
|
|
{
|
||
|
|
ktask_t *task = (ktask_t *)hdl;
|
||
|
|
return (task && task->arg) ? ((os_task_t *)task->arg) : NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
void *os_task_data(void *hdl)
|
||
|
|
{
|
||
|
|
ktask_t *task = (ktask_t *)hdl;
|
||
|
|
return task->arg;
|
||
|
|
}
|
||
|
|
|
||
|
|
void *os_task_create(const char *name, os_task_func_t func, void *args, uint32 prio, uint32 time, void *stack, uint32 stack_size)
|
||
|
|
{
|
||
|
|
k_task_handle_t hdl = NULL;
|
||
|
|
uint32 priority = os_task_set_priority(NULL, prio);
|
||
|
|
int32 ret = csi_kernel_task_new(func, name, args, priority, time, stack, stack_size, &hdl);
|
||
|
|
if(ret == RET_OK){
|
||
|
|
if(prio & OS_TASK_FLAGS_LPRUN){
|
||
|
|
csi_kernel_task_set_lprun(hdl, 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
ASSERT(!ret);
|
||
|
|
return hdl;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_destroy(void *hdl)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_del(hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_suspend2(void *hdl)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_suspend((k_task_handle_t)hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_task_resume2(void *hdl)
|
||
|
|
{
|
||
|
|
return csi_kernel_task_resume((k_task_handle_t)hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
int32 os_blklist_init(os_blklist_t *blkobj)
|
||
|
|
{
|
||
|
|
void *csi_kernel_blklist_new();
|
||
|
|
blkobj->hdl = csi_kernel_blklist_new();
|
||
|
|
return blkobj->hdl ? RET_OK : RET_ERR;
|
||
|
|
}
|
||
|
|
|
||
|
|
void os_blklist_del(os_blklist_t *blkobj)
|
||
|
|
{
|
||
|
|
void csi_kernel_blklist_del(void *hdl);
|
||
|
|
csi_kernel_blklist_del(blkobj->hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
void os_blklist_suspend(os_blklist_t *blkobj, void *task_hdl)
|
||
|
|
{
|
||
|
|
void csi_kernel_blklist_suspend(void *hdl, k_task_handle_t task_hdl);
|
||
|
|
csi_kernel_blklist_suspend(blkobj->hdl, task_hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
void os_blklist_resume(os_blklist_t *blkobj)
|
||
|
|
{
|
||
|
|
void csi_kernel_blklist_wakeup(void *hdl);
|
||
|
|
csi_kernel_blklist_wakeup(blkobj->hdl);
|
||
|
|
}
|
||
|
|
|
||
|
|
void os_lpower_mode(uint8 enable)
|
||
|
|
{
|
||
|
|
csi_kernel_lpower_mode(enable);
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|