diff --git a/include/microkernel/base_api.h b/include/microkernel/base_api.h index b90b34985a4..b45b91f06a3 100644 --- a/include/microkernel/base_api.h +++ b/include/microkernel/base_api.h @@ -102,6 +102,22 @@ struct k_msg { } extra; }; +/* Task control block */ + +struct k_proc { + struct k_proc *Forw; + struct k_proc *Back; + kpriority_t Prio; + ktask_t Ident; + uint32_t State; + uint32_t Group; + void (*fstart)(void); + char *workspace; + int worksize; + void (*fabort)(void); + struct k_args *Args; +}; + struct _k_mbox_struct { struct k_args *Writers; struct k_args *Readers; diff --git a/include/microkernel/task.h b/include/microkernel/task.h index dea1a7492d6..b5916169897 100644 --- a/include/microkernel/task.h +++ b/include/microkernel/task.h @@ -49,6 +49,7 @@ extern "C" { #define USR_GROUP 2 /* TASKGROUP SYS */ #define FPU_GROUP 4 /* TASKGROUP FPU */ +extern struct k_proc _k_task_list[]; extern void _task_ioctl(ktask_t, int); extern void _task_group_ioctl(ktask_group_t, int); diff --git a/kernel/microkernel/include/micro_private.h b/kernel/microkernel/include/micro_private.h index 93a568df700..712a71f54e5 100644 --- a/kernel/microkernel/include/micro_private.h +++ b/kernel/microkernel/include/micro_private.h @@ -42,7 +42,6 @@ #define OBJ_INDEX(objId) ((uint16_t)objId) -extern struct k_proc _k_task_list[]; extern struct k_tqhd _k_task_priority_list[]; extern int _k_task_count; diff --git a/kernel/microkernel/include/micro_private_types.h b/kernel/microkernel/include/micro_private_types.h index 59b48412761..beb2a38fe3e 100644 --- a/kernel/microkernel/include/micro_private_types.h +++ b/kernel/microkernel/include/micro_private_types.h @@ -145,22 +145,6 @@ struct k_tqhd { struct k_proc *Tail; }; -/* Task control block */ - -struct k_proc { - struct k_proc *Forw; - struct k_proc *Back; - kpriority_t Prio; - ktask_t Ident; - uint32_t State; - uint32_t Group; - void (*fstart)(void); - char *workspace; - int worksize; - void (*fabort)(void); - struct k_args *Args; -}; - /* Monitor record */ struct k_mrec { diff --git a/kernel/microkernel/k_task.c b/kernel/microkernel/k_task.c index 57ebfc81914..6678b0f9044 100644 --- a/kernel/microkernel/k_task.c +++ b/kernel/microkernel/k_task.c @@ -327,7 +327,7 @@ void task_abort_handler_set(void (*func)(void) /* abort handler */ void _k_task_op(struct k_args *A) { ktask_t Tid = A->Args.g1.task; - struct k_proc *X = _k_task_list + OBJ_INDEX(Tid); + struct k_proc *X = (struct k_proc *)Tid; switch (A->Args.g1.opt) { case TASK_START: @@ -499,7 +499,7 @@ kpriority_t task_priority_get(void) void _k_task_priority_set(struct k_args *A) { ktask_t Tid = A->Args.g1.task; - struct k_proc *X = _k_task_list + OBJ_INDEX(Tid); + struct k_proc *X = (struct k_proc *)Tid; _k_state_bit_set(X, TF_PRIO); X->Prio = A->Args.g1.prio; @@ -596,6 +596,8 @@ void task_entry_set(ktask_t task, /* task */ void (*func)(void) /* entry point */ ) { - _k_task_list[OBJ_INDEX(task)].fstart = func; + struct k_proc *X = (struct k_proc *)task; + + X->fstart = func; } diff --git a/scripts/sysgen b/scripts/sysgen index 188405e1d06..a750e52df55 100755 --- a/scripts/sysgen +++ b/scripts/sysgen @@ -377,7 +377,7 @@ def kernel_main_c_tasks(): kernel_main_c_out("\n" + "struct k_proc _k_task_list[%d] =\n" % (total_tasks) + "{\n") - ident = 0x00010000 + idx = 0 for task in task_list: prio = task[1] entry = task[2] @@ -403,10 +403,10 @@ def kernel_main_c_tasks(): group_bitmask ^= group_dictionary['SYS'] kernel_main_c_out( - " {NULL, NULL, %d, %#010x, " % (prio, ident) + + " {NULL, NULL, %d, (ktask_t)&_k_task_list[%d], " % (prio, idx) + "0x00000001, %#010x,\n" % (group_bitmask) + "%s, %s, %d, (taskabortfunction)NULL},\n" % (entry, stack, size)) - ident += 1 + idx += 1 kernel_main_c_out(" {NULL, NULL, %d, 0x00000000, " % (num_prios - 1) + "0x00000000, 0x00000000,\n" + @@ -941,10 +941,20 @@ def generate_zephyr_h_obj_ids(): zephyr_h_data += \ "#define %s ((kmbox_t)&_k_mbox_obj_%s)\n\n" % (name, name) + # task object id + + idx = 0 + kernel_main_c_out("\n") + for task in task_list: + name = task[0]; + zephyr_h_data += \ + "#define %s ((ktask_t)&_k_task_list[%d])\n" % (name, idx) + idx += 1 + + # all other object ids obj_types = [ - [task_list, 0], [pipe_list, 0], [map_list, 0], [pool_list, 0],