forked from xuos/xiuos
Merge branch 'prepare_for_master' of https://gitlink.org.cn/xuos/xiuos into jerryscript
This commit is contained in:
commit
987622d1e3
|
@ -272,7 +272,7 @@ CircularAreaAppType CircularAreaAppInit(uint32_t circular_area_length)
|
||||||
circular_area->p_tail = circular_area->data_buffer + circular_area_length;
|
circular_area->p_tail = circular_area->data_buffer + circular_area_length;
|
||||||
circular_area->area_length = circular_area_length;
|
circular_area->area_length = circular_area_length;
|
||||||
|
|
||||||
printf("CircularAreaAppInit done p_head %8p p_tail %8p length %u\n",
|
printf("CircularAreaAppInit done p_head %8p p_tail %8p length %lu\n",
|
||||||
circular_area->p_head, circular_area->p_tail, circular_area->area_length);
|
circular_area->p_head, circular_area->p_tail, circular_area->area_length);
|
||||||
|
|
||||||
circular_area->CircularAreaAppOperations = &CircularAreaAppOperations;
|
circular_area->CircularAreaAppOperations = &CircularAreaAppOperations;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
export CROSS_COMPILE ?=/usr/bin/arm-none-eabi-
|
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 -Wformat -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 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 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
|
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
|
||||||
|
|
|
@ -281,6 +281,7 @@ static void SdCardTask(void* parameter)
|
||||||
sd_card_status = 0;
|
sd_card_status = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
MdelayKTask(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,8 +55,8 @@ struct smp_assign_done
|
||||||
};
|
};
|
||||||
struct Assign
|
struct Assign
|
||||||
{
|
{
|
||||||
struct OsAssignReadyVector os_assign_read_vector;
|
struct OsAssignReadyVector os_assign_ready_vector;
|
||||||
struct OsAssignReadyVector smp_os_assign_ready_rector[CPU_NUMBERS];
|
struct OsAssignReadyVector smp_os_assign_ready_vector[CPU_NUMBERS];
|
||||||
struct TaskDescriptor *smp_os_running_task[CPU_NUMBERS];
|
struct TaskDescriptor *smp_os_running_task[CPU_NUMBERS];
|
||||||
|
|
||||||
struct PriorityReadyVectorDone *ready_vector_done;
|
struct PriorityReadyVectorDone *ready_vector_done;
|
||||||
|
@ -73,7 +73,7 @@ void HwInterruptcontextSwitch( x_ubase from, x_ubase to,struct TaskDescriptor *t
|
||||||
#else
|
#else
|
||||||
struct Assign
|
struct Assign
|
||||||
{
|
{
|
||||||
struct OsAssignReadyVector os_assign_read_vector;
|
struct OsAssignReadyVector os_assign_ready_vector;
|
||||||
struct TaskDescriptor *os_running_task;
|
struct TaskDescriptor *os_running_task;
|
||||||
|
|
||||||
struct PriorityReadyVectorDone *ready_vector_done;
|
struct PriorityReadyVectorDone *ready_vector_done;
|
||||||
|
|
|
@ -183,6 +183,7 @@ x_err_t KTaskDelete(int32 id);
|
||||||
x_err_t YieldOsAssign(void);
|
x_err_t YieldOsAssign(void);
|
||||||
x_err_t DelayKTask(x_ticks_t tick);
|
x_err_t DelayKTask(x_ticks_t tick);
|
||||||
x_err_t MdelayKTask(uint32 ms);
|
x_err_t MdelayKTask(uint32 ms);
|
||||||
|
// KTaskPrioSet is bugged, dont use this
|
||||||
x_err_t KTaskPrioSet(int32 id, uint8 prio);
|
x_err_t KTaskPrioSet(int32 id, uint8 prio);
|
||||||
x_err_t KTaskCoreCombine(int32 id, uint8 coreid);
|
x_err_t KTaskCoreCombine(int32 id, uint8 coreid);
|
||||||
x_err_t KTaskCoreUnCombine(int32 id);
|
x_err_t KTaskCoreUnCombine(int32 id);
|
||||||
|
|
|
@ -47,12 +47,12 @@ static void Task1Entry(void *parameter)
|
||||||
|
|
||||||
#ifdef ARCH_SMP
|
#ifdef ARCH_SMP
|
||||||
if (0 == strncmp(parameter,"-b",strlen("-b"))) { ///< if tasks bind to cpu 0
|
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 {
|
} else {
|
||||||
head = &(Assign.os_assign_read_vector.priority_ready_vector[PRIORITY]);
|
head = &(Assign.os_assign_ready_vector.priority_ready_vector[PRIORITY]);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
head = &(Assign.os_assign_read_vector.priority_ready_vector[PRIORITY]);
|
head = &(Assign.os_assign_ready_vector.priority_ready_vector[PRIORITY]);
|
||||||
#endif
|
#endif
|
||||||
while(cnt--) {
|
while(cnt--) {
|
||||||
#ifdef TOOL_SHELL
|
#ifdef TOOL_SHELL
|
||||||
|
|
|
@ -39,28 +39,27 @@ static struct PriorityReadyVectorDone SingleReadyVectorDone =
|
||||||
*/
|
*/
|
||||||
void KTaskOsAssign(void)
|
void KTaskOsAssign(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
x_ubase highest_prio = 0;
|
x_ubase highest_prio = 0;
|
||||||
int need_insert_from_task = 0;
|
int need_insert_from_task = 0;
|
||||||
struct TaskDescriptor *new_task = NONE;
|
struct TaskDescriptor *new_task = NONE;
|
||||||
struct TaskDescriptor *from_task = NONE;
|
struct TaskDescriptor *from_task = NONE;
|
||||||
|
|
||||||
if(GetOsAssignLockLevel() >= 1) {
|
if(GetOsAssignLockLevel() >= 1) {
|
||||||
return;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isrManager.done->isInIsr() ){
|
if( isrManager.done->isInIsr() ){
|
||||||
isrManager.done->setSwitchTrigerFlag();
|
isrManager.done->setSwitchTrigerFlag();
|
||||||
return;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if the bitmap is empty then do not switch */
|
/* 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;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
highest_prio = Assign.os_assign_read_vector.highest_prio;
|
highest_prio = Assign.os_assign_ready_vector.highest_prio;
|
||||||
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
|
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
|
||||||
|
|
||||||
if(RET_TRUE != JudgeKTaskStatIsRunning(Assign.os_running_task)) {
|
if(RET_TRUE != JudgeKTaskStatIsRunning(Assign.os_running_task)) {
|
||||||
CHECK(NONE != new_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 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) {
|
if(highest_prio < Assign.os_running_task->task_dync_sched_member.cur_prio) {
|
||||||
return;
|
goto exit;
|
||||||
} else {
|
} else {
|
||||||
need_insert_from_task = 1;
|
need_insert_from_task = 1;
|
||||||
}
|
}
|
||||||
|
@ -108,6 +107,8 @@ SWITCH:
|
||||||
Assign.ready_vector_done->remove(Assign.os_running_task);
|
Assign.ready_vector_done->remove(Assign.os_running_task);
|
||||||
KTaskStatSetAsRunning(Assign.os_running_task);
|
KTaskStatSetAsRunning(Assign.os_running_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,12 +130,12 @@ void KTaskOsAssignDoIrqSwitch(void *context)
|
||||||
|
|
||||||
isrManager.done->clearSwitchTrigerFlag();
|
isrManager.done->clearSwitchTrigerFlag();
|
||||||
/* if the bitmap is empty then do not switch */
|
/* 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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
highest_prio = Assign.os_assign_read_vector.highest_prio;
|
highest_prio = Assign.os_assign_ready_vector.highest_prio;
|
||||||
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
|
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
|
||||||
|
|
||||||
if(RET_TRUE != JudgeKTaskStatIsRunning(Assign.os_running_task)) {
|
if(RET_TRUE != JudgeKTaskStatIsRunning(Assign.os_running_task)) {
|
||||||
CHECK(NONE != new_task);
|
CHECK(NONE != new_task);
|
||||||
|
@ -165,9 +166,10 @@ SWITCH:
|
||||||
Assign.os_running_task = new_task;
|
Assign.os_running_task = new_task;
|
||||||
|
|
||||||
SYS_KDEBUG_LOG(KDBG_SCHED,
|
SYS_KDEBUG_LOG(KDBG_SCHED,
|
||||||
("[%d]switch to priority#%d "
|
("[%s][%d]switch to priority#%d "
|
||||||
"task:%.*s(sp:0x%08x), "
|
"task:%.*s(sp:0x%08x), "
|
||||||
"from task:%.*s(sp: 0x%08x)\n",
|
"from task:%.*s(sp: 0x%08x)\n",
|
||||||
|
__func__,
|
||||||
isrManager.done->getCounter(), highest_prio,
|
isrManager.done->getCounter(), highest_prio,
|
||||||
NAME_NUM_MAX, new_task->task_base_info.name, new_task->stack_point,
|
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));
|
NAME_NUM_MAX, from_task->task_base_info.name, from_task->stack_point));
|
||||||
|
@ -176,7 +178,6 @@ SWITCH:
|
||||||
_KTaskOsAssignStackCheck(new_task);
|
_KTaskOsAssignStackCheck(new_task);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
SYS_KDEBUG_LOG(KDBG_SCHED, ("switch in interrupt\n"));
|
SYS_KDEBUG_LOG(KDBG_SCHED, ("switch in interrupt\n"));
|
||||||
HwInterruptcontextSwitch((x_ubase)&from_task->stack_point,
|
HwInterruptcontextSwitch((x_ubase)&from_task->stack_point,
|
||||||
(x_ubase)&new_task->stack_point, new_task, context);
|
(x_ubase)&new_task->stack_point, new_task, context);
|
||||||
|
@ -209,15 +210,15 @@ void KTaskInsertToReadyVector(struct TaskDescriptor *task)
|
||||||
lock = DISABLE_INTERRUPT();
|
lock = DISABLE_INTERRUPT();
|
||||||
|
|
||||||
KTaskStatSetAsReady(task);
|
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",
|
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));
|
NAME_NUM_MAX, task->task_base_info.name, task->task_dync_sched_member.cur_prio));
|
||||||
|
|
||||||
#if KTASK_PRIORITY_MAX > 32
|
#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
|
#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);
|
ENABLE_INTERRUPT(lock);
|
||||||
}
|
}
|
||||||
|
@ -235,28 +236,27 @@ void KTaskOsAssignRemoveKTask(struct TaskDescriptor *task)
|
||||||
x_ubase highest_priority = 0;
|
x_ubase highest_priority = 0;
|
||||||
|
|
||||||
NULL_PARAM_CHECK(task);
|
NULL_PARAM_CHECK(task);
|
||||||
|
;
|
||||||
|
|
||||||
lock = DISABLE_INTERRUPT();
|
lock = DISABLE_INTERRUPT();
|
||||||
|
|
||||||
SYS_KDEBUG_LOG(KDBG_SCHED, ("remove task[%.*s], the priority: %d\n",
|
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));
|
||||||
NAME_NUM_MAX, task->task_base_info.name,
|
|
||||||
task->task_dync_sched_member.cur_prio));
|
|
||||||
|
|
||||||
DoubleLinkListRmNode(&(task->task_dync_sched_member.sched_link));
|
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
|
#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);
|
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_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
|
if (Assign.os_assign_ready_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.priority_ready_group, task->task_dync_sched_member.bitmap_column);
|
||||||
}
|
}
|
||||||
number = PrioCaculate(Assign.os_assign_read_vector.priority_ready_group);
|
number = PrioCaculate(Assign.os_assign_ready_vector.priority_ready_group);
|
||||||
highest_priority = (number * 8) + PrioCaculate(Assign.os_assign_read_vector.ready_vector[number]);
|
highest_priority = (number * 8) + PrioCaculate(Assign.os_assign_ready_vector.ready_vector[number]);
|
||||||
#else
|
#else
|
||||||
CLEAR_FLAG(&Assign.os_assign_read_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
|
CLEAR_FLAG(&Assign.os_assign_ready_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
|
||||||
highest_priority = PrioCaculate(Assign.os_assign_read_vector.priority_ready_group);
|
highest_priority = PrioCaculate(Assign.os_assign_ready_vector.priority_ready_group);
|
||||||
#endif
|
#endif
|
||||||
Assign.os_assign_read_vector.highest_prio = highest_priority;
|
Assign.os_assign_ready_vector.highest_prio = highest_priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
ENABLE_INTERRUPT(lock);
|
ENABLE_INTERRUPT(lock);
|
||||||
|
@ -305,13 +305,13 @@ x_err_t YieldOsAssign(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if the bitmap is empty then do not switch */
|
/* 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);
|
ENABLE_INTERRUPT(lock);
|
||||||
return -ERROR;
|
return -ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
highest_prio = Assign.os_assign_read_vector.highest_prio;
|
highest_prio = Assign.os_assign_ready_vector.highest_prio;
|
||||||
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
|
new_task = ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
|
||||||
|
|
||||||
from_task = Assign.os_running_task;
|
from_task = Assign.os_running_task;
|
||||||
|
|
||||||
|
@ -331,9 +331,10 @@ x_err_t YieldOsAssign(void)
|
||||||
Assign.os_running_task = new_task;
|
Assign.os_running_task = new_task;
|
||||||
|
|
||||||
SYS_KDEBUG_LOG(KDBG_SCHED,
|
SYS_KDEBUG_LOG(KDBG_SCHED,
|
||||||
("[%d]switch to priority#%d "
|
("[%s][%d]switch to priority#%d "
|
||||||
"task:%.*s(sp:0x%08x), "
|
"task:%.*s(sp:0x%08x), "
|
||||||
"from task:%.*s(sp: 0x%08x)\n",
|
"from task:%.*s(sp: 0x%08x)\n",
|
||||||
|
__func__,
|
||||||
isrManager.done->getCounter(), highest_prio,
|
isrManager.done->getCounter(), highest_prio,
|
||||||
NAME_NUM_MAX, new_task->task_base_info.name, new_task->stack_point,
|
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));
|
NAME_NUM_MAX, from_task->task_base_info.name, from_task->stack_point));
|
||||||
|
@ -368,7 +369,7 @@ void StartupOsAssign(void)
|
||||||
{
|
{
|
||||||
struct TaskDescriptor *FirstRunningTask = NONE;
|
struct TaskDescriptor *FirstRunningTask = NONE;
|
||||||
|
|
||||||
FirstRunningTask = ChooseTaskWithHighestPrio(&Assign.os_assign_read_vector);
|
FirstRunningTask = ChooseTaskWithHighestPrio(&Assign.os_assign_ready_vector);
|
||||||
|
|
||||||
SetSystemRunningTask(FirstRunningTask);
|
SetSystemRunningTask(FirstRunningTask);
|
||||||
SwitchToFirstRunningTask(FirstRunningTask);
|
SwitchToFirstRunningTask(FirstRunningTask);
|
||||||
|
@ -384,7 +385,7 @@ void SysInitOsAssign(void)
|
||||||
KTASK_PRIORITY_MAX));
|
KTASK_PRIORITY_MAX));
|
||||||
|
|
||||||
Assign.ready_vector_done = &SingleReadyVectorDone;
|
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();
|
ResetCriticalAreaLock();
|
||||||
}
|
}
|
|
@ -30,14 +30,16 @@
|
||||||
void _KTaskOsAssignStackCheck(struct TaskDescriptor *task)
|
void _KTaskOsAssignStackCheck(struct TaskDescriptor *task)
|
||||||
{
|
{
|
||||||
NULL_PARAM_CHECK(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 ||
|
KPrintf("task name:%s id:%d stack overflow,sp %p stacktop %p stack depth 0x%x\n",
|
||||||
(x_ubase)task->stack_point >
|
task->task_base_info.name, task->id.id, task->stack_point,
|
||||||
(x_ubase)task->task_base_info.stack_start + (x_ubase)task->task_base_info.stack_depth) {
|
(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
|
#endif
|
||||||
|
|
|
@ -258,8 +258,8 @@ x_err_t _KTaskPrioSet(KTaskDescriptorType task, uint8 prio)
|
||||||
#ifdef ARCH_SMP
|
#ifdef ARCH_SMP
|
||||||
HwLockSpinlock(&AssignSpinLock);
|
HwLockSpinlock(&AssignSpinLock);
|
||||||
#endif
|
#endif
|
||||||
task->task_dync_sched_member.cur_prio = prio;
|
|
||||||
Assign.ready_vector_done->remove(task);
|
Assign.ready_vector_done->remove(task);
|
||||||
|
task->task_dync_sched_member.cur_prio = prio;
|
||||||
__BitmapSiteMask(task);
|
__BitmapSiteMask(task);
|
||||||
Assign.ready_vector_done->insert(task);
|
Assign.ready_vector_done->insert(task);
|
||||||
#ifdef ARCH_SMP
|
#ifdef ARCH_SMP
|
||||||
|
|
|
@ -109,10 +109,16 @@ static int32 _MutexObtain(struct Mutex *mutex, int32 msec)
|
||||||
SYS_KDEBUG_LOG(KDBG_IPC, ("mutex_take: suspend task: %s\n",
|
SYS_KDEBUG_LOG(KDBG_IPC, ("mutex_take: suspend task: %s\n",
|
||||||
task->task_base_info.name));
|
task->task_base_info.name));
|
||||||
|
|
||||||
if (task->task_dync_sched_member.cur_prio > mutex->holder->task_dync_sched_member.cur_prio)
|
/* pending task is removed from ready list,
|
||||||
{
|
so it wont affect the mutex holder;
|
||||||
KTaskPrioSet(mutex->holder->id.id, task->task_dync_sched_member.cur_prio);
|
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);
|
LinklistSuspend(&(mutex->pend_list), task, LINKLIST_FLAG_PRIO);
|
||||||
|
|
||||||
|
@ -164,10 +170,10 @@ static int32 _MutexAbandon(struct Mutex *mutex)
|
||||||
|
|
||||||
mutex->recursive_cnt --;
|
mutex->recursive_cnt --;
|
||||||
if (mutex->recursive_cnt == 0) {
|
if (mutex->recursive_cnt == 0) {
|
||||||
if (mutex->origin_prio != mutex->holder->task_dync_sched_member.cur_prio)
|
// if (mutex->origin_prio != mutex->holder->task_dync_sched_member.cur_prio)
|
||||||
{
|
// {
|
||||||
KTaskPrioSet(mutex->holder->id.id, mutex->origin_prio);
|
// KTaskPrioSet(mutex->holder->id.id, mutex->origin_prio);
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (!IsDoubleLinkListEmpty(&mutex->pend_list)) {
|
if (!IsDoubleLinkListEmpty(&mutex->pend_list)) {
|
||||||
task = SYS_DOUBLE_LINKLIST_ENTRY(mutex->pend_list.node_next, struct TaskDescriptor, task_dync_sched_member.sched_link);
|
task = SYS_DOUBLE_LINKLIST_ENTRY(mutex->pend_list.node_next, struct TaskDescriptor, task_dync_sched_member.sched_link);
|
||||||
|
|
|
@ -40,7 +40,7 @@ static inline x_ubase SmpGetReadyVectorHighestPrio(void)
|
||||||
{
|
{
|
||||||
uint8 coreid = GetCpuId();
|
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();
|
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
|
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;
|
int coreid = 0;
|
||||||
while(coreid < CPU_NUMBERS) {
|
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;
|
Assign.smp_os_running_task[coreid] = NONE;
|
||||||
|
|
||||||
#ifdef ARCH_SMP
|
#ifdef ARCH_SMP
|
||||||
|
@ -148,8 +148,8 @@ void KTaskOsAssign(void)
|
||||||
runningtask = Assign.smp_os_running_task[coreid];
|
runningtask = Assign.smp_os_running_task[coreid];
|
||||||
|
|
||||||
/* if the bitmap is empty then do not switch */
|
/* 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)) &&
|
||||||
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_rector[coreid]))) {
|
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_vector[coreid]))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,8 +210,8 @@ void KTaskOsAssignDoIrqSwitch(void *context)
|
||||||
|
|
||||||
runningtask = Assign.smp_os_running_task[coreid];
|
runningtask = Assign.smp_os_running_task[coreid];
|
||||||
|
|
||||||
if((RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_read_vector)) &&
|
if((RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.os_assign_ready_vector)) &&
|
||||||
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_rector[coreid]))) {
|
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_vector[coreid]))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,10 +260,10 @@ static void UncombineInsert(struct TaskDescriptor *task)
|
||||||
NULL_PARAM_CHECK(task);
|
NULL_PARAM_CHECK(task);
|
||||||
|
|
||||||
#if KTASK_PRIORITY_MAX > 32
|
#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
|
#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);
|
||||||
AssignPolicyInsert(task, &Assign.os_assign_read_vector);
|
AssignPolicyInsert(task, &Assign.os_assign_ready_vector);
|
||||||
cpu_mask = CPU_MASK ^ (1 << GetCpuId());
|
cpu_mask = CPU_MASK ^ (1 << GetCpuId());
|
||||||
HwSendIpi(ASSIGN_IPI, cpu_mask);
|
HwSendIpi(ASSIGN_IPI, cpu_mask);
|
||||||
}
|
}
|
||||||
|
@ -273,10 +273,10 @@ static void ComnbineInsert(struct TaskDescriptor *task, int coreid)
|
||||||
NULL_PARAM_CHECK(task);
|
NULL_PARAM_CHECK(task);
|
||||||
|
|
||||||
#if KTASK_PRIORITY_MAX > 32
|
#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
|
#endif
|
||||||
MERGE_FLAG(&Assign.smp_os_assign_ready_rector[coreid].priority_ready_group, task->task_dync_sched_member.bitmap_column);
|
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_rector[coreid]);
|
AssignPolicyInsert(task, &Assign.smp_os_assign_ready_vector[coreid]);
|
||||||
if (coreid != task->task_smp_info.combined_coreid)
|
if (coreid != task->task_smp_info.combined_coreid)
|
||||||
{
|
{
|
||||||
uint32 cpu_mask;
|
uint32 cpu_mask;
|
||||||
|
@ -324,22 +324,22 @@ static void UncombineRemove(struct TaskDescriptor *task)
|
||||||
|
|
||||||
NULL_PARAM_CHECK(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
|
#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);
|
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_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
|
if (Assign.os_assign_ready_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.priority_ready_group, task->task_dync_sched_member.bitmap_column);
|
||||||
}
|
}
|
||||||
number = PrioCaculate(Assign.os_assign_read_vector.priority_ready_group);
|
number = PrioCaculate(Assign.os_assign_ready_vector.priority_ready_group);
|
||||||
highest_priority = (number * 8) + PrioCaculate(Assign.os_assign_read_vector.ready_vector[number]);
|
highest_priority = (number * 8) + PrioCaculate(Assign.os_assign_ready_vector.ready_vector[number]);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
|
||||||
CLEAR_FLAG(&Assign.os_assign_read_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
|
CLEAR_FLAG(&Assign.os_assign_ready_vector.priority_ready_group, task->task_dync_sched_member.bitmap_column);
|
||||||
highest_priority = PrioCaculate(Assign.os_assign_read_vector.priority_ready_group);
|
highest_priority = PrioCaculate(Assign.os_assign_ready_vector.priority_ready_group);
|
||||||
#endif
|
#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);
|
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
|
#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);
|
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_read_vector.ready_vector[task->task_dync_sched_member.bitmap_offset] == 0) {
|
if (Assign.os_assign_ready_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].priority_ready_group, task->task_dync_sched_member.bitmap_column);
|
||||||
}
|
}
|
||||||
number = PrioCaculate(Assign.smp_os_assign_ready_rector[combined_coreid].priority_ready_group);
|
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_rector[combined_coreid].ready_vector[number]);
|
highest_prio_on_core = (number * 8) + PrioCaculate(Assign.smp_os_assign_ready_vector[combined_coreid].ready_vector[number]);
|
||||||
#else
|
#else
|
||||||
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].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);
|
highest_prio_on_core = PrioCaculate(Assign.smp_os_assign_ready_vector[combined_coreid].priority_ready_group);
|
||||||
#endif
|
#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;
|
return -ERROR;
|
||||||
}
|
}
|
||||||
/* if the bitmap is empty then do not switch */
|
/* 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)) &&
|
||||||
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_rector[coreid]))) {
|
(RET_TRUE == JudgeAssignReadyBitmapIsEmpty(&Assign.smp_os_assign_ready_vector[coreid]))) {
|
||||||
HwUnlockSpinlock(&AssignSpinLock);
|
HwUnlockSpinlock(&AssignSpinLock);
|
||||||
ENABLE_INTERRUPT(lock);
|
ENABLE_INTERRUPT(lock);
|
||||||
return -ERROR;
|
return -ERROR;
|
||||||
|
@ -481,7 +481,7 @@ void SysInitOsAssign(void)
|
||||||
|
|
||||||
Assign.ready_vector_done = &ready_vector_done;
|
Assign.ready_vector_done = &ready_vector_done;
|
||||||
Assign.smp_assign_done = &smp_assign_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();
|
Assign.smp_assign_done->SmpInit();
|
||||||
|
|
||||||
}
|
}
|
|
@ -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_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
|
include $(KERNEL_ROOT)/compiler.mk
|
||||||
|
|
|
@ -101,7 +101,7 @@ void LwipTcpSendTest(int argc, char *argv[])
|
||||||
strcat(tcp_demo_msg, "\r\n");
|
strcat(tcp_demo_msg, "\r\n");
|
||||||
|
|
||||||
if(argc >= 3) {
|
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[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);
|
sscanf(argv[3], "%d", &tcp_send_num);
|
||||||
|
|
|
@ -31,7 +31,7 @@ static void PrintOctal(char *str, int len, uint64_t value)
|
||||||
char *cp;
|
char *cp;
|
||||||
int written_len;
|
int written_len;
|
||||||
|
|
||||||
written_len = sprintf(buf, "%0*lo", len, value);
|
written_len = sprintf(buf, "%0*llo", len, value);
|
||||||
cp = buf + written_len - len;
|
cp = buf + written_len - len;
|
||||||
|
|
||||||
if (*cp == '0')
|
if (*cp == '0')
|
||||||
|
|
Loading…
Reference in New Issue