| 100 | } |
| 101 | |
| 102 | void Scheduler::init() |
| 103 | { |
| 104 | int ret; |
| 105 | const struct sched_table { |
| 106 | const char *name; |
| 107 | SchedulerThread *thread; |
| 108 | int policy; |
| 109 | int prio; |
| 110 | uint32_t rate; |
| 111 | } sched_table[] = { |
| 112 | SCHED_THREAD(timer, TIMER), |
| 113 | SCHED_THREAD(uart, UART), |
| 114 | SCHED_THREAD(rcin, RCIN), |
| 115 | SCHED_THREAD(io, IO), |
| 116 | }; |
| 117 | |
| 118 | _main_ctx = pthread_self(); |
| 119 | |
| 120 | init_realtime(); |
| 121 | init_cpu_affinity(); |
| 122 | |
| 123 | /* set barrier to N + 1 threads: worker threads + main */ |
| 124 | unsigned n_threads = ARRAY_SIZE(sched_table) + 1; |
| 125 | ret = pthread_barrier_init(&_initialized_barrier, nullptr, n_threads); |
| 126 | if (ret) { |
| 127 | AP_HAL::panic("Scheduler: Failed to initialise barrier object: %s", |
| 128 | strerror(ret)); |
| 129 | } |
| 130 | |
| 131 | for (size_t i = 0; i < ARRAY_SIZE(sched_table); i++) { |
| 132 | const struct sched_table *t = &sched_table[i]; |
| 133 | |
| 134 | t->thread->set_rate(t->rate); |
| 135 | t->thread->set_stack_size(1024 * 1024); |
| 136 | t->thread->start(t->name, t->policy, t->prio); |
| 137 | } |
| 138 | |
| 139 | #if defined(DEBUG_STACK) && DEBUG_STACK |
| 140 | register_timer_process(FUNCTOR_BIND_MEMBER(&Scheduler::_debug_stack, void)); |
| 141 | #endif |
| 142 | } |
| 143 | |
| 144 | void Scheduler::_debug_stack() |
| 145 | { |
nothing calls this directly
no test coverage detected