Первый:
typedef enum {
SVC_PROCESS_CREATE,
SVC_PROCESS_GET_FLAGS,
SVC_PROCESS_SET_FLAGS,
SVC_PROCESS_GET_PRIORITY,
SVC_PROCESS_SET_PRIORITY,
SVC_PROCESS_DESTROY,
SVC_PROCESS_SLEEP,
SVC_PROCESS_SWITCH_TEST,
SVC_PROCESS_INFO,
SVC_MUTEX_CREATE,
SVC_MUTEX_LOCK,
SVC_MUTEX_UNLOCK,
SVC_MUTEX_DESTROY,
....
....
}SVC;
Второй:
typedef enum {
SVC_PROCESS = 0x0,
SVC_PROCESS_CREATE,
SVC_PROCESS_GET_FLAGS,
SVC_PROCESS_SET_FLAGS,
SVC_PROCESS_GET_PRIORITY,
SVC_PROCESS_SET_PRIORITY,
SVC_PROCESS_DESTROY,
SVC_PROCESS_SLEEP,
//profiling
SVC_PROCESS_SWITCH_TEST,
SVC_PROCESS_INFO,
SVC_MUTEX = 0x100,
SVC_MUTEX_CREATE,
SVC_MUTEX_LOCK,
SVC_MUTEX_UNLOCK,
SVC_MUTEX_DESTROY,
....
....
}SVC;
Использование:
void svc(unsigned int num, unsigned int param1, unsigned int param2, unsigned int param3)
{
disable_interrupts();
++__KERNEL->svc_count;
switch (num)
{
//process related
case SVC_PROCESS_CREATE:
kprocess_create((REX*)param1, (PROCESS**)param2);
break;
case SVC_PROCESS_GET_FLAGS:
kprocess_get_flags((PROCESS*)param1, (unsigned int*)param2);
break;
case SVC_PROCESS_SET_FLAGS:
kprocess_set_flags((PROCESS*)param1, (unsigned int)param2);
break;
case SVC_PROCESS_GET_PRIORITY:
kprocess_get_priority((PROCESS*)param1, (unsigned int*)param2);
break;
case SVC_PROCESS_SET_PRIORITY:
kprocess_set_priority((PROCESS*)param1, (unsigned int)param2);
break;
case SVC_PROCESS_DESTROY:
kprocess_destroy((PROCESS*)param1);
break;
case SVC_PROCESS_SLEEP:
kprocess_sleep_current((TIME*)param1, PROCESS_SYNC_TIMER_ONLY, NULL);
break;
#if (KERNEL_PROFILING)
case SVC_PROCESS_SWITCH_TEST:
kprocess_switch_test();
break;
case SVC_PROCESS_INFO:
kprocess_info();
break;
#endif //KERNEL_PROFILING
//mutex related
case SVC_MUTEX_CREATE:
kmutex_create((MUTEX**)param1);
break;
case SVC_MUTEX_LOCK:
kmutex_lock((MUTEX*)param1, (TIME*)param2);
break;
case SVC_MUTEX_UNLOCK:
kmutex_unlock((MUTEX*)param1);
break;
case SVC_MUTEX_DESTROY:
kmutex_destroy((MUTEX*)param1);
break;
...
...
default:
kprocess_error_current(ERROR_INVALID_SVC) ;
}
--__KERNEL->svc_count;
enable_interrupts();
}
Для АРМ один из примеров дает прирост производительности в 10% (.5us). Вопрос: какой и почему?
Гугл врядли поможет, нужно лишь проявить смекалку. Ответы на следующей неделе.
....
....
}SVC;
Использование:
void svc(unsigned int num, unsigned int param1, unsigned int param2, unsigned int param3)
{
disable_interrupts();
++__KERNEL->svc_count;
switch (num)
{
//process related
case SVC_PROCESS_CREATE:
kprocess_create((REX*)param1, (PROCESS**)param2);
break;
case SVC_PROCESS_GET_FLAGS:
kprocess_get_flags((PROCESS*)param1, (unsigned int*)param2);
break;
case SVC_PROCESS_SET_FLAGS:
kprocess_set_flags((PROCESS*)param1, (unsigned int)param2);
break;
case SVC_PROCESS_GET_PRIORITY:
kprocess_get_priority((PROCESS*)param1, (unsigned int*)param2);
break;
case SVC_PROCESS_SET_PRIORITY:
kprocess_set_priority((PROCESS*)param1, (unsigned int)param2);
break;
case SVC_PROCESS_DESTROY:
kprocess_destroy((PROCESS*)param1);
break;
case SVC_PROCESS_SLEEP:
kprocess_sleep_current((TIME*)param1, PROCESS_SYNC_TIMER_ONLY, NULL);
break;
#if (KERNEL_PROFILING)
case SVC_PROCESS_SWITCH_TEST:
kprocess_switch_test();
break;
case SVC_PROCESS_INFO:
kprocess_info();
break;
#endif //KERNEL_PROFILING
//mutex related
case SVC_MUTEX_CREATE:
kmutex_create((MUTEX**)param1);
break;
case SVC_MUTEX_LOCK:
kmutex_lock((MUTEX*)param1, (TIME*)param2);
break;
case SVC_MUTEX_UNLOCK:
kmutex_unlock((MUTEX*)param1);
break;
case SVC_MUTEX_DESTROY:
kmutex_destroy((MUTEX*)param1);
break;
...
...
default:
kprocess_error_current(ERROR_INVALID_SVC)
}
--__KERNEL->svc_count;
enable_interrupts();
}
Для АРМ один из примеров дает прирост производительности в 10% (.5us). Вопрос: какой и почему?
Гугл врядли поможет, нужно лишь проявить смекалку. Ответы на следующей неделе.