xiuos/Ubiquitous/XiZi_IIoT/kernel/include/xs_assign.h

138 lines
4.4 KiB
C

/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* @file: xs_assign.h
* @brief: function declaration and structure defintion of system assign
* @version: 1.0
* @author: AIIT XUOS Lab
* @date: 2020/3/10
*
*/
#ifndef XS_ASSIGN_H
#define XS_ASSIGN_H
#include <xs_base.h>
#include <xs_ktask.h>
#include <xs_klist.h>
#include <xs_spinlock.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MERGE_FLAG(src, flag) (*(src) |= flag)
#define CLEAR_FLAG(src, flag) (*(src) &= ~flag)
extern struct Assign Assign;
struct PriorityReadyVectorDone
{
void (*init)(struct OsAssignReadyVector *ready_vector);
void (*insert)(struct TaskDescriptor *task);
void (*remove)(struct TaskDescriptor *task);
};
#ifdef ARCH_SMP
struct smp_assign_done
{
x_ubase (*GetHighest)(void);
struct TaskDescriptor* (*select)(void);
void (*SwitchToNew)(struct TaskDescriptor* old_task, struct TaskDescriptor* new_task);
void (*SwitchToFirst)(struct TaskDescriptor* task);
void (*SetSystemTask)(struct TaskDescriptor* task);
void (*SmpInit)(void);
};
struct Assign
{
struct OsAssignReadyVector os_assign_ready_vector;
struct OsAssignReadyVector smp_os_assign_ready_vector[CPU_NUMBERS];
struct TaskDescriptor *smp_os_running_task[CPU_NUMBERS];
struct PriorityReadyVectorDone *ready_vector_done;
struct smp_assign_done *smp_assign_done;
uint8 current_priority[CPU_NUMBERS];
uint16 assign_lock[CPU_NUMBERS];
};
void SwitchKtaskContext(x_ubase from, x_ubase to, struct TaskDescriptor *to_task);
void SwitchKtaskContextTo(x_ubase to, struct TaskDescriptor *to_task);
void HwInterruptcontextSwitch( x_ubase from, x_ubase to,struct TaskDescriptor *to_task , void *context);
#else
struct Assign
{
struct OsAssignReadyVector os_assign_ready_vector;
struct TaskDescriptor *os_running_task;
struct PriorityReadyVectorDone *ready_vector_done;
uint8 current_priority;
};
void SwitchKtaskContext(x_ubase from, x_ubase to , struct TaskDescriptor *to_task);
void SwitchKtaskContextTo(x_ubase to, struct TaskDescriptor *to_task);
void HwInterruptcontextSwitch( x_ubase from, x_ubase to, struct TaskDescriptor *to_task ,void *context);
#endif
void KTaskInsertToReadyVector(struct TaskDescriptor *task);
int PrioCaculate(uint32 bitmap);
void SysInitOsAssign(void);
void ResetCriticalAreaLock(void );
void StartupOsAssign(void);
x_base CriticalAreaLock(void);
void CriticalAreaUnLock(x_base lock);
uint16 GetOsAssignLockLevel(void);
int32 JudgeAssignReadyBitmapIsEmpty(struct OsAssignReadyVector *ready_vector);
void OsAssignReadyVectorInit(struct OsAssignReadyVector *ready_vector);
void AssignPolicyInsert(struct TaskDescriptor *task, struct OsAssignReadyVector* ready_table);
struct TaskDescriptor * ChooseTaskWithHighestPrio(struct OsAssignReadyVector *ready_vector);
#ifdef KERNEL_STACK_OVERFLOW_CHECK
void _KTaskOsAssignStackCheck(struct TaskDescriptor *task);
#endif
#ifdef ARCH_SMP
extern HwSpinlock AssignSpinLock;
#define DO_KTASK_ASSIGN \
do \
{ \
NOT_IN_CRITICAL_AREA; \
x_base lock; \
lock = DISABLE_INTERRUPT(); \
HwLockSpinlock(&AssignSpinLock); \
KTaskOsAssign(); \
HwUnlockSpinlock(&AssignSpinLock); \
ENABLE_INTERRUPT(lock); \
} while (0);
#else
#define DO_KTASK_ASSIGN \
do \
{ \
NOT_IN_CRITICAL_AREA; \
x_base lock; \
lock = DISABLE_INTERRUPT(); \
KTaskOsAssign(); \
ENABLE_INTERRUPT(lock); \
} while (0);
#endif
#ifdef __cplusplus
}
#endif
#endif