Merge branch 'prepare_for_master' of https://gitlink.org.cn/xuos/xiuos into prepare_for_master

This commit is contained in:
huang
2023-10-11 16:48:47 +08:00
31 changed files with 273 additions and 165 deletions

View File

@@ -5,7 +5,7 @@ MAKEFLAGS += --no-print-directory
.PHONY:COMPILE_APP COMPILE_KERNEL
riscv_support := kd233 maix-go hifive1-rev-B gapuino gd32vf103-rvstar rv32m1-vega aiit-riscv64-board xidatong-riscv64 edu-riscv64
riscv_support := kd233 maix-go hifive1-rev-B gapuino gd32vf103-rvstar rv32m1-vega aiit-riscv64-board xidatong-riscv64 edu-riscv64 ch32v307vct6
arm_support += stm32f407-st-discovery stm32f407zgt6 stm32f103-nano nuvoton-m2354 ok1052-c imxrt1176-sbc aiit-arm32-board xidatong-arm32 xiwangtong-arm32 edu-arm32
emulator_support += hifive1-emulator k210-emulator cortex-m0-emulator cortex-m3-emulator cortex-m4-emulator cortex-m7-emulator

View File

@@ -1,6 +1,6 @@
export CROSS_COMPILE ?=/usr/bin/arm-none-eabi-
export CFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -ffunction-sections -fdata-sections -Dgcc -O0 -fgnu89-inline -Wa,-mimplicit-it=thumb -Werror
export CFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -ffunction-sections -fdata-sections -Dgcc -O0 -fgnu89-inline -Wa,-mimplicit-it=thumb -Werror -Wuninitialized
# export CFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -ffunction-sections -fdata-sections -Dgcc -O0 -gdwarf-2 -g -fgnu89-inline -Wa,-mimplicit-it=thumb -Werror
export AFLAGS := -c -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -ffunction-sections -fdata-sections -x assembler-with-cpp -Wa,-mimplicit-it=thumb -gdwarf-2
export LFLAGS := -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -ffunction-sections -fdata-sections -Wl,--gc-sections,-Map=XiZi-edu-arm32.map,-cref,-u,Reset_Handler -T $(BSP_ROOT)/link.lds

View File

@@ -281,6 +281,7 @@ static void SdCardTask(void* parameter)
sd_card_status = 0;
}
}
MdelayKTask(500);
}
}

View File

