-
Notifications
You must be signed in to change notification settings - Fork 0
/
gorev.c
executable file
·136 lines (117 loc) · 4.24 KB
/
gorev.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright (C) 2023 Kozmotronik (İsmail Sahillioğlu)
* Hiçbir ücret talep edilmeden burada işbu yazılımın bir kopyasını ve
* belgelendirme dosyalarını (“Yazılım”) elde eden herkese verilen izin;
* kullanma, kopyalama, değiştirme, birleştirme, yayımlama, dağıtma,
* alt lisanslama, ve/veya yazılımın kopyalarını satma eylemleri de dahil
* olmak üzere ve bununla kısıtlama olmaksızın, yazılımın sınırlama olmadan
* ticaretini yapmak için verilmiş olup, bunları yapmaları için yazılımın
* sağlandığı kişilere aşağıdakileri yapmak koşuluyla sunulur:
*
* Yukarıdaki telif hakkı bildirimi ve işbu izin bildirimi yazılımın tüm
* kopyalarına veya önemli parçalarına eklenmelidir.
*
* YAZILIM “HİÇBİR DEĞİŞİKLİK YAPILMADAN” ESASINA BAĞLI OLARAK, TİCARETE
* ELVERİŞLİLİK, ÖZEL BİR AMACA UYGUNLUK VE İHLAL OLMAMASI DA DAHİL VE BUNUNLA
* KISITLI OLMAKSIZIN AÇIKÇA VEYA ÜSTÜ KAPALI OLARAK HİÇBİR TEMİNAT OLMAKSIZIN
* SUNULMUŞTUR.
* HİÇBİR KOŞULDA YAZARLAR VEYA TELİF HAKKI SAHİPLERİ HERHANGİ BİR İDDİAYA,
* HASARA VEYA DİĞER YÜKÜMLÜLÜKLERE KARŞI, YAZILIMLA VEYA KULLANIMLA VEYA
* YAZILIMIN BAŞKA BAĞLANTILARIYLA İLGİLİ, BUNLARDAN KAYNAKLANAN VE BUNLARIN
* SONUCU BİR SÖZLEŞME DAVASI, HAKSIZ FİİL VEYA DİĞER EYLEMLERDEN SORUMLU
* DEĞİLDİR.
*/
/**
* \file
* \author İsmail Sahillioğlu (Kozmotronik)
* \copyright \ref lisans "MIT Lisansı"
*
* \ingroup gorev
* @{
*/
#include "gorev.h"
#include "gorevciypl.h"
#include "port.h"
#include "portmacro.h"
static unsigned int tikSayimi=0;
// Görev yönetici kullanılmak isteniyorsa derlemeye ekle
#if grvCALISMA_KIPI == 1
#ifndef grvMAX_GOREV_SAYISI
#warning Maksimum gorev sayisi MAX_GOREV_SAYISI tanimlanmamis. Varsayilan 8 olacak.
#define grvMAX_GOREV_SAYISI 8
#endif
static gorev_t gorevHavuzu[grvMAX_GOREV_SAYISI];
static unsigned char gorevSayimi = 0;
pgkb_t grvOlustur(is_t is) {
pgkb_t gkb;
// Görev listesi dolu, NULL döndür.
if(gorevSayimi >= grvMAX_GOREV_SAYISI) return NULL;
/* Aynı iş parçasına sahip bir görev oluşturulmuş mu? */
for(char s = 0; s < gorevSayimi; s++) {
if(is == gorevHavuzu[s].is) {
/* Aynı iş parçasına sahip bir görev zaten var */
return &gorevHavuzu[s];
}
}
/* Her şey tamam, yeni görevi oluştur ve ilkle */
gkb = &gorevHavuzu[gorevSayimi];
gkb->kimlik = gorevSayimi;
gkb->durum = grvBEKLIYOR;
gkb->is = is;
grvILKLE(gkb);
gorevSayimi++;
return gkb;
}
void grvBaslat(const unsigned char kimlik) {
pgkb_t gkb = grvKimlikIleGorevBlogunuAl(kimlik);
if(gkb == NULL) return;
grvILKLE(gkb);
gkb->durum = grvBEKLIYOR;
}
void grvDurdur(const unsigned char kimlik) {
pgkb_t gkb = grvKimlikIleGorevBlogunuAl(kimlik);
if(gkb == NULL) return;
gkb->durum = grvBITTI;
}
void grvGorevciyiBaslat() {
while(1) {
for(unsigned char s = 0; s < gorevSayimi; s++) {
/* Sıradaki Görev Kontrol Bloğunu al */
pgkb_t gkb = &gorevHavuzu[s];
/* Bir şekilde NULL olmuş görev kontrol bloğu, sonrakine geç */
if(gkb == NULL) continue;
/* Görevin iş parçasını al */
is_t is = gkb->is;
/* Bir şekilde NULL olmuş iş parçası, sonrakine geç */
if(is == NULL) continue;
/* Görev etkin mi? Değilse sonrakini başlat */
char durum = gkb->durum;
if(durum == grvBITTI || durum == grvCIKTI) continue;
durum = is(gkb); // Sıradaki görevi çalıştır.
/* Görevin durumunu sakla */
gkb->durum = durum;
}
}
}
pgkb_t grvKimlikIleGorevBlogunuAl(const unsigned char kimlik) {
if(kimlik >= grvMAX_GOREV_SAYISI) return NULL;
/* Blok havuzda var öyleyse GKB'na başvuru döndür */
return &gorevHavuzu[kimlik];
}
#endif
unsigned int grvTikSayimi() {
unsigned int sayim;
// Atomik bölge giriş
portKritikBolumGirisi();
sayim = tikSayimi;
// Atomik bölge çıkış
portKritikBolumCikisi();
return sayim;
}
/**
* Bu işlev sistem sürevcisi kesmesinden çağrılır.
*/
void grvTikKesmeIsleyici() {
tikSayimi++;
}
/// @}