//------------------------------------------------------------------------- // FUNCTION DECLARATION //------------------------------------------------------------------------- void hardware_init(void){ // Starting the evaluation EVAL_START(); // LEDS led_init(); // SYSTEM TIMER timer_hardware_init(DEFAULT_INTERVAL, DEFAULT_SCALE); // UART ker_push_current_pid(KER_UART_PID); uart_system_init(); ker_pop_current_pid(); #ifndef NO_SOS_UART //! Initalize uart comm channel ker_push_current_pid(KER_UART_PID); sos_uart_init(); ker_pop_current_pid(); #endif }
void *wln_proc(void *arg) { int ret; wres_req_t *req; wresource_t *resource; wres_reply_t *rep = NULL; wcom_peer_t *peer = (wcom_peer_t *)arg; EVAL_START(wln_proc); ret = wcom_recv_req(peer, &req); if (ret) { wln_log("failed to receive request"); goto out; } ret = wres_save_peer(&req->src); if (ret) { wln_log("failed to save addr"); goto out; } resource = &req->resource; if (wres_need_timed_lock(resource)) ret = wres_lock_timeout(resource); else if (wres_need_half_lock(resource)) { int err; wres_lock_t *lock = wres_lock_top(resource); if (!lock) { wres_print_err(resource, "failed to lock"); ret = -EINVAL; } err = wcom_send_rep(peer, (char *)&ret, sizeof(int)); if (err) { wres_print_err(resource, "failed to send reply"); ret = err; } wcom_disconnect(peer); if (!ret) wres_lock_buttom(lock); else if (lock) wres_unlock_top(lock); } else if (wres_need_wrlock(resource)) ret = wres_rwlock_wrlock(resource); else if (wres_need_lock(resource)) ret = wres_lock(resource); if (ret) goto reply; ret = wres_check_resource(resource); if (ret) goto unlock; rep = wres_proc(req, 0); ret = wres_get_errno(rep); if (ret < 0) { free(rep); rep = NULL; } unlock: if (wres_need_wrlock(resource)) wres_rwlock_unlock(resource); else if (wres_need_lock(resource)) wres_unlock(resource); reply: if (!wres_need_half_lock(resource)) { if (rep) wcom_send_rep(peer, (void *)rep, rep->length + sizeof(wres_reply_t)); else wcom_send_rep(peer, (void *)&ret, sizeof(int)); wcom_disconnect(peer); } wcom_free_req(req); if (rep) wcom_free_rep(rep); out: wcom_free_peer(peer); EVAL_END(wln_proc); return NULL; }