int main(int argc, char* argv[]) { if (argc != 3){ printf("Usage: gibaus single_character sleep_time\n"); exit(-1); } //versuch eine neue semphore mit startwert 1 zu öffnen //wenn schon vorhanden dann nur öffnen int semid = sem_create(23,1); if (semid < 0){ semid = sem_open(23); if (semid < 0){ perror("Semaphore open/create Fehler"); exit(-1); } } printf("wert nach create/open %i\n",sem_read(semid)); char zeichen =(int)argv[1][0]; int sleep_time = atoi(argv[2]); int i,j; for (i = 0; i < ITERATIONS; i++){ printf("vor krit %i\n",sem_read(semid)); //P vor krit. Bereich if (-1==P(semid)) { /* Fehler */ perror("semop P"); } //kritischer Bereich anfang printf("in krit %i\n",sem_read(semid)); for (j = 0; j < ANZ_ZEICHEN; j++){ printf("%c",zeichen); fflush(NULL); sleep(sleep_time); } printf("\n"); //kritischer Bereich ende, dann V if (-1==V(semid)) { /* Fehler */ perror("semop V"); } printf("nach krit %i\n",sem_read(semid)); } //semaphore wird nicht mehr gebraucht //sem_delete(23); exit(0); }
void hwSemaphoreTake(int sem_num, uint8_t val) { OS_ASSERT_COND(sem_num < NUMBER_OF_HW_SEMAPHORES); OS_ASSERT_COND(val != 0); do { sem_write(sem_num, val); } while (sem_read(sem_num) != val); }
os_status hwSemaphoreTryTake(int sem_num, uint8_t val) { OS_ASSERT_COND(sem_num < NUMBER_OF_HW_SEMAPHORES); sem_write(sem_num, val); if (sem_read(sem_num) == val) return OS_SUCCESS; return OS_FAIL; }
uint8_t hwSemaphoreGetVal(int sem_num) { OS_ASSERT_COND(sem_num < NUMBER_OF_HW_SEMAPHORES); return sem_read(sem_num); }