@@ -55,8 +55,8 @@ struct smp_assign_done
};
struct Assign
{
struct OsAssignReadyVector os_assign_read_vector;
struct OsAssignReadyVector smp_os_assign_ready_rector[CPU_NUMBERS];
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;
@@ -73,7 +73,7 @@ void HwInterruptcontextSwitch( x_ubase from, x_ubase to,struct TaskDescriptor *t
#else
struct Assign
{
struct OsAssignReadyVector os_assign_read_vector;
struct OsAssignReadyVector os_assign_ready_vector;
struct TaskDescriptor *os_running_task;
struct PriorityReadyVectorDone *ready_vector_done;

View File

@@ -183,6 +183,7 @@ x_err_t KTaskDelete(int32 id);
x_err_t YieldOsAssign(void);
x_err_t DelayKTask(x_ticks_t tick);
x_err_t MdelayKTask(uint32 ms);
// KTaskPrioSet is bugged, dont use this
x_err_t KTaskPrioSet(int32 id, uint8 prio);
x_err_t KTaskCoreCombine(int32 id, uint8 coreid);
x_err_t KTaskCoreUnCombine(int32 id);

View File

@@ -775,19 +775,24 @@ uint8_t UserGetTaskPriority(int32_t id)
}
#ifdef KERNEL_SOFTTIMER
static int32 timer_sem;
#define TIMER_NUM 20
static int32 timer_sem[TIMER_NUM];
static uint32_t timer_id[TIMER_NUM];
static void UserTimerCallback(void *parameter)
{
KSemaphoreAbandon(timer_sem);
uint32_t timer_id = *((uint32_t *)parameter);
KSemaphoreAbandon(timer_sem[timer_id]);
}
int32 UserTimerCreate(const char *name, void (*timeout)(void *parameter), void *parameter, uint32_t time, uint8_t trigger_mode)
{
int32 ret;
timer_sem = *((int *)parameter);
timer_id[time] = time;
timer_sem[time] = *((int *)parameter);
ret = KCreateTimer(name, UserTimerCallback, (void *)&(timer_id[time]), 1000, trigger_mode);
ret = KCreateTimer(name, UserTimerCallback, NONE, time, trigger_mode);
return ret;
}

View File

@@ -47,12 +47,12 @@ static void Task1Entry(void *parameter)
#ifdef ARCH_SMP
if (0 == strncmp(parameter,"-b",strlen("-b"))) { ///< if tasks bind to cpu 0
head = &(Assign.smp_os_assign_ready_rector[0].priority_ready_vector[PRIORITY]);
head = &(Assign.smp_os_assign_ready_vector[0].priority_ready_vector[PRIORITY]);
} else {
head = &(Assign.os_assign_read_vector.priority_ready_vector[PRIORITY]);
head = &(Assign.os_assign_ready_vector.priority_ready_vector[PRIORITY]);
}
#else
head = &(Assign.os_assign_read_vector.priority_ready_vector[PRIORITY]);
head = &(Assign.os_assign_ready_vector.priority_ready_vector[PRIORITY]);
#endif
while(cnt--) {
#ifdef TOOL_SHELL

View File

@@ -39,28 +39,27 @@ static struct PriorityReadyVectorDone SingleReadyVectorDone =
*/
void KTaskOsAssign(void)
{
x_ubase highest_prio = 0;
int need_insert_from_task = 0;
struct TaskDescriptor *new_task = NONE;
struct TaskDescriptor *from_task = NONE;
if(GetOsAssignLockLevel() >= 1) {
return;
goto exit;
}
if( isrManager.done->isInIsr() ){
isrManager.done->setSwitchTrigerFlag();
return;
goto exit;
}
/* if the bitmap is empty then do not switch */
if(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_read_vector)) {
return;
if (RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_ready_vector)) {
goto exit;
}
highest_prio = Assign.os_assign_read_vector.highest_prio;
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
highest_prio = Assign.os_assign_ready_vector.highest_prio;
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
if(RET_TRUE != JudgeKTaskStatIsRunning(Assign.os_running_task)) {
CHECK(NONE != new_task);
@@ -69,7 +68,7 @@ void KTaskOsAssign(void)
/* if the running task priority is the highest and this task is not be yield then do not switch */
if(highest_prio < Assign.os_running_task->task_dync_sched_member.cur_prio) {
return;
goto exit;
} else {
need_insert_from_task = 1;
}
@@ -90,12 +89,12 @@ SWITCH:
Assign.os_running_task = new_task;
SYS_KDEBUG_LOG(KDBG_SCHED,
("[%d]switch to priority#%d "
"task:%.*s(sp:0x%08x), "
"from task:%.*s(sp: 0x%08x)\n",
isrManager.done->getCounter(), highest_prio,
NAME_NUM_MAX, new_task->task_base_info.name, new_task->stack_point,
NAME_NUM_MAX, from_task->task_base_info.name, from_task->stack_point));
("[%d]switch to priority#%d "
"task:%.*s(sp:0x%08x), "
"from task:%.*s(sp: 0x%08x)\n",
isrManager.done->getCounter(), highest_prio,
NAME_NUM_MAX, new_task->task_base_info.name, new_task->stack_point,
NAME_NUM_MAX, from_task->task_base_info.name, from_task->stack_point));
#ifdef KERNEL_STACK_OVERFLOW_CHECK
_KTaskOsAssignStackCheck(new_task);
@@ -108,6 +107,8 @@ SWITCH:
Assign.ready_vector_done->remove(Assign.os_running_task);
KTaskStatSetAsRunning(Assign.os_running_task);
}
exit:
return;
}
@@ -129,12 +130,12 @@ void KTaskOsAssignDoIrqSwitch(void *context)
isrManager.done->clearSwitchTrigerFlag();
/* if the bitmap is empty then do not switch */
if(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_read_vector)) {
if (RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_ready_vector)) {
return;
}
highest_prio = Assign.os_assign_read_vector.highest_prio;
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
highest_prio = Assign.os_assign_ready_vector.highest_prio;
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
if(RET_TRUE != JudgeKTaskStatIsRunning(Assign.os_running_task)) {
CHECK(NONE != new_task);
@@ -165,18 +166,18 @@ SWITCH:
Assign.os_running_task = new_task;
SYS_KDEBUG_LOG(KDBG_SCHED,
("[%d]switch to priority#%d "
"task:%.*s(sp:0x%08x), "
"from task:%.*s(sp: 0x%08x)\n",
isrManager.done->getCounter(), highest_prio,
NAME_NUM_MAX, new_task->task_base_info.name, new_task->stack_point,
NAME_NUM_MAX, from_task->task_base_info.name, from_task->stack_point));
("[%s][%d]switch to priority#%d "
"task:%.*s(sp:0x%08x), "
"from task:%.*s(sp: 0x%08x)\n",
__func__,
isrManager.done->getCounter(), highest_prio,
NAME_NUM_MAX, new_task->task_base_info.name, new_task->stack_point,
NAME_NUM_MAX, from_task->task_base_info.name, from_task->stack_point));
#ifdef KERNEL_STACK_OVERFLOW_CHECK
_KTaskOsAssignStackCheck(new_task);
#endif
SYS_KDEBUG_LOG(KDBG_SCHED, ("switch in interrupt\n"));
HwInterruptcontextSwitch((x_ubase)&from_task->stack_point,
(x_ubase)&new_task->stack_point, new_task, context);
@@ -189,8 +190,8 @@ SWITCH:
void KTaskOsAssignAfterIrq(void *context)
{
x_base lock = 0;
lock = DISABLE_INTERRUPT();
x_base lock = 0;
lock = DISABLE_INTERRUPT();
KTaskOsAssignDoIrqSwitch(context);
ENABLE_INTERRUPT(lock);
}
@@ -204,20 +205,20 @@ void KTaskInsertToReadyVector(struct TaskDescriptor *task)
{
x_base lock = 0;
NULL_PARAM_CHECK(task);
NULL_PARAM_CHECK(task);
lock = DISABLE_INTERRUPT();
KTaskStatSetAsReady(task);
AssignPolicyInsert(task, &Assign.os_assign_read_vector);
AssignPolicyInsert(task, &Assign.os_assign_ready_vector);
SYS_KDEBUG_LOG(KDBG_SCHED, ("insert task[%.*s], the priority: %d\n",
NAME_NUM_MAX, task->task_base_info.name, task->task_dync_sched_member.cur_prio));
#if KTASK_PRIORITY_MAX > 32
MERGE_FLAG(&Assign.os_assign_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
MERGE_FLAG(&Assign.os_assign_ready_vector.ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
#endif
MERGE_FLAG(&Assign.os_assign_read_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
MERGE_FLAG(&Assign.os_assign_ready_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
ENABLE_INTERRUPT(lock);
}
@@ -234,29 +235,28 @@ void KTaskOsAssignRemoveKTask(struct TaskDescriptor *task)
x_ubase number = 0;
x_ubase highest_priority = 0;
NULL_PARAM_CHECK(task);
NULL_PARAM_CHECK(task);
;
lock = DISABLE_INTERRUPT();
SYS_KDEBUG_LOG(KDBG_SCHED, ("remove task[%.*s], the priority: %d\n",
NAME_NUM_MAX, task->task_base_info.name,
task->task_dync_sched_member.cur_prio));
SYS_KDEBUG_LOG(KDBG_SCHED, ("remove task[%.*s], the priority: %d\n", NAME_NUM_MAX, task->task_base_info.name, task->task_dync_sched_member.cur_prio));
DoubleLinkListRmNode(&(task->task_dync_sched_member.sched_link));
if (IsDoubleLinkListEmpty(&(Assign.os_assign_read_vector.priority_ready_vector[task->task_dync_sched_member.cur_prio]))) {
if (IsDoubleLinkListEmpty(&(Assign.os_assign_ready_vector.priority_ready_vector[task->task_dync_sched_member.cur_prio]))) {
#if KTASK_PRIORITY_MAX > 32
CLEAR_FLAG(&Assign.os_assign_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
if (Assign.os_assign_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
CLEAR_FLAG(&Assign.os_assign_read_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
CLEAR_FLAG(&Assign.os_assign_ready_vector.ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
if (Assign.os_assign_ready_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
CLEAR_FLAG(&Assign.os_assign_ready_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
}
number = PrioCaculate(Assign.os_assign_read_vector.priority_ready_group);
highest_priority = (number * 8) + PrioCaculate(Assign.os_assign_read_vector.ready_vector[number]);
number = PrioCaculate(Assign.os_assign_ready_vector.priority_ready_group);
highest_priority = (number * 8) + PrioCaculate(Assign.os_assign_ready_vector.ready_vector[number]);
#else
CLEAR_FLAG(&Assign.os_assign_read_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
highest_priority = PrioCaculate(Assign.os_assign_read_vector.priority_ready_group);
CLEAR_FLAG(&Assign.os_assign_ready_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
highest_priority = PrioCaculate(Assign.os_assign_ready_vector.priority_ready_group);
#endif
Assign.os_assign_read_vector.highest_prio = highest_priority;
Assign.os_assign_ready_vector.highest_prio = highest_priority;
}
ENABLE_INTERRUPT(lock);
@@ -305,13 +305,13 @@ x_err_t YieldOsAssign(void)
}
/* if the bitmap is empty then do not switch */
if(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_read_vector)) {
if (RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_ready_vector)) {
ENABLE_INTERRUPT(lock);
return -ERROR;
}
highest_prio = Assign.os_assign_read_vector.highest_prio;
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
highest_prio = Assign.os_assign_ready_vector.highest_prio;
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
from_task = Assign.os_running_task;
@@ -331,12 +331,13 @@ x_err_t YieldOsAssign(void)
Assign.os_running_task = new_task;
SYS_KDEBUG_LOG(KDBG_SCHED,
("[%d]switch to priority#%d "
"task:%.*s(sp:0x%08x), "
"from task:%.*s(sp: 0x%08x)\n",
isrManager.done->getCounter(), highest_prio,
NAME_NUM_MAX, new_task->task_base_info.name, new_task->stack_point,
NAME_NUM_MAX, from_task->task_base_info.name, from_task->stack_point));
("[%s][%d]switch to priority#%d "
"task:%.*s(sp:0x%08x), "
"from task:%.*s(sp: 0x%08x)\n",
__func__,
isrManager.done->getCounter(), highest_prio,
NAME_NUM_MAX, new_task->task_base_info.name, new_task->stack_point,
NAME_NUM_MAX, from_task->task_base_info.name, from_task->stack_point));
#ifdef KERNEL_STACK_OVERFLOW_CHECK
_KTaskOsAssignStackCheck(new_task);
@@ -368,7 +369,7 @@ void StartupOsAssign(void)
{
struct TaskDescriptor *FirstRunningTask = NONE;
FirstRunningTask = ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
FirstRunningTask = ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
SetSystemRunningTask(FirstRunningTask);
SwitchToFirstRunningTask(FirstRunningTask);
@@ -384,7 +385,7 @@ void SysInitOsAssign(void)
KTASK_PRIORITY_MAX));
Assign.ready_vector_done = &SingleReadyVectorDone;
Assign.ready_vector_done->init(&Assign.os_assign_read_vector);
Assign.ready_vector_done->init(&Assign.os_assign_ready_vector);
ResetCriticalAreaLock();
}

View File

@@ -30,15 +30,17 @@
void _KTaskOsAssignStackCheck(struct TaskDescriptor *task)
{
NULL_PARAM_CHECK(task);
if ((x_ubase)task->stack_point <= (x_ubase)task->task_base_info.stack_start
|| (x_ubase)task->stack_point > (x_ubase)task->task_base_info.stack_start + (x_ubase)task->task_base_info.stack_depth) {
if ((x_ubase)task->stack_point<= (x_ubase)task->task_base_info.stack_start ||
(x_ubase)task->stack_point >
(x_ubase)task->task_base_info.stack_start + (x_ubase)task->task_base_info.stack_depth) {
KPrintf("task name:%s id:%d stack overflow,sp %p stacktop %p stack depth 0x%x\n", task->task_base_info.name,task->id.id,task->stack_point,(uint32*)task->task_base_info.stack_start + task->task_base_info.stack_depth,task->task_base_info.stack_depth);
KPrintf("task name:%s id:%d stack overflow,sp %p stacktop %p stack depth 0x%x\n",
task->task_base_info.name, task->id.id, task->stack_point,
(uint32*)task->task_base_info.stack_start + task->task_base_info.stack_depth,
task->task_base_info.stack_depth);
while (1);
}
while (1)
;
}
}
#endif

View File

@@ -258,8 +258,8 @@ x_err_t _KTaskPrioSet(KTaskDescriptorType task, uint8 prio)
#ifdef ARCH_SMP
HwLockSpinlock(&AssignSpinLock);
#endif
task->task_dync_sched_member.cur_prio = prio;
Assign.ready_vector_done->remove(task);
task->task_dync_sched_member.cur_prio = prio;
__BitmapSiteMask(task);
Assign.ready_vector_done->insert(task);
#ifdef ARCH_SMP

View File

@@ -109,10 +109,16 @@ static int32 _MutexObtain(struct Mutex *mutex, int32 msec)
SYS_KDEBUG_LOG(KDBG_IPC, ("mutex_take: suspend task: %s\n",
task->task_base_info.name));
if (task->task_dync_sched_member.cur_prio > mutex->holder->task_dync_sched_member.cur_prio)
{
KTaskPrioSet(mutex->holder->id.id, task->task_dync_sched_member.cur_prio);
}
/* pending task is removed from ready list,
so it wont affect the mutex holder;
if holder is stucked by others with higher priorities,
try fix this by design, instead of mutex.
Warning: dont use KTaskPrioSet, for it's bugged.
*/
// if (task->task_dync_sched_member.cur_prio > mutex->holder->task_dync_sched_member.cur_prio)
// {
// KTaskPrioSet(mutex->holder->id.id, task->task_dync_sched_member.cur_prio);
// }
LinklistSuspend(&(mutex->pend_list), task, LINKLIST_FLAG_PRIO);
@@ -164,10 +170,10 @@ static int32 _MutexAbandon(struct Mutex *mutex)
mutex->recursive_cnt --;
if (mutex->recursive_cnt == 0) {
if (mutex->origin_prio != mutex->holder->task_dync_sched_member.cur_prio)
{
KTaskPrioSet(mutex->holder->id.id, mutex->origin_prio);
}
// if (mutex->origin_prio != mutex->holder->task_dync_sched_member.cur_prio)
// {
// KTaskPrioSet(mutex->holder->id.id, mutex->origin_prio);
// }
if (!IsDoubleLinkListEmpty(&mutex->pend_list)) {
task = SYS_DOUBLE_LINKLIST_ENTRY(mutex->pend_list.node_next, struct TaskDescriptor, task_dync_sched_member.sched_link);

View File

@@ -40,7 +40,7 @@ static inline x_ubase SmpGetReadyVectorHighestPrio(void)
{
uint8 coreid = GetCpuId();
return ((Assign.os_assign_read_vector.highest_prio > Assign.smp_os_assign_ready_rector[coreid].highest_prio) ? Assign.os_assign_read_vector.highest_prio : Assign.smp_os_assign_ready_rector[coreid].highest_prio);
return ((Assign.os_assign_ready_vector.highest_prio > Assign.smp_os_assign_ready_vector[coreid].highest_prio) ? Assign.os_assign_ready_vector.highest_prio : Assign.smp_os_assign_ready_vector[coreid].highest_prio);
}
/*
@@ -51,13 +51,13 @@ static inline struct TaskDescriptor* SmpAssignTargetTaskSelect(void)
uint8 coreid = GetCpuId();
if (Assign.os_assign_read_vector.highest_prio > Assign.smp_os_assign_ready_rector[coreid].highest_prio)
if (Assign.os_assign_ready_vector.highest_prio > Assign.smp_os_assign_ready_vector[coreid].highest_prio)
{
return ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
return ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
}
else
{
return ChooseTaskWithHighestPrio(&Assign.smp_os_assign_ready_rector[coreid]);
return ChooseTaskWithHighestPrio(&Assign.smp_os_assign_ready_vector[coreid]);
}
}
@@ -98,7 +98,7 @@ static void SmpOsAssignInit(void)
{
int coreid = 0;
while(coreid < CPU_NUMBERS) {
Assign.ready_vector_done->init(&Assign.smp_os_assign_ready_rector[coreid]);
Assign.ready_vector_done->init(&Assign.smp_os_assign_ready_vector[coreid]);
Assign.smp_os_running_task[coreid] = NONE;
#ifdef ARCH_SMP
@@ -148,8 +148,8 @@ void KTaskOsAssign(void)
runningtask = Assign.smp_os_running_task[coreid];
/* if the bitmap is empty then do not switch */
if((RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_read_vector)) &&
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_rector[coreid]))) {
if((RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_ready_vector)) &&
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_vector[coreid]))) {
return;
}
@@ -210,8 +210,8 @@ void KTaskOsAssignDoIrqSwitch(void *context)
runningtask = Assign.smp_os_running_task[coreid];
if((RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_read_vector)) &&
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_rector[coreid]))) {
if((RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_ready_vector)) &&
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_vector[coreid]))) {
return;
}
@@ -260,10 +260,10 @@ static void UncombineInsert(struct TaskDescriptor *task)
NULL_PARAM_CHECK(task);
#if KTASK_PRIORITY_MAX > 32
MERGE_FLAG(&Assign.os_assign_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
MERGE_FLAG(&Assign.os_assign_ready_vector.ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
#endif
MERGE_FLAG(&Assign.os_assign_read_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
AssignPolicyInsert(task, &Assign.os_assign_read_vector);
MERGE_FLAG(&Assign.os_assign_ready_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
AssignPolicyInsert(task, &Assign.os_assign_ready_vector);
cpu_mask = CPU_MASK ^ (1 << GetCpuId());
HwSendIpi(ASSIGN_IPI, cpu_mask);
}
@@ -273,10 +273,10 @@ static void ComnbineInsert(struct TaskDescriptor *task, int coreid)
NULL_PARAM_CHECK(task);
#if KTASK_PRIORITY_MAX > 32
MERGE_FLAG(&Assign.smp_os_assign_ready_rector[coreid].ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
MERGE_FLAG(&Assign.smp_os_assign_ready_vector[coreid].ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
#endif
MERGE_FLAG(&Assign.smp_os_assign_ready_rector[coreid].priority_ready_group, task->task_dync_sched_member.bitmap_column);
AssignPolicyInsert(task, &Assign.smp_os_assign_ready_rector[coreid]);
MERGE_FLAG(&Assign.smp_os_assign_ready_vector[coreid].priority_ready_group, task->task_dync_sched_member.bitmap_column);
AssignPolicyInsert(task, &Assign.smp_os_assign_ready_vector[coreid]);
if (coreid != task->task_smp_info.combined_coreid)
{
uint32 cpu_mask;
@@ -324,22 +324,22 @@ static void UncombineRemove(struct TaskDescriptor *task)
NULL_PARAM_CHECK(task);
if (IsDoubleLinkListEmpty(&(Assign.os_assign_read_vector.priority_ready_vector[task->task_dync_sched_member.cur_prio]))) {
if (IsDoubleLinkListEmpty(&(Assign.os_assign_ready_vector.priority_ready_vector[task->task_dync_sched_member.cur_prio]))) {
#if KTASK_PRIORITY_MAX > 32
CLEAR_FLAG(&Assign.os_assign_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
if (Assign.os_assign_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
CLEAR_FLAG(&Assign.os_assign_read_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
CLEAR_FLAG(&Assign.os_assign_ready_vector.ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
if (Assign.os_assign_ready_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
CLEAR_FLAG(&Assign.os_assign_ready_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
}
number = PrioCaculate(Assign.os_assign_read_vector.priority_ready_group);
highest_priority = (number * 8) + PrioCaculate(Assign.os_assign_read_vector.ready_vector[number]);
number = PrioCaculate(Assign.os_assign_ready_vector.priority_ready_group);
highest_priority = (number * 8) + PrioCaculate(Assign.os_assign_ready_vector.ready_vector[number]);
#else
CLEAR_FLAG(&Assign.os_assign_read_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
highest_priority = PrioCaculate(Assign.os_assign_read_vector.priority_ready_group);
CLEAR_FLAG(&Assign.os_assign_ready_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
highest_priority = PrioCaculate(Assign.os_assign_ready_vector.priority_ready_group);
#endif
Assign.os_assign_read_vector.highest_prio = highest_priority;
Assign.os_assign_ready_vector.highest_prio = highest_priority;
}
}
@@ -351,19 +351,19 @@ static void CombineRemove(struct TaskDescriptor *task)
NULL_PARAM_CHECK(task);
if (IsDoubleLinkListEmpty(&(Assign.smp_os_assign_ready_rector[combined_coreid].priority_ready_vector[task->task_dync_sched_member.cur_prio]))) {
if (IsDoubleLinkListEmpty(&(Assign.smp_os_assign_ready_vector[combined_coreid].priority_ready_vector[task->task_dync_sched_member.cur_prio]))) {
#if KTASK_PRIORITY_MAX > 32
CLEAR_FLAG(&Assign.smp_os_assign_ready_rector[combined_coreid].ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
if (Assign.os_assign_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
CLEAR_FLAG(&Assign.smp_os_assign_ready_rector[combined_coreid].priority_ready_group, task->task_dync_sched_member.bitmap_column);
CLEAR_FLAG(&Assign.smp_os_assign_ready_vector[combined_coreid].ready_vector[task->task_dync_sched_member.bitmap_offset], task->task_dync_sched_member.bitmap_row);
if (Assign.os_assign_ready_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
CLEAR_FLAG(&Assign.smp_os_assign_ready_vector[combined_coreid].priority_ready_group, task->task_dync_sched_member.bitmap_column);
}
number = PrioCaculate(Assign.smp_os_assign_ready_rector[combined_coreid].priority_ready_group);
highest_prio_on_core = (number * 8) + PrioCaculate(Assign.smp_os_assign_ready_rector[combined_coreid].ready_vector[number]);
number = PrioCaculate(Assign.smp_os_assign_ready_vector[combined_coreid].priority_ready_group);
highest_prio_on_core = (number * 8) + PrioCaculate(Assign.smp_os_assign_ready_vector[combined_coreid].ready_vector[number]);
#else
CLEAR_FLAG(&Assign.smp_os_assign_ready_rector[combined_coreid].priority_ready_group, task->task_dync_sched_member.bitmap_column);
highest_prio_on_core = PrioCaculate(Assign.smp_os_assign_ready_rector[combined_coreid].priority_ready_group);
CLEAR_FLAG(&Assign.smp_os_assign_ready_vector[combined_coreid].priority_ready_group, task->task_dync_sched_member.bitmap_column);
highest_prio_on_core = PrioCaculate(Assign.smp_os_assign_ready_vector[combined_coreid].priority_ready_group);
#endif
Assign.smp_os_assign_ready_rector[combined_coreid].highest_prio = highest_prio_on_core;
Assign.smp_os_assign_ready_vector[combined_coreid].highest_prio = highest_prio_on_core;
}
}
@@ -420,8 +420,8 @@ x_err_t YieldOsAssign(void)
return -ERROR;
}
/* if the bitmap is empty then do not switch */
if((RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_read_vector)) &&
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_rector[coreid]))) {
if((RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_ready_vector)) &&
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_vector[coreid]))) {
HwUnlockSpinlock(&AssignSpinLock);
ENABLE_INTERRUPT(lock);
return -ERROR;
@@ -481,7 +481,7 @@ void SysInitOsAssign(void)
Assign.ready_vector_done = &ready_vector_done;
Assign.smp_assign_done = &smp_assign_done;
Assign.ready_vector_done->init(&Assign.os_assign_read_vector);
Assign.ready_vector_done->init(&Assign.os_assign_ready_vector);
Assign.smp_assign_done->SmpInit();
}

View File

@@ -301,7 +301,9 @@ void CheckTimerList(void)
((WorkQueueDoneType *)sys_workq->done)->WorkSubmit((WorkqueueType *)sys_workq->property, t->t_work, 0);
lock = CriticalAreaLock();
} else {
KPrintf("sortlist run unactive timer(%s), quit this timer\n", t->name);
// KPrintf("sortlist run unactive timer(%s), current %d deadline %d quit this timer\n",
// t->name, current_tick, t->deadline_timeslice);
break;
}
}
else

View File

@@ -1,4 +1,4 @@
# SRC_FILES := ping.c lwip_ping_demo.c lwip_config_demo.c lwip_dhcp_demo.c iperf.c http_test.c
SRC_FILES := ping.c lwip_ping_demo.c lwip_tcp_demo.c lwip_udp_demo.c tcpecho_raw.c lwip_config_demo.c lwip_dhcp_demo.c iperf.c
SRC_FILES := ping.c lwip_ping_demo.c lwip_udp_demo.c tcpecho_raw.c lwip_config_demo.c lwip_dhcp_demo.c
include $(KERNEL_ROOT)/compiler.mk

View File

@@ -101,7 +101,7 @@ void LwipTcpSendTest(int argc, char *argv[])
strcat(tcp_demo_msg, "\r\n");
if(argc >= 3) {
if (sscanf(argv[2], "%hhd.%hhd.%hhd.%hhd:%d", &tcp_server_ip[0], &tcp_server_ip[1], &tcp_server_ip[2], &tcp_server_ip[3], &tcp_server_port) == EOK) {
if (sscanf(argv[2], "%hhd.%hhd.%hhd.%hhd:%hhd", &tcp_server_ip[0], &tcp_server_ip[1], &tcp_server_ip[2], &tcp_server_ip[3], &tcp_server_port) == EOK) {
sscanf(argv[2], "%hhd.%hhd.%hhd.%hhd", &tcp_server_ip[0], &tcp_server_ip[1], &tcp_server_ip[2], &tcp_server_ip[3]);
}
sscanf(argv[3], "%d", &tcp_send_num);

View File

@@ -286,6 +286,7 @@ static inline int SerialDevDMARead(struct SerialHardwareDevice *serial_dev, stru
x_size_t read_dma_length;
x_size_t read_dma_size = SerialGetRxFifoLength(serial_dev);
lock = CriticalAreaLock();
if (serial_cfg->data_cfg.serial_buffer_size) {
if(read_length < (int)read_dma_size)
read_dma_length = read_length;

View File

@@ -31,7 +31,7 @@ static void PrintOctal(char *str, int len, uint64_t value)
char *cp;
int written_len;
written_len = sprintf(buf, "%0*lo", len, value);
written_len = sprintf(buf, "%0*llo", len, value);
cp = buf + written_len - len;
if (*cp == '0')