/*! \brief Fonction de création de l'application * * Fonction appelée lorsque l'initialisation de l'I2C est faite par le module_init * (point d'entrée de l'application) */ static int space_invader(void) { int err; err = rt_intr_enable(&isrDesc); if (err != 0) { printk("rt-app: Could not enable I2C ISR\n"); goto fail; } printk("rt-app: Enabled ISR\n"); err = rt_heap_create(&heap, "rt_heap", 240*320*2, 0); if(err != 0){ printk("rt-app: Could not create the rt heap\n"); goto fail; }else{ heap_created = 1; } printk("rt-app: RT-Heap created\n"); // On essaie de créer le tas pour le double buffering err = rt_heap_alloc(&heap, 240*320*2, TM_NONBLOCK, &fb_mem_rt); if(err != 0){ printk("rt-app: Could not allocate the rt heap\n"); goto fail; }else{ heap_allocated = 1; } printk("rt-app: RT-Heap allocated\n"); // On crée la tâche pour les invaders if(invaders_task_start() != 0){ goto fail; } // On crée la tâche pour les collisions if(hit_task_start() != 0){ goto fail; } // On crée la tâche pour la gestion des entrées/sorties if(io_task_start() != 0){ goto fail; } // On crée la tâche pour la gestion du frame buffer if(fb_task_start() != 0){ goto fail; } // On crée la tâche pour le vaisseau if(ship_task_start() != 0){ goto fail; } return 0; // En cas d'échec de création de l'ISR ou d'une tâche fail: cleanup_module(); return -1; }
int main(void) { unsigned long long before; RT_ALARM nalrm; RT_BUFFER nbuf; RT_COND ncond; RT_EVENT nevt; RT_HEAP nheap; RT_MUTEX nmtx; RT_PIPE npipe; RT_QUEUE nq; RT_SEM nsem; RT_TASK ntsk; int failed = 0; mlockall(MCL_CURRENT|MCL_FUTURE); rt_print_auto_init(1); rt_fprintf(stderr, "Checking for leaks in native skin services\n"); before = get_used(); check_native(rt_alarm_create(&nalrm, NULL)); check_native(rt_alarm_delete(&nalrm)); check_used("alarm", before, failed); before = get_used(); check_native(rt_buffer_create(&nbuf, NULL, 16384, B_PRIO)); check_native(rt_buffer_delete(&nbuf)); check_used("buffer", before, failed); before = get_used(); check_native(rt_cond_create(&ncond, NULL)); check_native(rt_cond_delete(&ncond)); check_used("cond", before, failed); before = get_used(); check_native(rt_event_create(&nevt, NULL, 0, EV_PRIO)); check_native(rt_event_delete(&nevt)); check_used("event", before, failed); before = get_used(); check_native(rt_heap_create(&nheap, "heap", 16384, H_PRIO | H_SHARED)); check_native(rt_heap_delete(&nheap)); check_used("heap", before, failed); before = get_used(); check_native(rt_mutex_create(&nmtx, NULL)); check_native(rt_mutex_delete(&nmtx)); check_used("mutex", before, failed); before = get_used(); check_native(rt_pipe_create(&npipe, NULL, P_MINOR_AUTO, 0)); check_native(rt_pipe_delete(&npipe)); check_used("pipe", before, failed); before = get_used(); check_native(rt_queue_create(&nq, "queue", 16384, Q_UNLIMITED, Q_PRIO)); check_native(rt_queue_delete(&nq)); check_used("queue", before, failed); before = get_used(); check_native(rt_sem_create(&nsem, NULL, 0, S_PRIO)); check_native(rt_sem_delete(&nsem)); check_used("sem", before, failed); before = get_used(); check_native(rt_task_spawn(&ntsk, NULL, 0, 1, T_JOINABLE, empty, NULL)); check_native(rt_task_join(&ntsk)); sleep(1); /* Leave some time for xnheap * deferred free */ check_used("task", before, failed); return failed ? EXIT_FAILURE : EXIT_SUCCESS; }