MBR (mbr) wrote,
MBR
mbr

Про свитч-кейсы

Казалось бы, банальная вещь. Но и здесь есть нюансы. Два примера и вопрос под катом.

Первый:
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). Вопрос: какой и почему?

Гугл врядли поможет, нужно лишь проявить смекалку. Ответы на следующей неделе.
Tags: embed, it
Subscribe

  • Самодельный антисептик

    Небольшой отчет по самостоятельному изготовлению антисептика. По компонентам понадобятся: - бихромат натрия - медный купорос - стабилизатор осадка.…

  • Победил битрикс

    Раньше рассказывал, как мы пытаемся битрикс внедрить. Сначала просто дал задачу вебщику подергать странички и собрать отчет по линкам. Ад. Там…

  • Советский инженер - это звучит гордо

    Порадовался с последнего стеба vladimir_akinin над программистами. Однако в комменты выползло какое-то количество старых пердунов,…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments