Projekte
workwind
Multitasking optimiert
mutex.c
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
Multitask...optimiert
cdll.c
cdll.h
condition.c
condition.h
main.c
mutex.c
mutex.h
scheduler.S
semaphore.c
semaphore.h
thread.c
thread.h
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7426 private projects
385 public projects
16180353 lines compiled
58212 builds
NIBO
@
multitasking_opt/mutex.c [read only]
#include <avr/interrupt.h> #include "mutex.h" #include "cdll.h" /* cdll_t waiting_threads; thread_t * locker; uint16_t counter; */ void mutext_init(mutex_t * mutex) { cdll_reset(&(mutex->waiting_threads)); mutex->locker = 0; mutex->counter = 0; } void mutext_delete(mutex_t * mutex) { } uint8_t mutext_lock(mutex_t * mutex, uint16_t timeout) { uint8_t result; cli(); thread_t * thread = thread_getCurrent(); if ((mutex->counter==0) || (mutex->locker==thread)) { // mutex is free or we are already the owner mutex->counter++; mutex->locker = thread; result = 1; } else if (timeout==TO_POLL) { // not yet available - return false result = 0; } else { // wait for mutex... cdll_push_back(&(mutex->waiting_threads), &(thread->rivals_list)); if (timeout == TO_INF) { thread_wait(); } else { thread_waitTimeout(timeout); } cdll_remove(&(thread->rivals_list)); if (mutex->counter==0) { mutex->counter++; mutex->locker = thread; result = 1; } else { result = 0; } } sei(); return result; } void mutext_unlock(mutex_t * mutex) { // assert (mutex->locker==thread_getCurrent()) // assert (mutex->counter>0) cli(); mutex->counter--; if (mutex->counter==0) { cdll_t * next = cdll_peek_front(&(mutex->waiting_threads)); if (next) { thread_t * t = THREAD_FROM_RIVALS_CDLL(next); thread_signalISR(t); } } sei(); } uint8_t mutext_lockISR(mutex_t * mutex) { if ((mutex->counter==0) || (mutex->locker==0)) { mutex->counter++; mutex->locker=0; return 1; } else { return 0; } } void mutext_unlockISR(mutex_t * mutex) { // assert (mutex->locker==0) // assert (mutex->counter>0) mutex->counter--; if (mutex->counter==0) { cdll_t * next = cdll_peek_front(&(mutex->waiting_threads)); if (next) { thread_t * t = THREAD_FROM_RIVALS_CDLL(next); thread_signalISR(t); } } } void _mutext_lockCondition(mutex_t * mutex, uint8_t value) { if ((mutex==0) || (value==0)) { return; } thread_t * thread = thread_getCurrent(); while (1) { if (mutex->counter==0) { // mutex is free mutex->counter = value; mutex->locker = thread; return; } // wait for mutex... cdll_push_back(&(mutex->waiting_threads), &(thread->rivals_list)); thread_wait(); cdll_remove(&(thread->rivals_list)); } } uint8_t _mutext_unlockCondition(mutex_t * mutex) { if (mutex==0) { return 0; } uint8_t res = mutex->counter; mutex->counter = 0; cdll_t * next = cdll_peek_front(&(mutex->waiting_threads)); if (next) { thread_t * t = THREAD_FROM_RIVALS_CDLL(next); thread_signalISR(t); } return res; }
Compiler results:
Werbung
Online
benito41e61968078784
FranziG
geniepoore1959464548
javierdruitt5492095
kellyfol738533124314
marianne50k49759325
meagano73231733343