Download as pdf or txt
Download as pdf or txt
You are on page 1of 118

PIC M KRODENETLEY C LER N GEREK ZAMANLI LET M S STEM

HSEY N OTUK

YKSEK L SANS TEZ B LG SAYAR MHEND SL ANAB L M DALI

TOBB EKONOM VE TEKNOLOJ N VERS TES FEN B L MLER ENST TS

MART 2008 ANKARA

_______________________________

Prof. Dr. Ycel ERCAN Mdr

Bu tezin Yksek Lisans derecesinin tm gereksinimlerini saladn onaylarm.

_______________________________

Prof. Dr. Ali YAZICI Anabilim Dal Bakan

Hseyin OTUK tarafndan hazrlanan PIC M KRODENETLEY C LER N GEREK ZAMANLI LET M S STEM adl bu tezin Yksek Lisans tezi olarak uygun olduunu onaylarm.

______________________________

_______________________________

Dr. Cengiz ERBA Tez Yrd. Danman

Do. Dr. Y.Murat ERTEN Tez Danman

Tez Jri yeleri Bakan :Do. Dr. Mehmet nder EFE ye ye : Do. Dr. Y. Murat ERTEN : Yrd. Do. Dr. Ouz ERG N _______________________________ _______________________________ _______________________________

ii

TEZ B LD R M

Tez iindeki btn bilgilerin etik davran ve akademik kurallar erevesinde elde edilerek sunulduunu, ayrca tez yazm kurallarna uygun olarak hazrlanan bu almada orijinal olmayan her trl kaynaa eksiksiz atf yapldn bildiririm.

Hseyin OTUK

iii

niversitesi Enstits Anabilim Dal Tez Danman Tez Yrd. Danman Tez Tr ve Tarihi

: TOBB Ekonomi ve Teknoloji niversitesi : Fen Bilimleri Enstits : Bilgisayar Mhendislii : Do. Dr. Yusuf Murat ERTEN : Dr. Cengiz ERBA : Yksek Lisans Mart 2008 Hseyin OTUK

PIC M KRODENETLEY C LER N GEREK ZAMANLI LET M S STEM (PICOS) ZET Gnmzde otomobillerde, grnt sistemlerinde, cep telefonlarnda, iletiim cihazlarnda, biyomedikal uygulamalarda, endstriyel otomasyon sistemlerinde gml sistemlerin uygulama alanlar giderek yaygnlamaktadr. Gml sistemler zerinde almak zere hazrlanan yazlmlar, donanm kstlarna ramen genelde gerek-zamanl alrlar. Geleneksel yazlm sistemleri; gml sistemlerin gerek kstl sistem kaynaklar, gerek ok deiken uygulama gereksinimleri gerekse gerek zaman kstlar nedeniyle gml sistem ihtiyalarna cevap verememektedir. Genel amal iletim sistemlerinin de gml sistemlerde kullanm kstlar, gml sistemler iin zel tasarlanm gerek zamanl iletim sistemi gelitirilmesi ihtiyacn dourmutur. 1980den sonra birok devre elemannn ayn yonga ierisinde yer almaya balamas ile mikrodenetleyici kavram olumaya balamtr. Mikrodenetleyiciler sayesinde gml sistemlerin hem maliyetleri dm hem de boyutlarnda ciddi bir klme yaanmtr. Bu almada; kolay bulunabilir ve ekonomik olmalar, gelitirme ortamnn internet zerinden veya reticiden istendiinde cretsiz olarak elde edilebilmesi, ok geni bir kullanc kitlesine sahip olmalar, olduka basit sfrlama, saat sinyali ve g devreleri gerektirmeleri PIC mikrodenetleyicilerin seilmesini salamtr. Proje Microchip MPLAB tmleik gelitirme ortamnda, ANSI C uyumlu MPLAB C18 derleyicisiyle gelitirilmitir. Gml sistemlerde kullanlmak amacyla tasarlanan PICOS, 8-bit PIC ailesinin en gelimi serisi olan PIC18Fxxx serisi ile 16-bitlik PIC24xxx ve 32-bitlik PIC32xxx serileri iin gelitirilmi gerek zamanl bir iletim sistemidir. PICOS, gelitirilmesi esnasnda istenirse ar stnl prensibi istenirse ibirliki prensip ile alabilecek ekilde tasarlanmtr. Olduka kk, basit ve kullanm son derece kolaydr. Tm fonksiyonlar ve deikenler Trke olarak tanmlanmtr. ok dk RAM, ROM bellek kullanm ve ilemci yk getirmektedir. Olduka basit bir ekirdek yapsna sahiptir. Anahtar Kelimeler: Gerek zamanl iletim sistemi, gml sistemler, PIC mikrodenetleyiciler iv

University Institute Science Programme Supervisor Assistant Supervisor

: TOBB University of Economics and Technology : Institute of Natural and Applied Sciences : Computer Engineering : Associate Professor Dr. Yusuf Murat ERTEN : Dr. Cengiz ERBA

Degree Awarded and Date : M. Sc. March 2008 Hseyin OTUK REAL TIME OPERATING SYSTEM FOR PIC MICROCONTROLLERS ABSTRACT

Embedded systems are widely used for many applications like mobile phones, mp3 players, image processing, communication systems, biomedical applications and industrial control systems. As they are designed for specific tasks, embedded systems' sizes are quite small. Because of their small sizes, microcontrollers are very suitable for embedded systems. Despite having hardware constraints, embedded systems have software that commonly operate in real-time. Embedded systems have different requirements compared to traditional software systems, such as, limited resources, variable application reqiurements and real time constraints, traditional software systems do not fit their requirements. In addition, classical operating systems do not ensure usage criteria as well. Therefore, in order to achieve these goals, designing a real time operating system for embedded systems is the purpose of this project. Due to their popularity, economic prices, easiness to get and use, strong support by the vendor, basic reset and clock circuits, PIC microcontrollers are chosen as the hardware platform of this project. With MPLAB integrated development environment, ANSI C compatible MPLAB C18 compiler is used for developing the project. PIC Operating System (PICOS) is intended to be used for embedded systems and compatible with PIC 18FXXX, PIC24XXX and PIC32XXX families. Typical PIC applications in industry are based on cooperative scheduling. PICOS supports preemptive scheduling as well as cooperative scheduling. It is quite small, basic and easy to use. It has very little RAM, ROM and CPU usage. Kernel structure is also very basic as well.

Keywords: Real time operating systems, embedded systems, pic microcontrollers

TEEKKR

almalarm boyunca deerli yardm ve katklaryla beni ynlendiren hocam sayn Do. Dr. Y. Murat ERTENe, yine kymetli tecrbelerinden faydalandm sayn Dr. Cengiz ERBAa, Prof. Dr. Ali YAZICIya ve TOBB Ekonomi ve Teknoloji niversitesi Bilgisayar Mhendislii Blm ile Elektrik ve Elektronik Mhendislii Blm retim yelerine teekkr bir bor bilirim.

vi

NDEK LER ZET.......iv ABSTRACT......v TEEKKR.....vi NDEK LER........vii-viii ZELGELER N L STES ..........ix EK LLER N L STES ....................................... x KISALTMALAR.xi BLM 1 .................................................................................................................... 1 1. G R ....................................................................................................................... 1 1.1. almann Amac ............................................................................................. 1 BLM 2 .................................................................................................................... 3 2. GENEL B LG LER ................................................................................................. 3 2.1. Gml Sistemler .......................................................................................... 3 2.2. Mikrodenetleyiciler........................................................................................ 5 2.3. PIC Mikrodenetleyiciler ................................................................................ 8 2.3.1. PIC18F452 ve Genel zellikleri............................................................... 11 2.4. letim Sistemleri ......................................................................................... 15 2.4.1. letim Sistemi Trleri .............................................................................. 16 2.4.2. Gerek Zamanllk Kavram ..................................................................... 17 BLM 3 .................................................................................................................. 18 3. GEL T RME ARALARI................................................................................... 18 3.1. MPLAB Yerleik Gelitirme Ortam........................................................... 18 3.2. MPLAB PIC C18 Derleyicisi ...................................................................... 19 3.3. JDM Seri PIC Programlaycs .................................................................... 20 3.4. Bren8ner USB PIC Programlaycs ............................................................ 20 3.5. ICProg Programlama Yazlm .................................................................... 21 3.6. USBurn Programlama Yazlm................................................................... 23 BLM 4 .................................................................................................................. 25 4. PIC M KRODENETLEY C LER N GEREK ZAMANLI LET M S STEM (PICOS) ..................................................................................................... 25 4.1. PICOS - PIC Mikrodenetleyiciler in Gerek Zamanl letim Sistemi25 4.2. letim Sistemi Kavramlar .................................................................... 26 4.2.1. Grev ........................................................................................................ 26

vii

4.2.2. Kesme ....................................................................................................... 26 4.2.3. Grev ncelii.......................................................................................... 26 4.2.4. ar stnl Prensibiyle alan Sistem (Preemptive) ...................... 27 4.2.5. birliki Sistem (Cooperative)................................................................. 27 4.2.6. ekirdek.................................................................................................... 28 4.2.7. Olay........................................................................................................... 29 4.2.8. Grev Durumu .......................................................................................... 29 4.2.9. letim Sistemi .......................................................................................... 30 4.2.10. oklu Grev Yrtm .......................................................................... 30 4.2.11. izelgeleme ............................................................................................ 32 4.2.12. Grevler aras Deiim ........................................................................... 32 4.2.13. Gerek Zamanl Uygulamalar................................................................. 33 4.3. 4.4. 4.5. 4.6. letim Sistemi Uygulamas ................................................................... 33 PICOS Yaplandrma Ayarlar ............................................................... 37 Bellek Kullanm .................................................................................... 37 PICOS Fonksiyonlar ............................................................................. 38

4.7. rnek Uygulama .................................................................................... 38 BLM 5 .................................................................................................................. 42 5. SONULAR VE YAPILACAK ALIMALAR................................................. 42 5.1. Sonular ....................................................................................................... 42 5.2. Yaplacak almalar................................................................................... 43 KAYNAKLAR..........44-45 EK A : PIC18F452 Klflar ve Giri / k Ular..................46-48 EK B : PICOS letim Sistemi Fonksiyonlar.......49-53 EK C : PICOS Yaplandrma Ayarlar..............54-55 EK D : Kaynak Kodlar...56-106 ZGEM ......107

viii

ZELGELER N L STES Tablo izelge 2.1 izelge A.1 Aklama Kristal osilatr iin kondansatr deerleri PIC18F452 giri/k ular (EK A) Sayfa 12 46

ix

EK LLER N L STES

ekil ekil 2.1 ekil 2.2 ekil 2.3 ekil 2.4 ekil 2.5 ekil 2.6 ekil 3.1 ekil 3.2 ekil 3.3 ekil 3.4 ekil 3.5 ekil 3.6 ekil 3.7 ekil 3.8 ekil 4.1 ekil 4.2 ekil 4.3 ekil 4.4 ekil 4.5 ekil 4.6 ekil 4.7 ekil 4.8 ekil 4.9 ekil A.1 Mikrodenetleyici Yaps PIC 12 ve 16 aileleri PIC 16F serisi PIC 18F452 PIC24, PIC30 ve PIC32 aileleri PIC ilev performans izelgesi MPLAB Yerleik Gelitirme Ortam PIC C18 mcc komutu JDM Seri PIC Programlaycs Bren8ner USB PIC Programlaycs ICProg yazlm ICProg kullanc seimleri USBurn yazlm USBurn kiiselletirme seenekleri ar stnl prensibine dayanan grev deiimi birliki grev deiimi Grev durumlar oklu grev yrtm Grev 1 alyorken ierik Program saycs deerinin kesme tarafndan yta atlmas Grev 1 ieriinin Grev 1 ytna atlmas Grev 2 ierii Grev 2 ieriinin geri yklenmesi PIC 18F452 klflar (EK A)

Sayfa 6 8 9 9 9 10 18 19 20 21 21 22 23 24 27 27 30 31 33 34 35 36 36 46

KISALTMALAR Ksaltmalar Aklama ANSI CAN CMOS EEPROM HF ICPROG ICSP I2C LCD LED PIC PICOS PLC PROM RAM RISC ROM SPI USART USB American National Standards Institute Controller Area Network Complementary metaloxidesemiconductor Electrically Erasable Programmeble Read Only Memory High Frequency Integrated Circuit Prpgrammer In Circuit Serial Programming Inter Integrated Circuit Liquid Crystal Display Light Emitting Diode Peripheral Interface Controller PIC Operating System Programmable Logic Controller Programmable Read Only Memory Random Access Memory Reduced Instruction Set Computer Read Only Memory Serial Peripheral Interface Bus Universal Synchronous/Asynchronous Receiver Transmitter Universal Serial Bus

xi

BLM 1 1. G R 1.1. almann Amac Gml sistemler herhangi bir sistemin iinde yer alan ve o sisteme aklllk zellii katan elektronik donanm ve yazlmdan oluan btn ifade etmektedir. Sz edilen yazlmlar, bilgisayarlarmzdaki genel amal yazlmlardan farkl olarak, kullancyla dorudan deil dolayl etkileimde bulunan ve genellikle tek bir grevi yerine getiren yazlmlardr. Bu grev daha ok mekanik bir eylemi ifade etmekle birlikte, mekanik olmayan unsurlar da ierebilir. Her gml sistemde bir ilemci, bir bellek ve dier yardmc birimler bulunur. lemcisi olan her birim iin de bir iletim sisteminden bahsetmek gerekmektedir. Dnyada retilen mikroilemcilerin yaklak %98inin gml sistemlerde kullanld, gml sistem gereksiniminde her yl 200 milyon art yaand ileri srlmektedir. Artn bu hzla devam etmesi halinde ylda 5-6 milyar adet mertebesinde olan ihtiyacn 10 yl ierisinde 10 milyar adet mertebelerine ulaaca ngrlmektedir. Ortalama 10 $ zerinden hesaplandnda yalnzca donanm maliyeti 50-60 milyar $lk bir bykl ifade etmektedir [1]. ou programc, bir sonsuz dng ierisinde ana uygulamay altran ve kritik uygulamalar iin kesme kullanan geleneksel yntemlerle programlamaya alktr. Bu tr sistemler n plan-arka plan sistemler olarak da isimlendirilir. Zira, kesmeler her eyden daha ncelikli altklar iin n planda yer alr. Ana dng ise arka planda kesmeler aktif deilse almasna devam eder. Ancak uygulama byklkleri ve karmaklk arttka bu sistemlerin planlanmas, ynetimi ve bakm olduka zor hale gelmeye balar. te bu aamada oklu grev yrtebilen bir iletim sistemi nem kazanmaktadr. letim sistemi sayesinde ilemci gc sadece bir grev iin kullanlmayacak, farkl zamanlarda farkl grevlere odaklanabilecektir. Bylece geleneksel sistemlerde olduu gibi bekleme gerektiren bir durumda ilemci gc atl kalmayacak, bu esnada bir grev bekletilirken dier bir grev altrlacaktr.

Birok gml sistem uygulamasnda ilem daha nceden belirlenmi zaman dilimi ierisinde bitirilmemise, sistem ilevsel olarak dzgn alm olsa bile baarsz kabul edilir. Yani baar zamana bamldr. Bu nedenle gml sistemlerde kullanlacak iletim sisteminin gerek zamanl olmas tercih edilmektedir. Kullanm kolaylklar nedeniyle gml sistemler zerinde baz uygulamalarda artk mikroilemcilerin yerini mikrodenetleyiciler alm ve gnmzde en kolay elde edilebilen, zerinde uygulama gelitirilmesi en basit olan ve en fazla tercih edilen mikrodenetleyici PIC olduu iin bu projede bu mikrodenetleyicilerin kullanlmas uygun bulunmutur. zetle, bu almada PIC mikrodenetleyiciler zerinde alan gerek zamanl, oklu grev yrtm yapabilen, olay gdml, ar stnl (preemptive) ve ibirliki (cooperative) prensiplere gre alabilen, sistem kaynaklarn olabildiince kstl kullanan bir iletim sistemi gelitirilmesi hedeflenmitir. Bu iletim sistemi iyi tasarland takdirde, ncelikli uygulamalar dierlerinin nne geecek, bu da uygulamalardaki verimlilii arttracaktr. Bylelikle baz bayraklar ve sayclar test etmek, olaylar yoklamak iin komut evrimlerini harcamak yerine ilemci gcnn gerektii ekilde en uygun yerde kullanabilmesi salanacaktr. Bu kapsamda, 2. blmde genel bilgiler bal altnda gml sistemler ve uygulama alanlarndan, mikrodenetleyiciler ve tarihelerinden, PIC mikrodenetleyicilerden ve kullanlan PIC 18F452 mikrodenetleyicisinden, 3. blmde kullanlan gelitirme aralarndan, 4. blmde PIC mikrodenetleyiciler iin gelitirilen gerek zamanl iletim sistemi PICOS ve zelliklerinden, son olarak da 5. blmde almann sonular ve yaplacak almalardan bahsedilecektir.

BLM 2 2. GENEL B LG LER 2.1. Gml Sistemler Gml sistemler, nceden belirlenmi donanm zerinde istenilen grevleri yapmak zere hazrlanm aygtlardr. Sadece belirlenen amac yerine getirmek iin tasarlanmalar, maliyetlerinin dk olmasn ve karmak olmayan yaplar yaygn kullanlmalarn salamaktadr. Gnmzde otomobillerde, grnt sistemlerinde, cep telefonlarnda, iletiim cihazlarnda, biyomedikal uygulamalarda ve benzer birok alanda gml sistemlere rastlanmaktadr [2]. lk gml sistem MIT laboratuarlarnda Charles Stark Draper tarafndan gelitirilen Apollo klavuz bilgisayardr. Daha sonra ilk ktlesel gml sistem retiminin 1961 ylnda yaplmasndan sonra birimlerin fiyatlar kendi fiyatlarnn % 0,3ne kadar dmtr. 1950den sonra tmleik devre teknolojisinde meydana gelen gelimeler bir ok yeniliin nn amaya balamtr. 1980den sonra ise birok devre elemannn ayn yonga ierisinde yer almaya balamas ile mikrodenetleyici kavram olumaya balamtr. Bu sayede gml sistemlerin hem maliyetleri dm hem de boyutlarnda ciddi bir klme yaanmtr. Ayn zamanda ok dk g tketimine sahip olmalar daha geni uygulama alanlarna yaylmalarna yardmc olmutur. Gnmzde gml sistemlerin baz uygulama alanlar aada sralanmtr: Endstriyel otomasyon (PLC) sistemleri A cihazlar (anahtarlar, ynlendiriciler, v.b.) Uydu cihazlar Cep telefonlar l aletleri (multimetre, analizr, v.b.) Tbbi cihazlar 3

Beyaz eyalar (amar makinesi, bulak makinesi, buzdolab) Bilgisayar yazclar Fotokopi, faks makinesi gibi iletiim cihazlar Her trl otomasyon sistemleri Gml sistemler zerinde almak zere hazrlanan yazlmlar, donanm kstlarna ramen genelde gerek-zamanl alrlar. Gml sistemlerin genelde ya iletim sistemleri yoktur ya da zellemi gml iletim sistemleri bulunabilir. Bunlara genelde gerek-zamanl iletim sistemleri ad verilir. Gml sistemlerde sabit diskin yerine yeniden yazlabilir bir programlama bellei, klavyenin yerine basit bir tu takm, bilgisayar monitrnn yerine kk bir LCD ekran kullanlabilir [3]. Gml sistemler zerindeki yazlmlar bazen yllarla ifade edilebilecek kadar uzun sre hatasz alacak ekilde tasarlanmaldr. Bu zaman zarfnda, donanmda meydana gelebilecek hatalarn tespit edilmesi daha kolaydr. Ancak yazlm hatalar daha zor ayklanabilir. Ayrca yazlm, donanm tekrar balatabilecek ekilde tasarlanmaldr nk gml sistemler insanlarn ulaamayaca yerlerde almak zorunda olabilir. Aksi halde yazlmdaki bir aksaklkta sistemin almas durur ve tespit edilene kadar kayplar yaanabilir. Byle durumlarda genelde yazlmdaki nlemlerin yan sra yazlm destekleyen donanmsal baz tedbirlerden de sz edilebilir. Beki kpei zamanlaycs (watchdog timer) yazlmda meydana gelen bir hata durumunda sistemi batan balatarak ilemin aksamasn nleyebilir [4]. Gml sistemlerin tasarmlarnda kullanlan mikroilemci ya da

mikrodenetleyicilerin alabilmeleri iin genelde sistem tasarmlarnda bir balang kodu bulunur. Bu kod balangta btn kesmeleri devre d brakr, sistemi kontrol eder ve uygulamay balatr. Yazlm srecinde kullancya iaret veren eitli denetlemeler kullanlabilir. En yaygn yntem LEDleri kullanmaktr. Sistem ok kapsamlysa daha farkl aralar kullanlabilir.

Gml sistemler, kstl sistem kaynaklar, gerek zamanllk ve ok deiken uygulama gereksinimlerine sahip olmalar ile geleneksel yazlm sistemlerinden ayrlmaktadr [5]. Gml sistemler iin gerekletirilen iletim sistemleri, genel amal iletim sistemlerinden farkl tasarm amalarna ve servislere sahiptirler. Verimli bir kaynak ynetimi ve gerek zamanl sistem algoritmalar ieren gml iletim sistemleri, giderek modern yazlm kavramlarnn sunmu olduu avantajlara gereksinim duymaktadr. Byk ve karmak olan gnmz gml sistem uygulamalarnn ihtiyalarn karlayacak olan gml iletim sistemleri, iyi bir sistem baarmna sahip olmak ve verimli kaynak ynetimi algoritmalar iermek dnda yeniden yaplandrlabilme, tanabilme ve datklk gibi modern yazlm zelliklerini destekleyebilmelidir [6]. 2.2. Mikrodenetleyiciler Mikrodenetleyiciler, mikroilemcilere en az giri-k arabirimleri ile bellek modl eklenerek tek bir yonga ierisinde birletirilen ve gnmzde zellikle gml sistemlerde olduka yaygn olarak kullanlan kontrol aygtlardr. Mikrodenetleyiciler, giri-k arabirimleri ve hafza modl yannda analog-saysal dntrc, seri giri-k arabirimi, darbe sinyali k, USB balant kontrolcs, kzl tesi ve LCD ekran srcs gibi uygulamalarn karmakln azaltan, olduka pratik modlleri de barndrabilir. Bu modller seilen mikrodenetleyici ailesi ve modeline gre farkllk gsterirler (ekil 2.1). Genelde her uygulama kullanc ile etkileim gerektirdii iin hemen hemen tm uygulamalarda giri k arabirimlerine ihtiya duyulmaktadr. Bu arabirimler kendisine gelen sinyale gre ilem yapabildii gibi gerekletirdii ilem sonucunda harici bir sinyal de retebilirler. Daha ak bir ifade ile, mikrodenetleyici kullancdan gelen bir istee veya sensor gibi baka bir bileende meydana gelen deiiklie gre bir ilemi gerekletirebilirken bu ilemin sonucunda kullancya cevap olarak bir sinyal retebilir, bu sinyal ile de gerekli bileenler srlerek anlaml bir sonu elde edilebilir. Ayn ilem mikroilemci ile yaplmak istenildiinde harici

giri-k arabirimleri ve mutlaka kullanlmas gereken bir hafza modl mikroilemci ile ilikilendirilmelidir. Bu ise hem uygulamann karmak hale gelmesine hem de maliyetin artmasna neden olacaktr. Ayn ekilde analog-saysal dntrc gibi ihtiya duyulan her modl benzer dezavantajlar beraberinde getirecektir. Mikrodenetleyicilerin mikroilemcilere tercih edilmesinin balca nedenleri arasnda karmakl azaltmalar, baskl devre gerektirmemeleri, maliyeti drmeleri, olduka dk g tketimine sahip olmalar, az yer kaplamalar, pratik kullanm ve uygulama gelitirme kolaylklar saylabilir.

ekil 2.1. Mikrodenetleyici Yaps Bu avantajlar sayesinde artk baz zel uygulamalar dnda mikroilemciler yerini mikrodenetleyicilere brakm, iletiim sistemlerinde, grnt ilemede, biyomedikal uygulamalarda, birok endstriyel kontrol sisteminde ve ou gml uygulamada mikrodenetleyiciler vazgeilmez devre elemanlar haline gelmitir [7]. Gnmzde en ok bilinen mikrodenetleyici reticileri arasnda Microchip, Intel, Scenix, Atmel, Texas Instruments, NEC, Motorola, Zilog yer almaktadr. Her retici

kendi rettii iplere bir isim vermekte ve barndrd modl, hafza bykl gibi zelliklerine gre alt snflara ayrmaktadr. Herhangi bir uygulama gelitirilirken kullanlacak modller, gereken hafza bykl, dahili zamanlayc ve kesme kaynaklar gibi zellikler listelenmeli ve gerekli aratrmalar yaplarak uygun ip seilmelidir [8]. rn seerken dikkat edilmesi gereken baz modller ve dhili zellikler aadaki gibi sralanabilir: alma frekans Osilatr tipi (RC, XT, HF gibi) Analog-saysal dntrc modl Giri-k arabirimleri srme kapasitesi (akm byklkleri) Analog ve saysal olarak ayarlanabilen giri/k arabirimi ve u says Seri giri/k arabirimi ( senkron, asenkron) Desteklenen haberleme protokolleri (I2C, SPI, USART, PSP gibi) Darbe sinyali k Harici kesme Zamanlayc tabanl kesme Dhili programlama bellei bykl Harici bellek arabirimi Dhili bellek tipi seenekleri (ROM, EPROM, PROM ve EEPROM) Dhili RAM seenei ve bykl Dhili zamanlayc says ve byklkleri

USB, CAN, Ethernet balant kontrolcs, LCD ekran srcs, kzltesi modl, v.b. Kullanlabilen modlleri ve yaygn kullanmlar gz nne alnarak bu projede Microchip firmas tarafndan retilen PIC mikrodenetleyiciler kullanlmtr. 2.3. PIC Mikrodenetleyiciler Arizona Microchip Technology, ilk olarak General Instruments tarafndan retilmi olan Harvard mimarisine sahip mikrodenetleyicilerin retimine devam etmi ve bu rn Peripheral Interface Controller kelimelerinin ba harflerinden oluan PIC adn almtr. lk olarak 12-bit komut seti ile tasarlanan ve toplam 33 komuta sahip olan PIC16C5X serisini pazara karan Microchip, azaltlm komut seti (Reduced Instruction Set Computer RISC ) mimarisi ile kullanl, ucuz ve hzl ilemci retmeye balamtr. Bir sefer yazlabilen (ROM) bellek kullanlan bu rnler C kodunu almlardr. 512 ve 2048 bayt program bellei, 25-73 bayt veri belleine sahip rnler 18 veya 28 uca sahip entegre devreler olarak piyasaya srlmlerdir. Daha sonra retilen PIC12CXXX serisi ayn zelliklere sahip olup sadece 8 uca sahiptir (ekil 2.2).

PIC16C54

PIC16C54

PIC12F675

ekil 2.2. PIC 12 ve 16 aileleri Daha sonra ortaya kan analog-saysal dntrcler, daha fazla kesme ve programlama alan, 16-bit sayc ve zamanlayc gibi ihtiyalar ve gelien teknoloji sonrasnda 1992 ylnda 14-bit komut setine sahip PIC16CXXX ailesinin retimine balanmtr. Bu ailedeki komut says ise 35 adet olup nceki seri ile uyumlu tasarlanmtr (ekil 2.3).

PIC16F84

PIC16F877A

ekil 2.3. PIC 16F serisi 1997 ylnda arpma yapan aritmetik ilem nitesine ve gelimi arabirim zelliklerine sahip PIC17CXXX serisi pazara sunulmutur. 1999 ylnda ise geniletilmi 16-bit komut setine sahip PIC18CXXX serisinin retimine balanmtr. Bu seride komut says 77ye km ve yksek seviyeli programlama dillerine yeterince destek verilmitir. Birden fazla programlanabilen programlama belleine sahip rnler F kodu ile isimlendirilmitir (ekil 2.4) [9].

PIC18F452 I/P

PIC18F452 I/L

ekil 2.4. PIC 18F452 Tm bu 8-bitlik mikrodenetleyicilerden sonra 16-bitlik PIC24XXX ve

DSPIC30XXX serisi ile 32-bitlik PIC32XXX serisi retilerek pazara sunulmutur (ekil 2.5).

PIC24

PIC30

PIC32

ekil 2.5. PIC24, PIC30 ve PIC32 aileleri

Uzun yllar 8-bitlik mikrodenetleyici reten Microchip, gnmzde 8-bit'lik, 16bitlik ve 32-bitlik mikrodenetleyici ve EEPROM hafza retmektedir (ekil 2.6). Arizona eyaletinde iki, Tayland ve Tayvan'da da birer tane olmak zere toplam drt fabrika ile kendi alannda dnyada sz sahibidir [10].

ekil 2.6. PIC ilev performans izelgesi PIC mikrodenetleyiciler kolayca temin edilebilir ve olduka ekonomiktir. Gelitirme ortam MPLAB IDE internet zerinden veya Microchipten istendiinde cretsiz olarak elde edilebilir. ok geni bir kullanc kitlesine sahip olan PIC mikrodenetleyiciler, temel elektronik bilgisine sahip herkesin kolayca bulabilecei basit devre elemanlar kullanarak yaplabilen bir donanmla programlanabilir. Olduka basit sfrlama, saat sinyali ve g devreleri gerektiren PIC mikrodenetleyicilerin tm bu zellikleri bu projede seilmelerini salamtr. Bunun yannda PIC ailesi ierisinde 32 KB byklnde yeniden yazlabilir bellee sahip olmas ve gelimi zellikleri ile PIC18F452 tercih edilen mikrodenetleyici olmutur.

10

2.3.1. PIC18F452 ve Genel zellikleri PIC18F452, 16-bit komut kmesine sahip PIC ailesi ierisinde en gelimi mikrodenetleyicidir. 32 KB yeniden yazlabilir bellee sahip PIC18F452de tek kelimelik 16384 komut kullanlabilmektedir. 1536 bayt byklnde RAM bellek ve 256 bayt byklnde elektrik kesintilerinden etkilenmeyen EEPROM bellek kullanlabilirken alma frekans 40 MHze kadar kabilmektedir. 18 farkl kesme kaynana sahip mikrodenetleyicide kesmelere farkl ncelikler atanabilmektedir. 3 adet 8 ulu, 1 adet 7 ulu ve 1 adet 3 ulu olmak zere toplam 5 adet giri k portu bulunmaktadr. 16-bit genilikte komutlara ve 8-bit genilikte veri yoluna sahiptir. 8 bit iki deikeni arpabilen bir donanm arpcnn yannda 4 adet zamanlaycya, 2 adet karlatrma modlne sahiptir. Sadece 75 komut bulunduran bir komut seti sayesinde programlanabilen PIC18F452, C derleyiciler iin tasarlanm ve optimize edilmi mimarisi ile yksek performanslara eriebilmektedir. 25 mA akm deerine kadar klar srebilmektedir. adet dhili kesme ucu bulunmakta (INT0, INT1, INT2) ve bu kesmelere farkl ncelikler atanabilmektedir. kinci bir osilatr opsiyonu ve iki adet yakalama, karlatrma ve darbe genilik modlatr bulunmaktadr. Senkron seri port sayesinde, u ile SPI ve I2C protokolleri kullanlabilmektedir. PIC 18F452 adreslenebilir USART modl sayesinde RS-232 ve RS-485 protokolleri desteklenmektedir. 10-bit znrlkte 8 kanal analog saysal dntrc sayesinde ok hzl rnekleme oran ve uyku modunda dntrebilme salanmaktadr. Yeniden yazlabilir programlama bellei 100.000 kez silinip yazlabilirken EEPROM bellei 1.000.000 kez silinip yazlabilmektedir. Programlama bellei ve EEPROM bellei 40 yl boyunca ierisindeki verileri koruyabilmektedir. Programlama bellei sigortalar sayesinde korumaya alnabilmekte, sadece iki u yardm ile devre zerinden karmadan mikrodenetleyici programlanabilmektedir. CMOS teknolojisi sayesinde dk g tketimi ve hzl bellek eriimine sahiptir. 2.0 Vtan 5.5 Va kadar kabilen esnek alma geriliminin yannda geni alma

11

scaklklar sayesinde endstride ok geni bir alanda kullanlmaktadr. PLCC, TQFP, DIP ve DIP/SOIC gibi ok eitli klflarda retilmektedir [11]. EK Ada retimi yaplan PIC18F452 klflar ve PIC18F452 giri / k ular yer almaktadr. Her giri k ucunun hangi amala kullanld izelge A.1 ile aklanmaktadr. 2.3.1.1. Kristal Osilatr in Kondansatr Seimi PIC 18F452 mikrodenetleyicilerinde saat stabilizasyonu salamak amacyla kullanlan kondansatrlerin seimi nem kazanmaktadr. Dk gl (DG), kristal (KR) ve yksek hzl (YH) modlarnda aadaki kondansatr deerleri retici tarafndan test edilmekle birlikte nerilmektedir (izelge 2.1). izelge 2.1. Kristal osilatr iin kondansatr deerleri Mod DG Frekans 32.0 KHz 200 KHz 200 KHz KR 1.0 MHz 4.0 MHz 4.0 MHz YH 8.0 MHz 20.0 MHz 25.0 MHz 2.3.1.2. Bellek Yerleimi Gelimi mikrodenetleyici cihazlarnda ayr hafza blou bulunmaktadr. Bunlar: Kullanc tarafndan kullanlan program bellei Dinamik olarak yenilenen RAM bellei Kondansatr 1 33 pF 15 pF 22-68 pF 15 pF 15 pF 15 pF 15-33 pF 15-33 pF 15-33 pF Kondansatr 2 33 pF 15 pF 22-68 pF 15 pF 15 pF 15 pF 15-33 pF 15-33 pF 15-33 pF

12

Elektrik kesintilerinden etkilenmeyen dhili EEPROM belleidir. Veri ve program bellei iin ayr ayr veri yolu kullanlmas bu bloklara e zamanl eriimi salamaktadr. 2.3.1.3. Program Bellei Yerleimi 21-bit uzunluundaki komut adres yazmac, 2 MB byklndeki program belleini adresleyebilmektedir. 0x0000h adresinde sfrlama vektr, 0x0008h ve 0x0018h adreslerinde de kesme vektrleri bulunmaktadr. 2.3.1.4. RAM Bellek Yerleimi RAM bellek 16 adet 256 bayttan oluan bloktan meydana gelir. RAM bellek, zel fonksiyon yazmalar ve genel amal yazmalardan oluur ve bu alanda bulunan her yazma 12-bit uzunluunda adrese sahip olup 4096 bayta kadar genileyebilmektedir. Komut seti ve mimari tm bloklar arasnda ilemlere izin vermektedir. 2.3.1.5. EEPROM Bellei EEPROM bellei normal alma voltajlar ierisinde okunabilir ve yazlabilir durumdadr. Okuma ve yazma ilemleri iin nceden tanmlanm yazmalar kullanlr. Bu yazmalardan birinde okunup yazlacak veri yer alrken bir dierinden bellekte eriilecek alann adresi tutulmaktadr. 2.3.1.6. Kesmeler PIC18F452 bir ok kesme kaynana ve bu kesmelere yksek veya dk eklinde atanabilen nceliklere sahiptir. Yksek ncelikli kesme vektr 0x0008h adresinde, dk ncelikli kesme vektr 0x0018h adresinde yer alr. Yksek ncelikli kesmeler, o anda devam eden dk ncelikli kesme varsa bu kesmeyi durdurur, kendi iini tamamlar ve dk ncelikli kesmeye geri dner. INT0 kesmesinin dnda tm kesmelerin benzer ekilde adet durum bayra vardr. Bunlar: Kesmenin meydana geldiini gsteren bayrak Kesmeyi etkinletiren bayrak 13

Kesmenin nceliini (dk veya yksek) belirleyen bayraktr.

2.3.1.7. Giri / k Portlar PIC18F452 PortA, PortB, PortC, PortD ve PortE olmak zere 5 adet giri / k portuna sahiptir. Saysal veya analog genel amal giri / k ucu, analog-saysal dntrc giri ucu, yakalama-karlatrma giri / k ucu, haberleme protokolleri giri / k ucu gibi amalarla kullanlan bu portlarn sahip olduu ular ile ilgili detayl bilgi Ek Ada izelge A.1de verilmitir. Bu portlar, genel anlamda uygulamann kullanc ile etkileimini salayan arayzlerdir. 2.3.1.8. Zamanlayc Modlleri PIC18F452, 4 adet zamanlayc modlne sahiptir. Zamanlayc 0, 8-bit veya 16-bit zamanlayc ya da sayc olarak kullanlabilir. Zamanlayc deeri her saat frekansnda artabilecei gibi bir katsay sayesinde birka saat frekansnda da artabilmektedir. Zamanlayc 1, 16-bit zamanlayc ya da sayc olarak kullanlabilirken karlatrma-yakalama modl vastasyla sfrlanabilmektedir. Zamanlayc 2, 8-bit zamanlayc ve 8-bit periyot yazmac olarak kullanlabilir. Zamanlayc 3 ise 16-bit zamanlayc ya da sayc olarak kullanlabilmekle birlikte karlatrma-yakalama modl sayesinde sfrlanabilmektedir. 2.3.1.9. Analog Saysal Dntrc PIC18F452, 10-bit znrlkte 8 kanal analog saysal dntrcye sahiptir. Belirlenen deer aralklar ierisindeki analog sinyalleri 10 bit saysal verilere evirir.

14

2.4. letim Sistemleri letim sistemleri, tasarlanan donanm kullanlabilir yapan, sistem kaynaklarnn paylamn ayarlayan, uygulama gelitirme ortam hazrlayan ve tm bunlarn ynetimini salayan ekirdekten oluan yazlmlardr. letim sistemleri donanmn kullanm zorluklarn bir anlamda gizlemekte ve gvenlik nedeniyle dorudan donanma erimeyi engellemektedir. Bunun yerine donanm ile yazlm arasnda kpr grevini stlenen sistem arlar kullanlmaktadr. Sistem arlar ktphaneler eklinde tanmlanr ve kullanc programlar bu ktphaneleri kullanarak donanma eriirler [12,13]. letim sisteminin en nemli ilevlerinden birisi kaynak ynetimidir. Bir sistemin ana kaynaklar genel olarak ilemci birimi, bellek, giri/k aygtlar ve veri olarak snflandrlabilir. Kaynaklar yneterek en verimli ekilde kullanlmalarn salayan iletim sistemi sistemin her an kullanlabilir olmasn amalamaktadr [14]. letim sistemleri, kaynaklarn grev veya kullanclara atanmas ve gerektiinde paylatrlmas, grevlerin ileyi srasnn belirlenmesi, giri-k ilemlerinin yerine getirilmesi gibi ilevleri stlenirler. letim sistemi balatldnda genelde ekirdekteki program sistem belleine alnr. Buradan ihtiya duyulan dier programlar ana bellee tanr. Bellekte devaml yer alan programlar yerleik programlardr. Bu programlar tm dier birimleri denetler ve ynetirler. Dier programlar gerektike bellee alnrlar. Yerleik programlar meydana gelen kesmeleri ele alr, ilemleri ve kaynaklar ynetir, sistem durumunu ve verileri kontrol ederler. Kaynak ynetimi, hangi kaynan, kim tarafndan ne zaman kullanlacan kontrol etme ilemidir. zellikle ok kullancl sistemlerde nem kazanan bu ilev ayn anda kaynaklara erimek isteyen kullanclarn eriimini en iyi ekilde dzenler. Karlkl ierleme veya darlama (mutually inclusive or exclusive) gibi yntemlerle anlalarak kaynaklarn kullanclar tarafndan ortak kullanm salanr. Kesmeler ise zamanlaycnn tamas, bir giri-k ucunun seviye deitirmesi, seri porttan veri

15

alnmas gibi meydana gelen zellikli olaylar sonrasnda program aknn nceden belirlenmi bir bellek adresine ynlendirilmesi ilemidir. nceden belirlenen bu adreste istenilen ilevi gerekletiren kodlama yaplr, bu kod altrldktan sonra program ak tekrar kald yerden devam eder. Bahsi getii gibi birok kaynaktan meydana gelebilen kesmelerin ayn anda meydana geldiklerinde hangisinin iletileceine karar verebilmek iin ncelikleri vardr. Her kesme kayna kullanlan mimariye ve mikroilemciye gre farkl bir ncelie sahiptir ya da bu ncelikler yazlm seviyesinde kullanc tarafndan tanmlanabilir [15]. letim sisteminin grevlerinden birisi de dzenli aralklarla sistemi denetlemektir. Bylece meydana gelebilecek olaanst durumlar alglanarak zm salanabilir. lem ya da baka bir ifade ile grev, bir program bloundan oluan ve belli bir ilevi yerine getiren kod parasdr. letim sistemleri genelde birden fazla program ayn anda altrabilecek yapda tasarlanr. Daha dorusu ilemci ayn anda aslnda sadece bir program altrmaktadr, ancak belli zaman aralklar ile dier programlar da altrmas hepsini ayn anda altryor izlenimi vermektedir. letim sistemlerinde grevler arasndaki geileri ekirdein bir paras olan izelgeleyici yerine getirir. letim sistemi bunlarn yannda verilerin girii, girilen verilerin bellee aktarlmas, oradan da k nitelerine gnderilmesi gibi grevleri de yerine getirir [16].

2.4.1. letim Sistemi Trleri 2.4.1.1. Ana at (Main Frame) letim Sistemleri Youn giri/k ilemi gerektiren ok sayda grevin bulunduu iletim sistemleridir. rnek : OS/390 2.4.1.2. Sunucu letim Sistemleri Sunucu makineler zerinde alan a zerinden ok sayda kullancya hizmet veren iletim sistemleridir. rnek: Unix, Windows 2000

16

2.4.1.3. ok lemcili letim Sistemleri ok ilemcili bilgisayarlarda, paralel sistemlerde, birden fazla birbirine bal bilgisayar sistemlerinde kullanlan iletim sistemleridir. 2.4.1.4. Kiisel Bilgisayar letim Sistemleri Genellikle ofis veya ev kullanclar iin kolay ve etkin kullanm salayan iletim sistemleridir. rnek: Windows 98, 2000, XP, MacOS, Linux. 2.4.1.5. Gerek Zamanl letim Sistemleri Zaman kstlarnn nemli olduu sistemlerde, endstriyel kontrol sistemlerinde kullanlan iletim sistemleridir. rnek: VxWorks, QNX 2.4.1.6. Gml letim Sistemleri Avu ii bilgisayarlar, TV, cep tel gibi zel amal kullanlan iletim sistemleridir. rnek: PalmOS, Windows CE 2.4.1.7. Akll Kart letim Sistemleri Kredi kart boyutlarnda zerinde ilemci bulunan bir veya birka ilev ykl ounlukla zel sistemler iin tasarlanm iletim sistemleridir [17]. Gml sistemlerde genelde zaman kstlar n plana kt bu projede iin gerek zamanl iletim sistemleri ele alnmtr. 2.4.2. Gerek Zamanllk Kavram Gerek zamanllk, iletimin baarsnn zamana da baml olmasdr. Daha nce de belirtildii gibi sadece iin tamamlanmas baar olarak kabul edilmez. Daha nceden belirlenmi zaman dilimi ierisinde bitirilmemise, dzgn alm olsa bile iletim baarsz kabul edilir. Baz uygulama alanlar; uzay uygulamalar, tbbi uygulamalar, savunma sanayi sistemleri, endstriyel otomasyon sistemleri olarak saylabilir [18].

17

BLM 3 3. GEL T RME ARALARI Bu projenin gelitirilmesi esnasnda gelitirme ortam olarak Microchip MPLAB IDE, derleyici olarak MPLAB PIC C18, seri programlayc olarak JDM programlaycs, USB programlayc olarak Bren8ner programlaycs, bilgisayar yazlm olarak ICProg ve USBurn yazlmlar kullanlmtr. 3.1. MPLAB Yerleik Gelitirme Ortam MPLAB yerleik gelitirme ortam, Microchip firmasnn PIC ve dsPIC rnleri ile gml uygulamalar gelitirilmesine izin veren, her PIC iin tasarlanan komut setlerini destekleyen ve cretsiz olarak datlan bir ara setidir. 32-bit bir Windows uygulamas olarak alan MPLAB IDE, birok cretsiz ara ile kullanlabilmekte olup ok gl bir hata ayklama modlne sahiptir (ekil 3.1). Kullanl bir grafik arayze sahip MPLAB IDEnin kullanm olduka basittir [19].

ekil 3.1. MPLAB Yerleik Gelitirme Ortam

18

3.2. MPLAB PIC C18 Derleyicisi MPLAB, PIC iin tasarlanm evirici dili (assembly) destekler. C gibi yksek seviyeli dillerde uygulama gelitirmek iin farkl seenekler mevcuttur. MPLAB C18, Microchip tarafndan PIC18 ve daha gelimi serilerde kullanlmak zere gelitirilmi ve olduka iyi optimize edilmi bir C derleyicisidir. Ticari uygulamalar iin cretli olan bu yazlmn renciler iin hazrlanm srm 3 ay denenebilmektedir. Bu alma, 3 aylk deneme srm ile gerekletirilmitir. C18, ANSI X3.159-1989 standardndan tretilmi bir derleyici olup tamamen PIC mimarisinin gelimi zelliklerini en iyi ekilde kullanacak ekilde tasarlanmtr. 32-bit bir Windows konsol uygulamas olan C18, MPLAB tmleik gelitirme ortam ile birlikte kullanlabilmektedir (ekil 3.2) [20]. MPLAB C18 derleyicisi temel olarak aadaki zelliklere sahiptir: ANSI 89 uyumluluu MPLAB tmleik gelitirme ortam ile birlikte olduka pratik kullanm Kod seviyesinde hata ayklama PWM, SPI, I2C, UART, USART, matematik ktphanelerini kapsayan geni bir ktphane destei Gerektiinde evrimii kullanlabilen evirici dil (assembly) destei

ekil 3.2. PIC C18 mcc komutu

19

3.3. JDM Seri PIC Programlaycs JDM, PIC mikrodenetleyicileri, 24CXX ve 24LCXX tipi I2C EEPROM'lar ok kolay ekilde programlayan, yaplmas son derece basit bir PIC programlaycsdr. Devre ilave bir g kayna gerektirmemekte, gereken enerjiyi seri porttan almaktadr. Aada bu devrenin donanm emas yer almaktadr (ekil 3.3) [21].

ekil 3.3. JDM Seri PIC Programlaycs 3.4. Bren8ner USB PIC Programlaycs Bren8ner, PIC mikrodenetleyicileri sorunsuzca, bir ka admda programlayan stelik USB2.0 hzyla alan bir programlaycdr. zerinde bulunan ZIF soket yardm ile kolayca PIC mikrodenetleyiciler programlaycya yerletirilip kartlabilir. ZIF soket sayesinde hassas olan entegre bacaklarna hibir zarar gelmez. Ayrca zerinde bulunan ICSP balant noktas ile ZIF sokete uymayan veya devreden kartlmak istenmeyen PIC mikrodenetleyiciler kolayca programlanabilir. Bu rn Microchip firmasnn rettii 173 ayr model PIC programlayabilmektedir. Programlanabilecek PIC ler; 12F6xxx serisi, tm 18Fxxx ve 18Fxxxx, tm 16Fxx ve 16Fxxx ve dsPIC30Fxxxx serileridir [22,23]. Minimum sistem gereksinimleri; PII 233Mhz, 64MB Ram, 10MB bo alan, bo USB balant noktas, Windows (98/me/NT/2000/XP/VISTA) iletim sistemidir (ekil 3.4).

20

ekil 3.4. Bren8ner USB PIC Programlaycs 3.5. ICProg Programlama Yazlm ICProg, yazlan programn derlenmesi ile meydana kan hex uzantl dosyalarn mikrodenetleyici, EEPROM gibi entegre devrelere yklenmesi iin JDM ve benzeri birka donanm ile alan yazlmdr (ekil 3.5) [24].

ekil 3.5. ICProg yazlm

21

ekil 3.6. ICProg kullanc seimleri

ICProg, menlerinde yer alan ayarlar sayesinde baz seimlere izin verir (ekil 3.6). Bu opsiyonlar sayesinde kullanlan COM port seilebilir, programlama ular evrilebilir, donanm denetimi yaplabilir veya kullanlacak src etkinletirilebilir. ICProg aada listelenen programlayc donanmlarn desteklemektedir: JDM Programlayc (Ludipipo) Conquest Programlayc TAFE Programlayc TAIT 'Classic' Programlayc Parallel TAIT Programlayc 22

Fun-card Programlayc SCHAER Programlayc ProPic II Programlayc STK200 Programlayc AN589 Programlayc WILLEPRO Programlayc Fluffy2 Programlayc DL2TM Programlayc ER1400 Programlayc

3.6. USBurn Programlama Yazlm USBurn, Bren8ner, Bren9ner, Bren8nerMini gibi donanmlar ile alan ve daha nceden derlenip hazrlanm hex dosyalar seip PIC zerine yazmaya yarayan bir bilgisayar yazlmdr (ekil 3.7) [25].

ekil 3.7. USBurn yazlm USBurn aadaki gibi bir ok kiiselletirme seeneine sahiptir (ekil 3.8).

23

ekil 3.8. USBurn kiiselletirme seenekleri

24

BLM 4 4. PIC Mikrodenetleyiciler in Gerek Zamanl letim Sistemi (PICOS) 4.1. PICOS - PIC Mikrodenetleyiciler in Gerek Zamanl letim Sistemi Genel amal iletim sistemlerinin gml sistemlerdeki kullanm kstlar, gml sistemler iin zel tasarlanm gerek zamanl iletim sistemi gelitirilmesi ihtiyacn dourmutur. Bu noktadan hareketle, gml sistemlerde kullanlmak amacyla tasarlanan PICOS, 8-bit PIC ailesinin en gelimi serisi olan PIC18Fxxx serisi ile 16bitlik PIC24xxx ve 32-bitlik PIC32xxx serileri iin gelitirilmi gerek zamanl bir iletim sistemidir. PIC12xxx ve PIC16xxx serileri dk hafza boyutlar, yazma limitleri gibi kstlar nedeniyle ele alnmamtr. PICOS, gelitirilmesi esnasnda istenirse ar stnl prensibi istenirse ibirliki prensip ile alabilecek ekilde tasarlanmtr. Olduka kk, basit ve kullanm son derece kolaydr. Tm fonksiyonlar ve deikenler Trke olarak tanmlanmtr. Kodlar, MPLAB C18 derleyicisi ile tamamen ANSI C uyumlu yazlmtr. Oluturulabilecek grev says kullanlan cihazn hafzas ile snrldr. Hafza izin verdii srece istenilen sayda grev oluturulabilir. Kullanlabilecek ncelik seviyeleri programc tarafndan belirlenebilmektedir. Benzer ekilde yaplabilecek tanmlamalar ile yt byklkleri, grevleri durdurma ve erteleyebilme zellikleri kullanlp kullanmayacana karar verilebilmektedir. ok dk RAM, ROM bellek kullanm ve ilemci yk getirmektedir. Olduka basit bir ekirdek yapsna sahiptir. Bu almada iletiler, ileti kuyruklar ve semaforlar proje kapsamna alnmamtr. Bu aamada aadaki blmlerde ncelikle PICOSun de sahip olduu baz temel iletim sistemi kavramlarndan sz edilecek ve PICOS iletim sisteminin bu zellikleri nasl salad belirtilecektir.

25

4.2. letim Sistemi Kavramlar 4.2.1. Grev oklu programlamal ya da oklu-ilemcili bir ortamda sistem tarafndan bir i esi olarak ele alnan bir ya da daha ok komut dizisidir. Aada basit grev rnekleri verilmitir: LCD ekran zerinde bir mesaj gstermek Bir uyar geldiinde kl ikaz vermek 4.2.2. Kesme Program aknn durdurulup daha nceden belirlenmi bir program kodunun (Interrupt Service Routine) altrlmasna neden olan dhili veya harici olaylardr. rnek olarak; Bir butona baslmas Bir zamanlaycnn tamas Bir giri/k ucunun durum deitirmesi verilebilir. 4.2.3. Grev ncelii Grevlere farkl deerlerde ncelik atamak durumu ciddi anlamda deitirmektedir. Bylece alma zamannda her an en nemli grevin almas garanti altna alnr. Grev ncelii, bir grevin dierlerine gre nemini belirler. Deiken veya sabit olabilir. ncelikler: Yksek Orta Dk Nmerik deerler ile ifade edilebilir.

26

4.2.4. ar stnl Prensibiyle alan Sistem (Preemptive) Bir grev kesme nedeniyle durdurulduunda ve dier grev alr hale geldiinde programlaycnn herhangi bir komut kullanmasna gerek kalmadan program aknn dier greve gemesidir. Grevler aras gei izelgeleyici tarafndan otomatik yaplr. Bu alma yntemi ekil 4.1de gsterilmitir.

ekil 4.1. ar stnl prensibine dayanan grev deiimi 4.2.5. birliki Sistem (Cooperative) letim sisteminin, arka planda beklemekte olan grevlere ancak n planda yrmekte olan grevin bo zamanlarnda iletim ans verdii oklu grevli iletim eklidir. birliki sistemde grevler aras gei programcnn kontrolndedir (ekil 4.2).

ekil 4.2. birliki grev deiimi

27

ekil-4.1 ar stnl yntemi ile alan bir izelgeleyicinin almasn gstermektedir. {1} annda dk ncelikli bir grev alrken {2} annda bir kesme meydana gelir ve {3} sresi boyunca tm yazmalar ve yt deerlerini de kapsayan ierik saklanr. {4} sresince kesmede tanmlanan komutlar iletilir. Bu arada daha yksek ncelikli bir grev altrlabilir konuma gelmi ve beklemeye balamtr. Kesme rutini biter bitmez {5} annda izelgeleyiciye gei yaplr. izelgeleyici {6} annda altrlabilir tm grevleri kontrol eder ve uygun konumdaki en yksek ncelikli greve gei yapar{7}. Yksek ncelikli grev {8} sresi boyunca tanmlanm komutlarn iletir ve biter bitmez {9} annda izelgeleyiciye dner. izelgeleyici {10} annda, daha nce dk ncelikli grev iin saklam olduu ierii geri ykler ve kald yerden devam etmesi iin dk ncelikli greve {11} annda geri dner. {12} boyunca dk ncelikli grev iletimini tamamlar. izelgeleyici benzer ekilde almasna devam eder [26]. ekil-4.2 ise ibirliki grev deiimi yntemi ile alan bir izelgeleyiciyi temsil etmektedir. Bir nceki rnekte olduu gibi dk ncelikli bir grev alrken {1} meydana gelen kesmeden{2,3} sonra yksek ncelikli greve gei salanr. Ancak aradaki fark kesme rutini iletilir iletilmez gei yaplmaz. Kesme tamamlandnda program ak kald yerden yani dk ncelikli grevden{4,5} devam eder. Dk ncelikli grev tamamlanrken kullancnn verdii bir komut ile izelgeleyiciye gei yaplr{6,7} ve izelgeleyici yksek ncelikli greve program akn devreder{8,9}. Yksek ncelikli grev iletimi tamamladnda tekrar izelgeleyiciye dner{10,11} ve program ak bu ekilde devam eder. 4.2.6. ekirdek letim sisteminin donanm zkaynaklarn atamak gibi en temel grevleri yerine getiren ksmdr. Sistemin ar stnl ile ya da ibirliki yntem ile altrlmas ekirdek tarafndan yrtlr. ekirdek, o anda alan grevin ya da bir sonraki alacak grevin en yksek ncelikli grev olmasn garanti eder.

28

4.2.7. Olay Bir grev tarafndan beklenen bir durumun gereklemesidir. Programn herhangi bir yerinde olayn gerekletii duyurulabilir, bylece programn dier ksmlar haberdar edilebilir. Butona baslmas Hata olumas Ortak kullanlan bir kaynan boa kmas Zamanlaycnn tamas Bir RS-232 karakterin alnmas veya iletilmesi 4.2.8. Grev Durumu Sistemde ele alnm bir grevin o anda ne yaptn belirtir. alyor: Herhangi bir anda program akn devam ettiren, kendi iletimini srdren grev alyor konumdadr. Ayn anda sadece bir tek grev alyor konumda olabilir. Hazr: Herhangi bir anda her an alabilir konumda olan grevlerdir. Daha ak bir ifadeyle beklemeye alnm, ertelenmi, durdurulmu ve alyor konumda olmayan, her an almaya hazr halde bekleyen grevlerdir. Ertelenmi: Daha nceden alan ancak durdurulan ve tekrar almak iin bir zamanlaycnn tamasn bekleyen grevlerdir. Ayarlanan sre tamamlandnda grev tekrar hazr konuma geer. Bekliyor: Durdurulmu ve almak iin bir olayn meydana gelmesini bekleyen grevlerdir. Durdurulmu: Daha nceden alan fakat bir daha balatlana kadar durdurulmu konumdaki grevleri ifade eder. Grev durumlar ekil 4.3te gsterilmitir.

29

ekil 4.3. Grev durumlar 4.2.9. letim Sistemi Grevleri ve olaylar yrtmek iin ekirdei, zamanlayclar ve tm ilgili yazlmlar dier bir deyile servisleri barndrr. Gerek zamanl iletim sistemleri, kritik ilemlerin belli bir zaman aralnda ve doru bir ekilde yaplmasn salayan sistemlerdir. Gerek zamanl iletim sistemleri ile gelitirilen uygulamalar ise tm grevlerin, veri yaplarnn, kesmelerin ve servislerin bulunduu uygulamalardr. 4.2.10. oklu Grev Yrtm oklu grev yrtmnden bahsedebilmek iin e zamanl alr grnen birden fazla grevin ve bu grevlerin arasndaki geilerde ilemci kontroln ve kaynak ynetimini yrten bir mekanizmann bulunmas gerekir. Bu grevi PICOS zerinde izelgeleyici stlenir. Belli gereksinimler karlandnda bir grevi durdurup dierini altrr. Gerek zamanl bir iletim sisteminin oklu grev ynetiminin en iyi ekilde kullanlmas iin grevlerin, ilemcinin herhangi bir zaman diliminde ilem gcn en iyi kullanacak ekilde planlanmas ve tanmlanmas gerekir. 30

Grevler uygun ekilde tanmland takdirde geriye kalan ii izelgeleyici yrtecektir.

oklu grev yrtm sayesinde iletim sistemi, karmak uygulamalarn daha kk ve ynetilebilir grevlere blnebilmelerine izin verir. Byle paralara ayrma, yazlmn test edilmesini, i blm yaplabilmesini ve kodun yeniden kullanlabilmesini kolaylatrr. Geleneksel yazlmlardaki zamanlama ve sralama problemleri uygulama kodundan kaldrlabilir, bu sorumluluklar artk iletim sistemi stlenir.

ekil 4.4. oklu grev yrtm Geleneksel ilemciler ayn anda sadece bir grev altrabilir ancak oklu grev yrten bir sistemin bu grevler arasnda ok hzl bir biimde gei yapmas ayn anda hepsi alyormu gibi grnmesini salar. ekil 4.4te her grev farkl bir renkle gsterilerek bu durum sembolize edilmitir [27].

31

4.2.11. izelgeleme izelgeleyici ekirdein bir paras olup herhangi bir anda hangi grevin alacana karar veren bileendir. Bir grev, ekirdek tarafndan durdurulabilecei gibi kendisini durdurmay da seebilir. Bu durum, grev bir sre beklemeye getiinde, bir olayn meydana gelmesini beklemeye baladnda ortaya kar. Durdurulmu veya bekleyen bir grev ilemeyecei iin herhangi bir ilemci gc harcamaz. 4.2.12. Grevler aras Deiim Sistemin birden fazla grevi yrtebilmesi amacyla birinden brne geerek her birini ksa srelerle altrmasdr. Bu esnada tm global saklayclar ve yt deerleri daha sonra kullanlmak zere depoland iin ierik geii olarak da adlandrlr. Bir grev alrken ilemci gc tketir, yazmalara, RAM ve ROM bellee eriir. Her programn bu kaynaklar kullanabilecei dnlerek grevler aras deiim esnasnda tm bu kaynaklar saklanr ve bu kaynaklarn tm ksaca ierik olarak adlandrlr. Bir grev birka komutun bir araya gelmesiyle oluur. ekirdein bir grevi ne zaman durduraca, ne zaman tekrar altraca belli deildir. ki yazmac toplayan aadaki komut dizisini ele alalm. {1} {2} {3} {4} {5} {6} addlw 0x7D addwf YAZMAC1, 1 addlw 0x3B addwf YAZMAC2, 1 movwf YAZMAC1 addwf YAZMAC2,1

{5} numaral komutun iletilmesinden hemen sonra tam {6} numaral komut iletilmeden ekirdein bu komut dizisine sahip olan grevi durdurduunu ve baka bir greve gei yapacan dnelim. alacak olan grev, global olarak tanmlanan bu yazma deerlerini deitirebilir. Bu durumda durdurulan grev yazma deerlerinin deitiini bilemeyecei iin tekrar alr hale geldiinde deien yazma deerlerleri ile yaplan toplama ilemi hatal sonu verecektir. Ayn

32

durum yta depolanan ve geri yklenen deerler iin de geerlidir. Bu nedenle iletim sistemi ekirdei her greve ait ierii durdurulduunda ya da daha doru bir deyile arka plana alndnda saklamak ve tekrar altrldnda geri yklemekle ykmldr. Bu ilem grevler aras deiim olarak adlandrlr. 4.2.13. Gerek Zamanl Uygulamalar Gerek zamanl iletim sistemlerinin amac, dierleri gibi sadece istenilen fonksiyonun baar ile almas deil belli bir zaman dilimi ierisinde sonulanmasdr. rnein bir savunma sisteminde bir hedefe kilitlenmi bir fzeyi hedefe varmadan nce imha edecek sistemin gerek zamanl olmas gerekir. Hedefe ulatktan sonra fzenin imha edilmesinin bir anlam kalmayacaktr. Gerek zamanl bir iletim sistemi gereken sre ierisinde cevap vermeli, ekirdek de zaman kstlarn salamaldr. 4.3. letim Sistemi Uygulamas Uygulama aada basit bir rnek ile aklanacaktr. lk konumda Grev 1

almaktadr. Grev 2 ise daha nceden alyorken durdurulmu ve bu greve ait tm ierik saklanmtr. ekil 4.5te iletim sistemi kesmesinden nce ierik durumlar gsterilmektedir. Yazmalar Grev 1e ait ierik deerlerini tutmaktadr.

ekil 4.5. Grev 1 alyorken ierik

33

letim sistemi kesmesi gerekletiinde tam Grev 1 MOVLW 0x7E komutunu iletirken Grev 1e ait program saycs deerini ayn greve ait yt ierisine attktan sonra iletim sistemi kesmesinin balang koduna atlar (ekil 4.6).

ekil 4.6. Program saycs deerinin kesme tarafndan yta atlmas letim sistemi kesmesinin kodu ise aadakine benzer olmaldr.
/* Isletim sisteminin periyodik kesmesi (tick interrupt) icin komut dizisi. */ void SayilariTopla( void ) { GorevDevret(); asm volatile ( "retfie" ); } /*--------------------------------------------------*/ void GorevDevret( void ) { IcerigiSakla(); TikleriArttir(); GorevDegistir(); IcerigiGeriYukle(); asm volatile ( "return" ); } /*--------------------------------------------------*/

SayilariTopla() fonksiyonu GorevDevret() fonksiyonunu arr. GorevDevret() fonksiyonu IcerigiSakla() fonksiyonu ile tm ierii Grev 1in ytna ykler.

34

Gorev 1e ait yt iaretisi kendi ieriinin en banda bulunan adresi gsterir. cerigiSakla() grevini yt iaretleyicisinin gsterdii adresi yedekleyerek tamamlar (ekil 4.7). Daha nceden altrlp durdurulmu olan Grev 2nin yt iaretleyicisinin gsterdii adresin kopyas ekirdek tarafndan tutulmaktadr.

ekil 4.7. Grev 1 ieriinin Grev 1 ytna atlmas TikleriArttir() fonksiyonu Grev 1 ierii saklandktan sonra alr ve bu tikler belli bir sayya ulanca Grev 2 aktif duruma gelir. Grev 2, Grev 1den daha yksek ncelie sahip olduundan GorevDegistir() fonksiyonu, grevleri kontrol ettiinde ilemci gcn kullanma hakkn Grev 2ye verir (ekil 4.8).

35

ekil 4.8. Grev 2 ierii cerigiGeriYukle() fonksiyonu ise daha nceden saklanm olan Grev 2 ieriini ilgili ilemci yazmalarna ykler. Sadece program saycs ytta kalr (ekil 4.9).

ekil 4.9. Grev 2 ieriinin geri yklenmesi

36

GorevDevret() iini

bitirdikten

sonra kald

yerden

devam

etmesi

iin

SaylarTopla() fonksiyonuna geri dner. Bu fonksiyonun kald yerde iletilecek ilk komut ise RETFIE komutudur. RETFIE komutu, ytta bulunan sradaki deerin kesme meydana geldiinde saklanan dn deeri olduunu varsayar. Sistem kesmesi meydana geldiinde hemen Grev 1 dn adresi ytta saklanr. Ancak yt iaretisi kesme srasnda deitirilmi ve Grev 2yi gstermektedir. Bu nedenle RETFIE komutu ytdan dn adresini aldnda Grev 2 almaya balayacaktr. Sistem kesmesi Grev 1i alrken kesmi, fakat devamnda Grev 2ye dnmtr. Bylece grevler arasndaki gei tamamlanmtr. 4.4. PICOS Yaplandrma Ayarlar Gelitirilen gerek zamanl iletim sisteminde yer alan yaplandrma ayarlar sayesinde, sistem ar stnl prensibiyle ya da ibirliki prensip ile altrlabilir. Ayrca sistem kesmesi zaman, saat frekans, tanmlanabilecek en yksek ncelik seviyesi, toplam hafza bykl, ncelik atayabilme zellii, ncelik okuyabilme zellii, grev silme, grev durdurma, grev bekletme, grev erteleme gibi birok sistem karakteristii kullanc tarafndan tanmlanabilir. Tm bu yaplandrma ayarlar ve detaylar EK Bde yer almaktadr. 4.5. Bellek Kullanm letim sistemi ekirdei, her grev oluturulduunda bu greve bir RAM bellek atamaktadr. ekirdek bellek kullanma ihtiyac duyduunda kullanlan bir fonksiyon sayesinde gerekli bellek ayrlmaktadr. Bellek kullanmn bellek.c dosyas ierisinde yer alan kod kontrol etmektedir. Olduka basit olarak tasarlanan bellek ynetimi birok grevi ayn anda kullanmaya elverili ekilde tasarlanmtr. Kullanlan algoritma bir dizi kullanmakta ve bu diziyi bellek kullanma istei geldike alt gruplara blmektedir. Toplam bellek bykl Toplam_Hafiza_Buyuklugu parametresi ile ayarlanabilmektedir. Algoritma rastgele olmayan bir yapda

37

almaktadr. Yani bir bloa gidip dnmek her zaman eit zaman almaktadr. Bir ok uygulama iin bu bellek ynetim eklinin ideal olduu dnlmektedir. 4.6. PICOS Fonksiyonlar PICOSa iletim sistemi karakteristii, bir dizi fonksiyon ile kazandrlmtr. Bu fonksiyonlar ve aklamalar EK Cde yer almaktadr. 4.7. rnek Uygulama Aada PICOS ile gerekletirilen bir rnek uygulama ve ayrntl aklamalar yer almaktadr.
(1)#include "kontrol.h" (2)#include "cekirdek.h" (3)#include "sayi.h" (4)#pragma config WDT = OFF, OSC = XT, DEBUG = OFF (5)static void LedYak1( void *pvParameters ); (6)static void LedYak2( void *pvParameters ); (7)GorevAdresi GorevAdres1; (8)GorevAdresi GorevAdres2; (9)void bekle (void) { (10) unsigned int i; (11) for (i = 0; i < 10000 ; i++); } (12)void main( void ) { (13)INTCON = 0x10; (14)INTCON2 = 0x80; (15)RCONbits.IPEN = 0; (16)INTCONbits.GIEH = 1; (17)PORTB = 0; (18)TRISB = 1; (19)GorevOlustur( LedYak1, "LED1", BosGorevOnceligi+2, &GorevAdres1 ); (20)GorevOlustur( LedYak2, "LED2", BosGorevOnceligi+1, &GorevAdres2 ); (21)CokluGorevBaslat(); }

MINIMUM_YIGIT_BUYUKLUGU, MINIMUM_YIGIT_BUYUKLUGU,

NULL, NULL,

(22)static void LedYak1( void *pvParameters ) { (23)for( ;; ) { (24) bekle();

38

{ (25) } (26) (27) } } bekle(); GorevDurdur( NULL ); PORTBbits.RB4 = !( PORTBbits.RB4 );

(28)static void LedYak2( void *pvParameters ) { (29)for( ;; ) { (30) bekle(); { (31) PORTBbits.RB7 = !( PORTBbits.RB7 ); } (32) bekle(); } (33)void Kesme (void) { (34)if (INTCONbits.INT0IF) { (35)INTCON = 0x50; (36)KesmedenGorevBaslatma (GorevAdres1); (37)bekle(); (38)INTCONbits.GIEH = 1; (39)INTCONbits.INT0IF = 0; } } rnek Uygulama

(1), (2) ve (3) satrlarnda n tanml #include komutu ile tanmlamalar ieren kontrol.h, cekirdek.h ve sayi.h dosyalar projeye eklenmitir. (4) satrnda ise kullanlan mikrodenetleyicinin konfigrasyon bitleri tanmlanmtr. Beki kpei zamanlaycs (Watchdog timer) pasif, osilatr tipi kristal ve hata ayklama seenei de pasif olarak seilmitir. (5) ve (6) satrlarnda kullanlacak iki grevin ismi tanmlanmtr. (7) ve (8) satrlarnda ise bu iki greve atanacak adresler seilmitir. (9), (10) ve (11) satrlarnda bekle isimli bir fonksiyon tanmlanm ve bu fonksiyon arldnda program ak 10 ms boyunca bekletilmitir. (12) satrnda ana dng tanmlanmtr. (13), (14), (15) ve (16) satrlarnda harici bir kesme tanmlanm, bunun iin kesme kontrol bitleri, ncelik atama bitleri ve

39

global kesme bitlerine gerekli deerler atanmtr. Bu harici kesme harici bir buton aracl ile kullanlacaktr. (17) ve (18) satrlarnda B portuna ait RB0 ucu giri, dier ular k olarak ayarlanm ve k ularnn balang deerleri 0 olarak atanmtr. (19) ve (20) satrlarnda LedYak1 ve LedYak2 isimli iki grev oluturulmutur. Bu grevlerden ilki ikinci ncelik seviyesinde alrken dieri birinci ncelik seviyesinde balatlmtr. Grevlere uygun yt byklkleri, aklamalar ve adresler verilmitir. (21) satr ise oklu grev yrtmn balatr. Bylece ekirdek almaya balar ve uygun durumdaki grevi altrrken dier grevlerin de durumlarn, ncelik seviyelerini kontrol eder. (22) satrnda LedYak1 grevi tanmlanmtr. (23), (24), (24), (25), (26) ve (27) satrlarnda ise bu grev ierisinde sonsuz bir dngde nce program aknn insan gzyle fark edilebilmesi iin bir sre beklendikten sonra B portunun RB4 ucunun k deeri deitirilir ve tekrar edilen bir gecikme sonrasnda bu grev durdurulmaktadr. GorevDurdur fonksiyonuna parametre olarak bo bir adres verildii iin kendisini durdurur. (28) satrnda ise LedYak2 grevi tanmlanmtr. (29), (30), (31) ve (32) satrlarnda sonsuz bir dng ierisinde insan gznn alglayabilecei frekansta B portunun RB7 ucunun k deeri deitirilmektedir. (33) satrnda kullanc tarafndan tanmlanabilecek kesme rutini iin n tanml kesme fonksiyonu kullanlmtr. (34), (35), (36), (37), (38) ve (39) satrlarnda ise bu kesme fonksiyonu ierisinde nce kesme kayna kontrol edilmektedir. Kesme kayna RB0 ucunda kullanlan butonun 0 konumundan 1 konumuna geii deil ise kesme fonksiyonundan klmaktadr. Eer kaynak bu buton ise, nce tekrar kesme oluabilmesi iin gerekli bayraklar temizlenip gerekli kontrol bitleri ayarlandktan sonra kesme ierisinden LedYak1 isimli grev balatlmaktadr. Uygulamaya bir btn olarak bakldnda, balang aamasnda kullanlacak grevler oluturulduktan ve gerekli tm tanmlamalar yapldktan sonra gerek

40

zamanl ekirdek oklu grev yrtmne balamaktadr. Bu aamada dzenli periyotlar ile grevlerin hangi konumda olduklar ve ncelikleri kontrol edilerek hangi grevin alacana karar verilmektedir. Bu rnekte daha yksek ncelie sahip olan birinci grev olan LedYak1 ncelikle almakta ve tanmlanan ierii gerei RB4 ucunun k deerini deitirerek kendi kendini durdurmaktadr. Bu durumda ekirdek bir dahaki kontrol esnasnda hazr grevlere baktnda sadece ikinci grev olan LedYak2 bulunduundan program ak bu greve gemektedir. Bu grevde sonsuz bir dng ierisinde RB7 ucunun k deeri belli aralklarla deitirilmektedir. Program ak RB0 ucunda yer alan buton tarafndan tetiklenen kesme oluuncaya kadar bu ekilde devam eder. RB0 ucuna bal butona basldnda buton 0 konumundan 1 konumuna geer ve n tanml kesme fonksiyonu devreye girer. Kesme ierisinde tanmlanan ierik gerei LedYak1 grevi kesme ierisinden tekrar altrlr. Bylece ekirdein bir dahaki kontrolnde LedYak1 hazr konuma geeceinden ve bu grev daha yksek ncelie sahip olduundan program ak tekrar bu greve geecektir. Grld zere grevler aras geilerde programc herhangi bir komut kullanmad iin sistem ar stnl prensibine gre almaktadr. Tm bu geiler esnasnda tanml tm ierik saklanmakta ve grev almaya baladnda geri yklenmektedir. Her iki grev birden alabilir konumda olduunda daha yksek ncelie sahip olan LedYak1 grevi almaktadr.

41

BLM 5 5. SONULAR VEYAPILACAK ALIMALAR 5.1. Sonular Bu almada PIC18F452 mikrodenetleyicisi zerinde zellikle gml sistemlerde kullanlmak zere, istenildiinde ar stnl istenildiinde ibirliki prensip ile alabilen, gerek zamanl, olduka kk, basit ve kullanm son derece kolay, tm fonksiyonlar ve deikenleri Trke olarak tanmlanm, ok dk RAM, ROM bellek kullanm ve ilemci yk getiren ve olduka basit bir ekirdek yapsna sahip bir iletim sistemi tasarlanmtr. Bu iletim sistemi, yaplan almalar sonrasnda tavsiye edilen biimde [28] bir dizi teste tabi tutulmu ve oklu grev yrtme, grevler aras gei, ierik saklama ve geri ykleme, ncelik tabanl grev altrma, ar stnl prensibi ile alma, ibirliki prensip ile alma gibi zellikleri bu testler ile dorulanmtr. Bu sayede programc, geleneksel yntemlerde olduu gibi tek bir ana dng ierisinde program gelitirmek yerine uygulama ilevlerini grevlere atayabilir. Her grev ierisinde belli ilevler tanmlanr, bu grevler alma nceliklerine ve alma zamanlarna gre oluturulup altrldnda iletim sistemi ekirdei ve izelgeleyici kontrol salayacaktr. Olay gdml gelitirilecek uygulamalarda ise her olay bir grev ile tanmlanarak ve baz grevlerin bu olaylar beklemesi salanarak birbirine baml birok olaydan oluan ve karmak grnen birok uygulama basite gereklenebilir. PICOS, ayn yazma yapsna sahip olan PIC18XXX, PIC24XXX ve PIC32XXX ailelerinin tamamnda kullanlabilmektedir. Performans ile ilgili yaplan deneylerde PICOSun iki greve sahip basit uygulamalarda, 16 KB program belleine sahip olan PIC 18F452 zerinde yaklak % 35 civarnda bellek tkettii saptanmtr. Grevler aras geiler ise 432 komut evrimine karlk gelmektedir. Yt bykl 105 iken yaplan bu lmde PIC 18F452 kullanlmtr. lmler 4 MHz kristal osilatr ile yaplm olup PIC iin evrimii komut iletim sresi harici frekansn ne karlk geldiinden bir komut 1 us srede iletilmektedir. Dolaysyla bahsi geen deney ortamnda grevler aras gei 432 us srmektedir. Ancak bu deer platforma ve yt byklne gre 42

deiiklik gstermektedir [29]. Seilen mikrodenetleyiciye gre deiebilen grevler aras gei sresi, yt bykl ile doru orantl olarak deiim gstermektedir. Dk yt byklkleri daha ksa grevler aras gei sresine, byk yt byklkleri ise daha uzun grevler aras gei sresine karlk gelmektedir. Kesmelerin iletilmesinde meydana gelen kesme gecikmesinin lm yine ayn ortamda yaplm ve 3 komut evrimine karlk gelen bir kesme gecikmesi llmtr. Benzer ekilde hesaplanarak kesme gecikmesi 3 us olarak tespit edilmitir. 5.2. Yaplacak almalar Bu almada bahsi geen temel iletim sistemi fonksiyonlar salanrken iletim sistemine ekstra esneklik ve kullanm kolayl getiren semaforlar, iletiler ve ileti kuyruklar projede ele alnmamtr. Gelecek almalarda grevler aras haberlemeyi salayan semaforlarn, iletilerin ve ileti kuyruklarnn PICOSa eklenmesi, bylelikle kullanlabilirliin arttrlmas amalanmaktadr.

43

KAYNAKLAR

[1]

Akademik

Biliim

2008

tam

bildiri

metinleri

eriim

sayfas:

http://ab.org.tr/ab08/sunum/110.ppt, eriim tarihi: 8 ubat 2008.

[2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14]

[15]

Wilmshurst, T., Designing Embedded Systems with PIC Microcontrollers, Elsevier, Newnes, University of Derby, UK, 2007. Curtis, K.E., Embedded Multitasking, Elsevier, Newnes, AZ, USA, 2006. Teknohaber sitesinde yer alan Gml Sistemler balkl makalenin eriim adresi: http://www.teknohaber.net/makale.php?id=50412, eriim tarihi: 13 Ekim 2007. Wecott, T., Applied Control Theory For Embedded Systems, Elsevier, Newnes, Oregon City, USA, 2006. Yldrm, S., Kantarc, A., Gml Sistemler in Yeni Bir letim Sistemi: eG S, IEEE Explore, 13(7), 1-4, 2007. FSF forum sitesindeki PIC hakknda her ey balkl makalenin eriim adresi: http://www.fsf.cc/pic-hakk-nda-t37/index.html, eriim tarihi: 13 Ekim 2007. Okyay, M.O., 2004, A Portable Real Time Operating System for Embedded Platforms, Y.Lisans Tezi, zmir leri Teknoloji Enstits, zmir. Vikipedi zgr ansiklopedi sayfasnda yer alan PIClerin ortaya k isimli ieriin eriim adresi: http://tr.wikipedia.org/wiki/PIC, eriim tarihi: 21 Ekim 2007. PIC mikrodenetleyici reticisi Microchip firmasnn internet sitesi eriim adresi: http://www.microchip.com, eriim tarihleri: 21 Ekim 2007, 27 Kasm 2007, 2 Aralk 2007, 2 Ocak 2008, 10 Ocak 2008, 21 Ocak 2008. PIC 18FXX2 serisinin katalogunun internet eriim adresi: http://ww1.microchip.com/downloads/en/DeviceDoc/39564c.pdf, eriim tarihleri: 2 Aralk 2008, 10 Ocak 2008. Daniel, Mosse, Olafur Gudmundsson, and Ashok K. Agrawala, Prototyping Real Time Operating Systems: a Case Study, IEEE Explore , 4(7), 144-154, 1991. Yanbing, Lit, Miodrag, Potkonjakt, and Wayne, Wolf, Real-Time Operating Systems for Embedded Computing, IEEE Explore, 15(10), 388-392, 1997. stanbul Teknik niversitesi retim yesi Binnur KURTun letim Sistemleri ders notlarnn yer ald internet sayfasnn adresi: http://www3.itu.edu.tr/~bkurt/Courses/os/lecture1.pdf, eriim tarihi: 27 Kasm 2007. Erciye, K., 1989, Datk Bir letim Sistemi in Gerek Zamanl, ok Grevli Bir ekirdek Tasarm, Doktora Tezi, Ege niversitesi Fen Bilimleri Enstits, zmir.

[16] Franz, J. Rammig, Marcelo, Gtz, Tales, Heimfarth, Peter, Janacik, Simon, Oberthr, Real-time Operating Systems for Self-coordinating Embedded Systems, IEEE Explore, 15(5), 8pp, 2006.

44

[17] Gazi niversitesi retim yesi Mustafa KKAL nin letim Sistemi ders notlarnn yer ald internet sitesinin adresi: http://w3.gazi.edu.tr/~kmustafa/islt/site_menu.htm, eriim tarihi: 27 Kasm 2007. [18] Bykkarde, S., 2004, A Real Time Operating System for 8051 Microcontrollers, Y.Lisans Tezi, Dokuz Eyll niversitesi, zmir. [19] PIC reticisi Microchip firmasnn yerleik gelitirme ortam MPLABn yer ald internet sitesinin adresi: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeI d=1406&dDocName=en019469, eriim adresi: 15 Ekim 2007. [20] PIC reticisi Microchip firmasnn yerleik gelitirme ortam MPLAB ile alan PIC C18 derleyicisin bulunduu internet sayfasnn adresi: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeI d=1406&dDocName=en010014, eriim tarihi: 15 Ekim 2007. [21] JDM seri PIC programlaycsnn internet sitesinin adresi: http://www.jdm.homepage.dk/newpic.htm, eriim adresi: 15 Ekim 2007. [22] Bren8ner USB PIC programlaycsnn internet sitesinin adresi: http://www.sprut.de/electronic/pic/projekte/brenner8/index.htm, eriim tarihi: 22 Ekim 2007. [23] Bren8ner programlaycsn satan Bartatek firmasnn internet sitesinin adresi: http://www.bartatek.com/documents/urunler/picprg/brn8se/brn8se.htm, eriim tarihi: 25 Ekim 2007. [24] JDM programlayc ile birlikte kullanlan IC-Prog bilgisayar yazlmnn internet sitesinin adresi: http://www.ic-prog.com/, eriim tarihi: 15 Ekim 2007. [25] Bren8ner USB programlayc ile birlikte kullanlan USBurn yazlmnn internet sitesinin adresi: http://www.sprut.de/electronic/soft/usburn/usburn.htm, eriim tarihi: 22 Ekim 2008. [26] Pumpkin firmas tarafndan retilen Salvo iletim sisteminin kullanm klavuzunun yer ald internet sayfasnn adresi: http://pumpkininc.com/content/doc/manual/SalvoUserManual.pdf, eriim adresi: 28 Ekim 2007. [27] FreeRTOS iletim sisteminin alma prensibinin yer ald internet sayfasnn adresi: http://www.freertos.org/implementation/index.html, eriim tarihi: 23 Aralk 2008. [28] Manthos A. Tsoukarellas, Systematically Testing a Real-Time Operating System, IEEE Explore, 15(10), 50-60, 1995. [29] Carsten, Bke, Marcelo, Gtz, Tales, Heimfarth, Configurable Real-Time Operating Systems and Their Applications, IEEE Explore, 17(1), 148-155, 2003. [30] Dr. Cengiz ERBA ile 16.11.2007 tarihinde ASELSAN tesislerinde yaplan grme.

45

EKLER

EK A: PIC18F452 KILIFLARI VE G R / IKI ULARI

ekil A.1. PIC 18F452 klflar izelge A.1. PIC18F452 giri/k ular
U smi MCLR/VPP OSC1/CLKI U Numaras 1 13 Tipi Giri Giri Tampon Tipi ST ST Aklama Sfrlama ucu / yksek voltaj ICSP programlama ucu Kristal Osilatr veya harici saat girii

46

OSC2/CLKO/RA6 RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS/LVDIN RB0/INT0 RB1/INT1 RB2/INT2 RB3/CCP2 RB4 RB5/PGM RB6/PGC RB7/PGD RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5

14 2 3 4 5 6 7 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28

Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k Giri/k

ST/CMOS TTL TTL TTL TTL TTL TTL TTL TTL TTL TTL TTL TTL TTL TTL ST ST ST ST ST ST ST ST ST/TTL ST/TTL ST/TTL ST/TTL ST/TTL ST/TTL

Kristal Osilatr, harici saat k veya genel amal giri/k ucu Saysal giri/k veya analog giri 1 Saysal giri/k veya analog giri 2 Saysal giri/k, analog giri 3 veya Anolog/Saysal Voltaj girii Saysal giri/k, analog giri veya Anolog/Saysal Voltaj girii Saysal giri/k, analog giri veya Zamanlayc 0 harici saat girii Saysal giri/k, analog giri 4 veya dk voltaj alglama Saysal giri/k, harici kesme 0 Saysal giri/k, harici kesme 1 Saysal giri/k, harici kesme 2 Saysal giri/k, karlatrma 2 girii Saysal giri/k, deiiklikte kesme biti Saysal giri/k, dk voltaj programlama ICSP ucu Saysal giri/k, ICD ve ICSP saat ucu Saysal giri/k, ICD ve ICSP veri ucu Saysal giri/k, zamanlayc 1 osilatr veya harici saat girii Saysal giri/k, zamanlayc 1 osilatr girii, yakalama 2 girii, karlatrma 2 k, PWM 2 k Saysal giri/k, yakalama 1 girii, karlatrma 1 k, PWM 1 k Saysal giri/k, senkron seri saat giri/k Saysal giri/k, SPI veri girii, I2C veri giri/k Saysal giri/k, SPI veri k Saysal giri/k, USART asenkron iletim, USART senkron saat Saysal giri/k, USART asenkron alm, USART senkron veri Saysal giri/k, paralel ikincil port veri ucu Saysal giri/k, paralel ikincil port veri ucu Saysal giri/k, paralel ikincil port veri ucu Saysal giri/k, paralel ikincil port veri ucu Saysal giri/k, paralel ikincil port veri ucu Saysal giri/k, paralel ikincil

47

RD6/PSP6 RD7/PSP7 RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7

29 30 8 9 10

Giri/k Giri/k Giri/k Giri/k Giri/k G G

ST/TTL ST/TTL ST/TTL ST/TTL ST/TTL -

VDD 12,31 VSS 11,32 ST: Schmitt Tetikleyicisi

port veri ucu Saysal giri/k, paralel ikincil port veri ucu Saysal giri/k, paralel ikincil port veri ucu Saysal giri/k, okuma kontrol. analog giri 5 Saysal giri/k, yazma kontrol, analog giri 6 Saysal giri/k, devre seme ucu, analog giri 7 Toprak referans ucu Doru akm besleme ucu

48

EK B: PICOS LET M S STEM FONKS YONLARI GorevOlustur Yeni bir grev oluturmak iin kullanlan fonksiyondur. Oluturulan grev almaya hazr grevler listesine eklenir. Kullanm: GorevOlustur ( GorevKodu, GorevAdi, YigitDerinligi, ParametreIsaretcisi, OncelikSeviyesi, GorevAdresi ) isaretci: Greve ait kodlamann yapld fonksiyonu iaret eden parametredir. GorevIsmi: Greve verilen aklayc isim. YigitBuyuklugu: Grev ytnn tutabilecei deiken saysn gsteren parametredir. 32-bitlik bir yt kullanlyorsa ve yt bykl 20 olarak tanmlandysa yt iin 80 bayt bellek ayrlacaktr. ParametreIsaretcisi: Oluturulan grev iin kullanlacak parametreleri gsteren iaretidir. OncelikSeviyesi: Grevin hangi ncelik seviyesinde alacan ifade eder. GorevAdresi: Grevin kulland adresi gsteren parametredir. GorevSil Oluturulmu bir grevi silmek iin kullanlr. Bu fonksiyonu kullanabilmek iin Gorev_Silme_Ozelligi parametresinin 1 olarak tanmlanmas gerekir. Silinen grev tm listelerden karlacaktr. Kullanm: GorevSil( GorevAdresi ) GorevAdresi: Silinecek grevin adresini ifade eder. NULL olarak kullanlrsa ierisinde bulunulan grev silinecektir.

GrevErtele Bir grevi, ifade edilen tik says kadar ertelemek iin kullanlr. Kullanlabilmesi iin Gorev_Erteleme_Ozelligi parametresinin 1 olarak tanmlanm olmas gerekir. Grevin bloke olarak bekleyecei sre tik alma hzna baldr. 49

Kullanm: GorevErtele( ErtelemeTikSayisi ) ErtelemeTikSayisi: Tik periyodu cinsinden grevin ertelenecei sreyi gsterir. GorevBeklet Bir grevi, belirtilen bir zamana kadar bekletmek iin kullanlr. Kullanm: GorevBeklet( OncekiUyanmaZamani, ZamanArtisi ) OncekiUyanmaZamani: Grevin bir nceki bekletmeden kma zamann gsteren iaretiyi ifade eder. ZamanArtisi: Arttrlacak zaman periyodunu gsterir. GorevBeklet fonksiyonunun, GorevErtele fonksiyonundan nemli bir fark vardr. GorevErtele fonksiyonu kullanlrken uyanma zaman arld ana bal bir zaman ile belirtilirken, GorevBeklet fonksiyonunda tam olarak belirtilen bir uyanma zaman sz konusudur. GorevBeklet fonksiyonu iin daha nceden meydana gelmi bir uyanma zaman belirtilmise hi beklemeden hemen alacaktr. Bu nedenle GorevBeklet fonksiyonu ile durdurulan bir grev, belli periyotlar ile uyanma zamann yeniden hesaplamak durumundadr. GorevOnceligiAl Bir grevin o anda hangi ncelik seviyesinde altn geri dndrmeye yarayan fonksiyondur. Kullanm: GorevOnceligiAl( GorevAdresi ) GorevAdresi: ncelii okunacak grevin adresini ifade eder. NULL olarak kullanlrsa ierisinde bulunulan grevin ncelii okunacaktr. GorevOnceligiAta Bir grevin alt ncelik seviyesini belirtilen ncelik seviyesine getirmeye yarayan fonksiyondur. Kullanm:

50

GorevOnceligiAta( GorevAdresi, YeniOncelik ) GorevAdresi: ncelik atanacak grevin adresini ifade eder. NULL olarak kullanlrsa ierisinde bulunulan grevin ncelii atanacaktr. Yenincelik: ncelik atanacak grevin hangi ncelik seviyesinde alacan belirleyen parametredir. GorevDurdur almakta olan bir grevi durdurmaya yarayan fonksiyondur. Durdurulan grev tekrar alabilir konuma gelene kadar alan grevler listesinde yer almayacaktr. Kulanm: GorevDurdur( GorevAdresi ) GorevAdresi: Durdurulacak grevin adresini ifade eder. NULL olarak kullanlrsa ierisinde bulunulan grev durdurulacaktr. GorevBaslat GorevDurdur fonksiyonu ile durdurulmu bir grevi tekrar balatmaya yarayan bir fonksiyondur. Balatlan grev almaya hazr grevler listesine eklenecektir. Kullanm: GorevBaslat( GorevAdresi ) GorevAdresi: Balatlacak grevin adresini ifade eder. NULL olarak kullanlrsa ierisinde bulunulan grev balatlacaktr. KesmedenGorevBaslat Durdurulan bir grevi kesme ierisinden balatabilmek iin kullanlan bir fonksiyondur. Balatlan grev GorevBaslat fonksiyonunda olduu gibi almaya hazr grevler listesine eklenir. Kullanm: KesmedenGorevBaslat( GorevAdresi ) GorevAdresi: Balatlacak grevin adresini ifade eder.

51

CizelgeleyiciyiBaslat Grevler aras geii gerekletiren izelgeleyicinin balamasn salayan fonksiyondur. ekirdekte yer alan tikleri ileterek hangi grevin ne zaman alacana karar verilir. Kullanm: CizelgeleyiciyiBaslat() Bu fonksiyon sayesinde izelgeleyici, grevlerden birisi CizelgeleyiciyiSonlandir fonksiyonunu arana kadar arka planda almaya devam edecektir. CizelgeleyiciyiSonlandir Grevler aras gei yaplmasn durdurmak iin daha nceden balatlm olan izelgeleyiciyi sonlandrr. Bylece ekirdein tikleri iletmesi de askya alnm olmaktadr. Kullanm: CizelgeleyiciyiSonlandir() CizelgeleyiciyiSonlandir fonksiyonu arldnda ekirdek tarafndan kullanlan tm kaynaklar serbest braklr. GorevleriDurdur alan grev dndaki tm grevleri durdurmaya yarayan fonksiyondur. Btn ekirdek uygulamalarn durdurur ancak tm kesmeler aktif kalr. Kullanm: GorevleriDurdur() Bu fonksiyon arldnda aktif olan grev baka bir greve gei riski olmadan GorevleriBaslat fonksiyonu arlana kadar alabilir. GorevleriBaslat alan grev dnda, durdurulmu olan grevleri tekrar balatmak iin kullanlr. Tm ekirdek uygulamalar tekrar alr hale gelir.

52

Kullanm: GorevleriBaslat() MevcutGorevAdresiniAl almakta olan grevin sahip olduu adresi dndren fonksiyondur. Bu fonksiyonun almas iin MevcutGorevAdresiniAlmaOzelligi parametresinin 1 olarak tanmlanm olmas gerekmektedir. Kullanm: MevcutGorevAdresiniAl() MevcutGorevSayisiniAl Gerek zamanl ekirdek tarafndan ynetilen toplam grev saysn dndren fonksiyondur. Durdurulmu, ertelenmi, hazr, alan tm grevleri dndrr. Silinen fakat serbest braklmayan grevler de bu sayya dhildir. Kullanm: MevcutGorevSayisiniAl() GorevListeleriniBaslat() Mevcut grevleri durumlarna ve yt kullanmlarna gre listeler. Bunun iin Gorev_Bekletme_Ozelligi ve Gorev_Erteleme_Ozelligi parametrelerinin 1 olarak tanmlanm olmas gerekmektedir. Bloke grevler B ile, hazr grevler H ile, silinen grevler S ile ve durdurulan grevler D ile gsterilir. Kullanm: GorevListeleriniBaslat()

53

EK C: PICOS YAPILANDIRMA AYARLARI Calisma_Prensibi: letim sisteminin ar stnlne gre mi yoksa ibirliki ynteme gre mi alacan belirler. 1 olarak tanmlanrsa ar stnlne gre 0 olarak tanmlanrsa ibirliki ynteme gre alr. Os_Saat_Hizi: Bu parametre sistem tik kesmesi iin tanmlanmtr. Bu kesme ise zaman lmek iin kullanlr. Dolaysyla parametre ne kadar yksek tanmlanrsa zaman o kadar hassas llebilecektir. Fakat ayn zamanda yksek bir deer, ekirdein fazla ilemci zaman tketmesi anlamna gelmekte ve verimlilii drmektedir. Bir uygulamada birden ok grev ayn ncelii paylaabilir. Byle bir durumda ekirdek, ilemci gcn her tik sonrasnda bu grevler arasnda paylatrr ve srasyla gei yapar. Daha yksek bir seim byle bir durumda her greve verilen zaman araln da daraltm olur. Saat_Frekansi: lemcinin alma frekansn ifade eder. zellikle zamanlayc gibi zamana bal bileenlerin doru almas iin gereklidir. Bu deer ilemciye balanan osilatr deerine baldr. En_Yuksek_Oncelik_Seviyesi: Uygulamada kullanlabilecek en byk grev ncelik seviyesini tanmlamaya yarar. Bu deer uygulamada tanmlanr ve programn yazlmas esnasnda bu deerden daha byk ncelik seviyesi kullanlamaz. Minimum_Yigit_Buyuklugu: Hibir i yapmayan bo bir grevin ne kadar yt kullanacan tanmlamak iin kullanlr. letim sistemi yaps ve PIC mimarisi gz nne alnarak en az 100 olarak tanmlanmaldr. Toplam_Hafiza_Buyuklugu: ekirdek tarafndan kullanlabilecek azami RAM bellek bykln ifade eder. Maksimum_Isim_Uzunlugu: Grevlere verilecek isimlerde en fazla ka karakter kullanlabileceini gsterir.

54

_16_Bit_Sstem_Saati: letim sisteminde zaman tiklerle llr. Tikler ise ekirdek balatldndan beri iletim sisteminde ka kez sistem kesmesi meydana geldiini gsterir. Bu deer 1 olarak tanmlanrsa 16 bit, 0 olarak tanmlanrsa 32 bit olarak kullanlr. 16 bit tik kullanlmas 8 ve 16 bitlik iletim sistemlerinde verimlilii olduka arttrr. Ancak bu deer olarak en fazla 65535 ile ifade edilme ksdn beraberinde getirir. Bu nedenle, 100 Hzlik bir sistem saati kullanldnda, bir grevin durdurulmas veya ertelenmesi 16 bit sayc ile en fazla 655 saniye olarak kullanlabilirken 32 bit sayc ile 42.949.673 saniye olarak kullanlabilir. Oncelik_Atama_Ozelligi: Bu parametre 1 olarak atanrsa grevlere ncelik atanabilir, yani alma zamannda grev ncelii farkl bir deer ile deitirilebilir. Ancak deer 0 olursa grev hangi ncelik ile oluturulursa o deerde kalr. Oncelik_Okuma_Ozelligi: Bu parametre 1 olarak atanrsa grevlerin ncelikleri okunabilir, yani alma zamannda grev nceliinin deeri bir fonksiyon aracl ile alnabilir. Ancak deer 0 olursa grev ncelii okunamaz. Gorev_Silme_Ozelligi: Bu parametre alma zamannda grev silme zelliinin kullanlp kullanlamayacan ifade eder. 1 olarak tanmlanrsa grevler silinebilirken 0 olarak tanmlandnda grev silinemeyecektir. Kaynaklari_Temizleme_Ozelligi: Bu parametre ise yine alma zamannda kullanlan kaynaklarn temizlenip temizlenemeyeceini gsterir. Gorev_Durdurma_Ozelligi: letim sisteminde tanmlanan grevlerin alma

zamannda durdurulup durdurulamayacan gsterir. 1 ise grevler durdurulabilir, 0 ise durdurma zellii almayacaktr. Gorev_Bekletme_Ozelligi: letim sisteminde tanmlanan grevlerin alma

zamannda bekletilip bekletilemeyeceini gsterir. 1 ise grevler beklemeye alnabilirken 0 ise alnamayacaktr. Gorev_Erteleme_Ozelligi: letim sisteminde tanmlanan grevlerin alma zamannda ertelenip ertelenemeyeceini gsterir. 1 ise grevler ertelenebilir, 0 ise ertelenemez. 55

EK D: KAYNAK KODLARI
Main.c dosyas #include "kontrol.h" #include "cekirdek.h" #include "sayi.h" #pragma config WDT = OFF, OSC = XT, DEBUG = OFF static void LedYak1( void *pvParameters ); static void LedYak2( void *pvParameters ); GorevAdresi GorevAdres1; GorevAdresi GorevAdres2; void bekle (void) { unsigned int i; for (i = 0; i < 10000 ; i++); } void main( void ) { // I/O ve interrupt ayarlar INTCON = 0x10; INTCON2 = 0x80; RCONbits.IPEN = 0; INTCONbits.GIEH = 1; PORTB = 0; TRISB = 1; //-------------------------GorevOlustur( LedYak1, "LED1", MINIMUM_YIGIT_BUYUKLUGU, NULL, BosGorevOnceligi+2, &GorevAdres1 ); GorevOlustur( LedYak2, "LED2", MINIMUM_YIGIT_BUYUKLUGU, NULL, BosGorevOnceligi+1, &GorevAdres2 ); CokluGorevBaslat(); } /*-----------------------------------------------------------*/ static void LedYak1( void *pvParameters ) { for( ;; ) { bekle(); { PORTBbits.RB4 = !( PORTBbits.RB4 ); }

56

bekle(); GorevDurdur( NULL ); } } /*-----------------------------------------------------------*/ static void LedYak2( void *pvParameters ) { for( ;; ) { bekle(); { PORTBbits.RB7 = !( PORTBbits.RB7 ); } bekle(); } } void Kesme (void) { if (INTCONbits.INT0IF) { INTCON = 0x50; KesmedenGorevBaslat (GorevAdres1); bekle(); INTCONbits.GIEH = 1; INTCONbits.INT0IF = 0; PORTB = 0; } }

57

Kuyruk.c dosyas #include <stdlib.h> #include "kontrol.h" #include "kuyruk.h" void Kuyruk_Baslat( Kuyruk *pKuyruk ) { pKuyruk->pEndeks = ( Kuyruk_Ogesi * ) &( pKuyruk->Kuyruk_Sonu ); pKuyruk->Kuyruk_Sonu.Oge_Degeri = max_gecikme; pKuyruk->Kuyruk_Sonu.pSonraki = ( Kuyruk_Ogesi * ) &( pKuyruk>Kuyruk_Sonu ); pKuyruk->Kuyruk_Sonu.pOnceki = ( Kuyruk_Ogesi * ) &( pKuyruk>Kuyruk_Sonu ); pKuyruk->Oge_Sayisi = 0; } /*-----------------------------------------------------------*/ void Kuyruk_Ogesi_Baslat( Kuyruk_Ogesi *pOge ) { pOge->pHazne = NULL; } /*-----------------------------------------------------------*/ void Kuyruk_Sonuna_Ekle( Kuyruk *pKuyruk, Kuyruk_Ogesi *pYeni_Oge ) { volatile Kuyruk_Ogesi * pEndeks; pEndeks = pKuyruk->pEndeks; pYeni_Oge->pSonraki = pEndeks->pSonraki; pYeni_Oge->pOnceki = pKuyruk->pEndeks; pEndeks->pSonraki->pOnceki = ( volatile Kuyruk_Ogesi * ) pYeni_Oge; pEndeks->pSonraki = ( volatile Kuyruk_Ogesi * ) pYeni_Oge; pKuyruk->pEndeks = ( volatile Kuyruk_Ogesi * ) pYeni_Oge; pYeni_Oge->pHazne = ( void * ) pKuyruk; ( pKuyruk->Oge_Sayisi )++; } /*-----------------------------------------------------------*/ void ListeyeEkle( Kuyruk *pKuyruk, Kuyruk_Ogesi *pYeni_Oge ) { volatile Kuyruk_Ogesi *pYineleyici; SistemSaatiTipi Ekleme_Degeri; Ekleme_Degeri = pYeni_Oge->Oge_Degeri;

58

if( Ekleme_Degeri == max_gecikme ) { pYineleyici = pKuyruk->Kuyruk_Sonu.pOnceki; } else { for( pYineleyici = ( Kuyruk_Ogesi * ) &( pKuyruk->Kuyruk_Sonu ); pYineleyici->pSonraki->Oge_Degeri <= Ekleme_Degeri; pYineleyici = pYineleyici>pSonraki ) { } } pYeni_Oge->pSonraki = pYineleyici->pSonraki; pYeni_Oge->pSonraki->pOnceki = ( volatile Kuyruk_Ogesi * ) pYeni_Oge; pYeni_Oge->pOnceki = pYineleyici; pYineleyici->pSonraki = ( volatile Kuyruk_Ogesi * ) pYeni_Oge; pYeni_Oge->pHazne = ( void * ) pKuyruk; ( pKuyruk->Oge_Sayisi )++; } /*-----------------------------------------------------------*/ void Kuyruktan_Sil( Kuyruk_Ogesi *pSilinecek_Oge ) { Kuyruk * pKuyruk; pSilinecek_Oge->pSonraki->pOnceki = pSilinecek_Oge->pOnceki; pSilinecek_Oge->pOnceki->pSonraki = pSilinecek_Oge->pSonraki; pKuyruk = ( Kuyruk * ) pSilinecek_Oge->pHazne; if( pKuyruk->pEndeks == pSilinecek_Oge ) { pKuyruk->pEndeks = pSilinecek_Oge->pOnceki; } pSilinecek_Oge->pHazne = NULL; ( pKuyruk->Oge_Sayisi )--; } /*-----------------------------------------------------------*/

59

Bellek.c dosyas #include <stdlib.h> #include "kontrol.h" #include "cekirdek.h" #if BAYT_SIRALAMASI == 8 #define BAYT_SIRALAMA_MASKESI ( ( size_t ) 0x0007 ) #endif #if BAYT_SIRALAMASI == 4 #define BAYT_SIRALAMA_MASKESI #endif #if BAYT_SIRALAMASI == 2 #define BAYT_SIRALAMA_MASKESI #endif #if BAYT_SIRALAMASI == 1 #define BAYT_SIRALAMA_MASKESI #endif #ifndef BAYT_SIRALAMA_MASKESI #error "Hatali BAYT_SIRALAMASI tanimi" #endif static struct OS_YIGIT { unsigned long random; unsigned char yigit1[ TOPLAM_HAFIZA_BUYUKLUGU ]; } yigit; static size_t Sonraki_Bos_Bayt = ( size_t ) 0; void *pYerlestir( size_t Istenen_Boyut ) { void *pGeriDon = NULL; #if BAYT_SIRALAMASI != 1 if( Istenen_Boyut & BAYT_SIRALAMA_MASKESI ) { Istenen_Boyut += ( BAYT_SIRALAMASI - ( Istenen_Boyut & BAYT_SIRALAMA_MASKESI ) ); } #endif GorevleriDurdur(); { if( ( ( Sonraki_Bos_Bayt + Istenen_Boyut ) < TOPLAM_HAFIZA_BUYUKLUGU ) && ( ( size_t ) 0x0003 )

( ( size_t ) 0x0001 )

( ( size_t ) 0x0000 )

60

( ( Sonraki_Bos_Bayt + Istenen_Boyut ) > Sonraki_Bos_Bayt ) )/* Tasmayi kontrol et. */ { pGeriDon = &( yigit.yigit1[ Sonraki_Bos_Bayt ] ); Sonraki_Bos_Bayt += Istenen_Boyut; } } GorevleriBaslat(); return pGeriDon; } /*-----------------------------------------------------------*/ void BellekBosalt( void *pv ) { ( void ) pv; } /*-----------------------------------------------------------*/ void Bloklari_Baslat( void ) { Sonraki_Bos_Bayt = ( size_t ) 0; }

61

Cekirdek.c dosyas #include <stdio.h> #include <stdlib.h> #include <string.h> #include "kontrol.h" #include "cekirdek.h" #define BOSTA_YIGIT_BUYUKLUGU MINIMUM_YIGIT_BUYUKLUGU #ifndef MAKSIMUM_ISIM_UZUNLUGU #define MAKSIMUM_ISIM_UZUNLUGU 16 #endif #if MAKSIMUM_ISIM_UZUNLUGU < 1 #undef MAKSIMUM_ISIM_UZUNLUGU #define MAKSIMUM_ISIM_UZUNLUGU 1 #endif #ifndef KESMEDEN_GOREV_BASLATMA_OZELLIGI #define KESMEDEN_GOREV_BASLATMA_OZELLIGI 1 #endif typedef struct grvGorevKontrolBlogu { volatile unsigned char *pYigitBasi; Kuyruk_Ogesi GenelKuyrukOgesi; Kuyruk_Ogesi OlayListeOgesi; unsigned char Oncelik; unsigned char *pStack; signed char GorevAdi[ MAKSIMUM_ISIM_UZUNLUGU ]; } grvGKB; grvGKB * volatile AktifGKB = NULL; static Kuyruk HazirGorevlerListesi[ EN_YUKSEK_ONCELIK_SEVIYESI ]; static Kuyruk ErtelenenGorevListesi1; static Kuyruk ErtelenenGorevListesi2; static Kuyruk * volatile ErtelenenGorevListesi; static Kuyruk * volatile Tasma_ErtelenenGorevListesi; static Kuyruk BekleyenHazirListe; #if ( GOREV_SILME_OZELLIGI == 1 ) static volatile Kuyruk SonlanmayiBekleyenGorevler; static volatile unsigned char SilinenGorevler = ( unsigned char ) 0; #endif #if ( GOREV_DURDURMA_OZELLIGI == 1 ) static Kuyruk DurdurulanGorevListesi; #endif

62

static volatile unsigned char MevcutGorevSayisi static volatile SistemSaatiTipi TikSayisi static unsigned char KullanilanEnYuksekOncelik BosGorevOnceligi; static volatile unsigned char HazirEnYuksekOncelik static volatile signed char CizelgeleyiciAktif static volatile unsigned char CizelgeleyiciPasif static volatile unsigned char AtlananTikler 0; static volatile char AtlananGecis static volatile char TasmaSayisi #define YigitDoldurmaBayti ( 0xa5 )

= ( unsigned char ) 0; = ( SistemSaatiTipi ) 0; = = BosGorevOnceligi; = 0; = ( unsigned char ) 0; = ( unsigned char ) = ( char ) 0; = ( char ) 0;

#define BlokeGorev_KRK ( ( signed char ) 'B' ) #define HazirGorev_KRK ( ( signed char ) 'H' ) #define SilinenGorev_KRK ( ( signed char ) 'S' ) #define DurdurulanGorev_KRK ( ( signed char ) 'D' ) #define TamponaYaz() #define GoreviKuyrugaEkle( pGKB ) \ { \ if( pGKB->Oncelik > HazirEnYuksekOncelik ) \ { \ HazirEnYuksekOncelik = pGKB->Oncelik; \ } \ Kuyruk_Sonuna_Ekle( ( Kuyruk * ) &( HazirGorevlerListesi[ pGKB->Oncelik ] ), &( pGKB->GenelKuyrukOgesi ) ); \ } #define ErtelenmisGorevleriKontrolEt() \ { \

63

register grvGKB *pGKB; \ \ while( ( pGKB = ( grvGKB * ) Ilk_Kayit_Sahibini_Al( ErtelenenGorevListesi ) ) != NULL ) \ { \ if( TikSayisi < Liste_Oge_Degerini_Al( &( pGKB->GenelKuyrukOgesi ) ) ) \ { \ break; \ } \ Kuyruktan_Sil( &( pGKB->GenelKuyrukOgesi ) ); \ \ if( pGKB->OlayListeOgesi.pHazne ) \ { \ Kuyruktan_Sil( &( pGKB->OlayListeOgesi ) ); \ } \ GoreviKuyrugaEkle( pGKB ); \ } \ }

64

#define AdrestenGKByiAl( pAdres ) ( ( pAdres == NULL ) ? ( grvGKB * ) AktifGKB : ( grvGKB * ) pAdres ) static void GKBDegiskenleriniBaslat( grvGKB *pGKB, const signed char * const GorevAdi, unsigned char Oncelik ); static void GorevListeleriniBaslat( void ); static GorevIslev( BosGorev, pvParameters ); #if ( ( GOREV_SILME_OZELLIGI == 1 ) || ( KAYNAKLARI_TEMIZLEME_OZELLIGI == 1 ) ) static void GKByiSil( grvGKB *pGKB ); #endif static void SonlanmayiBekleyenGorevleriKontrolEt( void ); static grvGKB *GKBveYigitiYerlestir( unsigned int YigitDerinligi ); #if ( GOREV_DURDURMA_OZELLIGI == 1 ) static char GorevDurmusMu( const grvGKB * const pGKB ); #endif signed char GorevOlustur( dGorevKodu vGorevKodu, const signed char * const GorevAdi, unsigned int YigitDerinligi, void *pvParameters, unsigned char Oncelik, GorevAdresi *pOlusturulanGorev ) { signed char GeriDon; grvGKB * pYeniGKB; pYeniGKB = GKBveYigitiYerlestir( YigitDerinligi ); if( pYeniGKB != NULL ) { unsigned char *pYigitBasi; GKBDegiskenleriniBaslat( pYeniGKB, GorevAdi, Oncelik ); #if YigitBuyumesi < 0 { pYigitBasi = pYeniGKB->pStack + ( YigitDerinligi - 1 ); } #else { pYigitBasi = pYeniGKB->pStack; } #endif

65

pYeniGKB->pYigitBasi = YigitiBaslat( pYigitBasi, vGorevKodu, pvParameters ); KritikBolgeBaslangici(); { MevcutGorevSayisi++; if( MevcutGorevSayisi == ( unsigned char ) 1 ) { AktifGKB = pYeniGKB; GorevListeleriniBaslat(); } else { if( CizelgeleyiciAktif == 0 ) { if( AktifGKB->Oncelik <= Oncelik ) { AktifGKB = pYeniGKB; } } } if( pYeniGKB->Oncelik > KullanilanEnYuksekOncelik ) { KullanilanEnYuksekOncelik = pYeniGKB->Oncelik; } GoreviKuyrugaEkle( pYeniGKB ); GeriDon = Gecerli; } KritikBolgeSonu(); } else { GeriDon = errGerekliBellekAyrilamiyor; } if( GeriDon == Gecerli ) { if( ( void * ) pOlusturulanGorev != NULL ) { *pOlusturulanGorev = ( GorevAdresi ) pYeniGKB; } if( CizelgeleyiciAktif != 0 ) { if( AktifGKB->Oncelik < Oncelik ) { GorevDevret();

66

} } } return GeriDon; } /*-----------------------------------------------------------*/ #if ( GOREV_SILME_OZELLIGI == 1 ) void GorevSil( GorevAdresi pSilinecekGorev ) { grvGKB *pGKB; GorevKritikBolge(); { if( pSilinecekGorev == AktifGKB ) { pSilinecekGorev = NULL; } pGKB = AdrestenGKByiAl( pSilinecekGorev ); Kuyruktan_Sil( &( pGKB->GenelKuyrukOgesi ) ); if( pGKB->OlayListeOgesi.pHazne ) { Kuyruktan_Sil( &( pGKB->OlayListeOgesi ) ); } Kuyruk_Sonuna_Ekle( ( Kuyruk * ) &SonlanmayiBekleyenGorevler, &( pGKB->GenelKuyrukOgesi ) ); ++SilinenGorevler; } GorevKritikBolgeSonu(); if( CizelgeleyiciAktif != 0 ) { if( ( void * ) pSilinecekGorev == NULL ) { GorevDevret(); } } } #endif #if ( GOREV_BEKLETME_OZELLIGI == 1 )

67

void GorevBeklet( SistemSaatiTipi * const pOncekiUyanmaZamani, SistemSaatiTipi ZamanArtisi ) { SistemSaatiTipi UyanmaZamani; char GecisYapildi, Bekleme = 0; GorevleriDurdur(); { UyanmaZamani = *pOncekiUyanmaZamani + ZamanArtisi; if( TikSayisi < *pOncekiUyanmaZamani ) { if( ( UyanmaZamani < *pOncekiUyanmaZamani ) && ( UyanmaZamani > TikSayisi ) ) { Bekleme = 1; } } else { if( ( UyanmaZamani < *pOncekiUyanmaZamani ) || ( UyanmaZamani > TikSayisi ) ) { Bekleme = 1; } } *pOncekiUyanmaZamani = UyanmaZamani; if( Bekleme ) { Kuyruktan_Sil( ( Kuyruk_Ogesi * ) &( AktifGKB>GenelKuyrukOgesi ) ); ListeOgeDegeriniAyarla( &( AktifGKB>GenelKuyrukOgesi ), UyanmaZamani ); if( UyanmaZamani < TikSayisi ) { ListeyeEkle( ( Kuyruk * ) Tasma_ErtelenenGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); } else { ListeyeEkle( ( Kuyruk * ) ErtelenenGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); } } } GecisYapildi = GorevleriBaslat();

68

if( !GecisYapildi ) { GorevDevret(); } } #endif #if ( GOREV_ERTELEME_OZELLIGI == 1 ) void GorevErtele( SistemSaatiTipi ErtelemeTikSayisi ) { SistemSaatiTipi UyanmaZamani; signed char GecisYapildi = 0; if( ErtelemeTikSayisi > ( SistemSaatiTipi ) 0 ) { GorevleriDurdur(); { UyanmaZamani = TikSayisi + ErtelemeTikSayisi; Kuyruktan_Sil( ( Kuyruk_Ogesi * ) &( AktifGKB>GenelKuyrukOgesi ) ); ListeOgeDegeriniAyarla( &( AktifGKB>GenelKuyrukOgesi ), UyanmaZamani ); if( UyanmaZamani < TikSayisi ) { ListeyeEkle( ( Kuyruk * ) Tasma_ErtelenenGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); } else { ListeyeEkle( ( Kuyruk * ) ErtelenenGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); } } GecisYapildi = GorevleriBaslat(); } if( !GecisYapildi ) { GorevDevret(); } } #endif /*-----------------------------------------------------------*/ #if ( ONCELIK_OKUMA_OZELLIGI == 1 )

69

unsigned char GorevOnceligiAl( GorevAdresi pGorev ) { grvGKB *pGKB; unsigned char uGeriDon; GorevKritikBolge(); { pGKB = AdrestenGKByiAl( pGorev ); uGeriDon = pGKB->Oncelik; } GorevKritikBolgeSonu(); return uGeriDon; } #endif #if ( ONCELIK_ATAMA_OZELLIGI == 1 ) void GorevOnceligiAta( GorevAdresi pGorev, unsigned char YeniOncelik ) { grvGKB *pGKB; unsigned char MevcutOncelik, GecisGerekli = 0; if( YeniOncelik >= EN_YUKSEK_ONCELIK_SEVIYESI ) { YeniOncelik = EN_YUKSEK_ONCELIK_SEVIYESI - 1; } GorevKritikBolge(); { pGKB = AdrestenGKByiAl( pGorev ); MevcutOncelik = pGKB->Oncelik; if( MevcutOncelik != YeniOncelik ) { if( YeniOncelik > MevcutOncelik ) { if( pGorev != NULL ) { GecisGerekli = 1; } } else if( pGorev == NULL ) { GecisGerekli = 1; } pGKB->Oncelik = YeniOncelik;

70

ListeOgeDegeriniAyarla( &( pGKB->OlayListeOgesi ), ( EN_YUKSEK_ONCELIK_SEVIYESI - ( SistemSaatiTipi ) YeniOncelik ) ); if( ListeIcerigi( &( HazirGorevlerListesi[ MevcutOncelik ] ), &( pGKB->GenelKuyrukOgesi ) ) ) { Kuyruktan_Sil( &( pGKB->GenelKuyrukOgesi ) ); GoreviKuyrugaEkle( pGKB ); } if( GecisGerekli == 1 ) { GorevDevret(); } } } GorevKritikBolgeSonu(); } #endif #if ( GOREV_DURDURMA_OZELLIGI == 1 ) void GorevDurdur( GorevAdresi pDurdurulacakGorev ) { grvGKB *pGKB; GorevKritikBolge(); { if( pDurdurulacakGorev == AktifGKB ) { pDurdurulacakGorev = NULL; } pGKB = AdrestenGKByiAl( pDurdurulacakGorev ); Kuyruktan_Sil( &( pGKB->GenelKuyrukOgesi ) ); if( pGKB->OlayListeOgesi.pHazne ) { Kuyruktan_Sil( &( pGKB->OlayListeOgesi ) ); } Kuyruk_Sonuna_Ekle( ( Kuyruk * ) &DurdurulanGorevListesi, &( pGKB->GenelKuyrukOgesi ) ); } GorevKritikBolgeSonu(); if( ( void * ) pDurdurulacakGorev == NULL ) {

71

GorevDevret(); } } #endif #if ( GOREV_DURDURMA_OZELLIGI == 1 ) static char GorevDurmusMu( const grvGKB * const pGKB ) { char GeriDon = 0; if( ListeIcerigi( &DurdurulanGorevListesi, &( pGKB->GenelKuyrukOgesi ) ) != 0 ) { if( ListeIcerigi( &BekleyenHazirListe, &( pGKB->OlayListeOgesi ) ) != 1 ) { if( ListeIcerigi( NULL, &( pGKB->OlayListeOgesi ) ) == 1 ) { GeriDon = 1; } } } return GeriDon; } #endif #if ( GOREV_DURDURMA_OZELLIGI == 1 ) void GorevBaslat( GorevAdresi pBaslatilacakGorev ) { grvGKB *pGKB; pGKB = ( grvGKB * ) pBaslatilacakGorev; if( pGKB != NULL ) { GorevKritikBolge(); { if( GorevDurmusMu( pGKB ) == 1 ) { Kuyruktan_Sil( &( pGKB->GenelKuyrukOgesi ) ); GoreviKuyrugaEkle( pGKB ); if( pGKB->Oncelik >= AktifGKB->Oncelik ) { GorevDevret();

72

} } } GorevKritikBolgeSonu(); } } #endif #if ( ( KESMEDEN_GOREV_BASLATMA_OZELLIGI == 1 ) && ( GOREV_DURDURMA_OZELLIGI == 1 ) ) char KesmedenGorevBaslat( GorevAdresi pBaslatilacakGorev ) { char GecisGerekli = 0; grvGKB *pGKB; pGKB = ( grvGKB * ) pBaslatilacakGorev; if( GorevDurmusMu( pGKB ) == 1 ) { if( CizelgeleyiciPasif == ( unsigned char ) 0 ) { GecisGerekli = ( pGKB->Oncelik >= AktifGKB->Oncelik ); Kuyruktan_Sil( &( pGKB->GenelKuyrukOgesi ) ); GoreviKuyrugaEkle( pGKB ); } else { Kuyruk_Sonuna_Ekle( ( Kuyruk * ) &( BekleyenHazirListe ), &( pGKB->OlayListeOgesi ) ); } } return GecisGerekli; } #endif void CokluGorevBaslat( void ) { char GeriDon; GeriDon = GorevOlustur( BosGorev, ( signed char * ) "IDLE", BOSTA_YIGIT_BUYUKLUGU, ( void * ) NULL, BosGorevOnceligi, ( GorevAdresi * ) NULL ); if( GeriDon == Gecerli ) { KesmeleriPasiflestir(); CizelgeleyiciAktif = 1;

73

TikSayisi = ( SistemSaatiTipi ) 0; if( CizelgeleyiciyiBaslat() ) { } else { } } } /*-----------------------------------------------------------*/ void CokluGorevSonlandir( void ) { KesmeleriPasiflestir(); CizelgeleyiciAktif = 0; CizelgeleyiciyiSonlandir(); } /*----------------------------------------------------------*/ void GorevleriDurdur( void ) { KritikBolgeBaslangici(); ++CizelgeleyiciPasif; KritikBolgeSonu(); } /*----------------------------------------------------------*/ signed char GorevleriBaslat( void ) { register grvGKB *pGKB; signed char GecisYapildi = 0; KritikBolgeBaslangici(); { --CizelgeleyiciPasif; if( CizelgeleyiciPasif == ( unsigned char ) 0 ) { if( MevcutGorevSayisi > ( unsigned char ) 0 ) { char GecisGerekli = 0; while( ( pGKB = ( grvGKB * ) Ilk_Kayit_Sahibini_Al( ( ( Kuyruk * ) &BekleyenHazirListe ) ) ) != NULL ) { Kuyruktan_Sil( &( pGKB->OlayListeOgesi ) ); Kuyruktan_Sil( &( pGKB->GenelKuyrukOgesi ) ); GoreviKuyrugaEkle( pGKB );

74

if( pGKB->Oncelik >= AktifGKB->Oncelik ) { GecisGerekli = 1; } } if( AtlananTikler > ( unsigned char ) 0 ) { while( AtlananTikler > ( unsigned char ) 0 ) { TikleriArttir(); --AtlananTikler; } GecisGerekli = 1; } if( ( GecisGerekli == 1 ) || ( AtlananGecis == 1 ) ) { GecisYapildi = 1; AtlananGecis = 0; GorevDevret(); } } } } KritikBolgeSonu(); return GecisYapildi; } SistemSaatiTipi xTaskGetTickCount( void ) { SistemSaatiTipi Tikler; GorevKritikBolge(); { Tikler = TikSayisi; } GorevKritikBolgeSonu(); return Tikler; } /*-----------------------------------------------------------*/ unsigned char MevcutGorevSayisiniAl( void ) { unsigned char GorevSayisi;

75

GorevKritikBolge(); GorevSayisi = MevcutGorevSayisi; GorevKritikBolgeSonu(); return GorevSayisi; } inline void TikleriArttir( void ) { if( CizelgeleyiciPasif == ( unsigned char ) 0 ) { ++TikSayisi; if( TikSayisi == ( SistemSaatiTipi ) 0 ) { Kuyruk *pTmp; pTmp = ErtelenenGorevListesi; ErtelenenGorevListesi = Tasma_ErtelenenGorevListesi; Tasma_ErtelenenGorevListesi = pTmp; TasmaSayisi++; } ErtelenmisGorevleriKontrolEt(); } else { ++AtlananTikler; } } #if ( ( KAYNAKLARI_TEMIZLEME_OZELLIGI == 1 ) && ( GOREV_DURDURMA_OZELLIGI == 1 ) ) void KaynaklariTemizle( void ) { unsigned int Kuyruk1; volatile grvGKB *pGKB; Kuyruk1 = ( unsigned int ) KullanilanEnYuksekOncelik + ( unsigned int ) 1; do { Kuyruk1--; while( !KuyrukBos( &( HazirGorevlerListesi[ Kuyruk1 ] ) ) ) { SonrakiKayitSahibiniAl( pGKB, &( HazirGorevlerListesi[ Kuyruk1 ] ) ); Kuyruktan_Sil( ( Kuyruk_Ogesi * ) &( pGKB>GenelKuyrukOgesi ) );

76

GKByiSil( ( grvGKB * ) pGKB ); } }while( Kuyruk1 > ( unsigned int ) BosGorevOnceligi ); while( !KuyrukBos( &ErtelenenGorevListesi1 ) ) { SonrakiKayitSahibiniAl( pGKB, &ErtelenenGorevListesi1 ); Kuyruktan_Sil( ( Kuyruk_Ogesi * ) &( pGKB->GenelKuyrukOgesi ) ); GKByiSil( ( grvGKB * ) pGKB ); } while( !KuyrukBos( &ErtelenenGorevListesi2 ) ) { SonrakiKayitSahibiniAl( pGKB, &ErtelenenGorevListesi2 ); Kuyruktan_Sil( ( Kuyruk_Ogesi * ) &( pGKB->GenelKuyrukOgesi ) ); GKByiSil( ( grvGKB * ) pGKB ); } while( !KuyrukBos( &DurdurulanGorevListesi ) ) { SonrakiKayitSahibiniAl( pGKB, &DurdurulanGorevListesi ); Kuyruktan_Sil( ( Kuyruk_Ogesi * ) &( pGKB->GenelKuyrukOgesi ) ); GKByiSil( ( grvGKB * ) pGKB ); } } #endif void IcerigiDegistir( void ) { if( CizelgeleyiciPasif != ( unsigned char ) 0 ) { AtlananGecis = 1; return; } while( KuyrukBos( &( HazirGorevlerListesi[ HazirEnYuksekOncelik ] ) ) ) { --HazirEnYuksekOncelik; } SonrakiKayitSahibiniAl( AktifGKB, &( HazirGorevlerListesi[ HazirEnYuksekOncelik ] ) ); TamponaYaz();

77

} /*-----------------------------------------------------------*/ void ListedekiGorevYeri( const Kuyruk * const pOlayListesi, SistemSaatiTipi BeklenecekTikSayisi ) { SistemSaatiTipi UyanmaZamani; ListeyeEkle( ( Kuyruk * ) pOlayListesi, ( Kuyruk_Ogesi * ) &( AktifGKB>OlayListeOgesi ) ); Kuyruktan_Sil( ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); #if ( GOREV_DURDURMA_OZELLIGI == 1 ) { if( BeklenecekTikSayisi == max_gecikme ) { Kuyruk_Sonuna_Ekle( ( Kuyruk * ) &DurdurulanGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); } else { UyanmaZamani = TikSayisi + BeklenecekTikSayisi; ListeOgeDegeriniAyarla( &( AktifGKB->GenelKuyrukOgesi ), UyanmaZamani ); if( UyanmaZamani < TikSayisi ) { ListeyeEkle( ( Kuyruk * ) Tasma_ErtelenenGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); } else { ListeyeEkle( ( Kuyruk * ) ErtelenenGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); } } } #else { UyanmaZamani = TikSayisi + BeklenecekTikSayisi; ListeOgeDegeriniAyarla( &( AktifGKB->GenelKuyrukOgesi ), UyanmaZamani ); if( UyanmaZamani < TikSayisi ) { ListeyeEkle( ( Kuyruk * ) Tasma_ErtelenenGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); }

78

else { ListeyeEkle( ( Kuyruk * ) ErtelenenGorevListesi, ( Kuyruk_Ogesi * ) &( AktifGKB->GenelKuyrukOgesi ) ); } } #endif } signed char OlayListesindenSil( const Kuyruk * const pOlayListesi ) { grvGKB *pBostaGKB; char GeriDon; pBostaGKB = ( grvGKB * ) Ilk_Kayit_Sahibini_Al( pOlayListesi ); Kuyruktan_Sil( &( pBostaGKB->OlayListeOgesi ) ); if( CizelgeleyiciPasif == ( unsigned char ) 0 ) { Kuyruktan_Sil( &( pBostaGKB->GenelKuyrukOgesi ) ); GoreviKuyrugaEkle( pBostaGKB ); } else { Kuyruk_Sonuna_Ekle( ( Kuyruk * ) &( BekleyenHazirListe ), &( pBostaGKB->OlayListeOgesi ) ); } if( pBostaGKB->Oncelik >= AktifGKB->Oncelik ) { GeriDon = 1; } else { GeriDon = 0; } return GeriDon; } void ZamanasimiDurumunuAyarla( ZamanasimiTipi * const pZamanasimi ) { pZamanasimi->TasmaSayaci = TasmaSayisi; pZamanasimi->BaslamaZamani = TikSayisi; } char ZamanasimiKontrol( ZamanasimiTipi * const pZamanasimi, SistemSaatiTipi * const pBeklenecekTikSayisi ) { char GeriDon;

79

#if ( GOREV_DURDURMA_OZELLIGI == 1 ) if( *pBeklenecekTikSayisi == max_gecikme ) { GeriDon = 0; } else #endif if( ( TasmaSayisi != pZamanasimi->TasmaSayaci ) && ( TikSayisi >= pZamanasimi>BaslamaZamani ) ) { GeriDon = 1; } else if( ( TikSayisi - pZamanasimi->BaslamaZamani ) < *pBeklenecekTikSayisi ) { *pBeklenecekTikSayisi -= ( TikSayisi - pZamanasimi->BaslamaZamani ); ZamanasimiDurumunuAyarla( pZamanasimi ); GeriDon = 0; } else { GeriDon = 1; } return GeriDon; } void Atlanan_Gecis( void ) { AtlananGecis = 1; } static GorevFonksiyonu( BosGorev, pvParameters ) { ( void ) pvParameters; for( ;; ) { SonlanmayiBekleyenGorevleriKontrolEt(); #if ( CALISMA_PRENSIBI == 0 ) { GorevDevret(); } #endif #if ( CALISMA_PRENSIBI == 1 ) { if( MevcutListeUzunlugu( &( HazirGorevlerListesi[ BosGorevOnceligi ] ) ) > ( unsigned char ) 1 )

80

{ GorevDevret(); } } #endif } } static void GKBDegiskenleriniBaslat( grvGKB *pGKB, const signed char * const GorevAdi, unsigned char Oncelik ) { strncpy( ( char * ) pGKB->GorevAdi, ( const char * ) GorevAdi, ( unsigned int ) MAKSIMUM_ISIM_UZUNLUGU ); pGKB->GorevAdi[ ( unsigned int ) MAKSIMUM_ISIM_UZUNLUGU - ( unsigned int ) 1 ] = '\0'; if( Oncelik >= EN_YUKSEK_ONCELIK_SEVIYESI ) { Oncelik = EN_YUKSEK_ONCELIK_SEVIYESI - 1; } pGKB->Oncelik = Oncelik; Kuyruk_Ogesi_Baslat( &( pGKB->GenelKuyrukOgesi ) ); Kuyruk_Ogesi_Baslat( &( pGKB->OlayListeOgesi ) ); ListeOgesiSahibiniAyarla( &( pGKB->GenelKuyrukOgesi ), pGKB ); ListeOgeDegeriniAyarla( &( pGKB->OlayListeOgesi ), EN_YUKSEK_ONCELIK_SEVIYESI - ( SistemSaatiTipi ) Oncelik ); ListeOgesiSahibiniAyarla( &( pGKB->OlayListeOgesi ), pGKB ); } static void GorevListeleriniBaslat( void ) { unsigned char Oncelik; for( Oncelik = 0; Oncelik < EN_YUKSEK_ONCELIK_SEVIYESI; Oncelik++ ) { Kuyruk_Baslat( ( Kuyruk * ) &( HazirGorevlerListesi[ Oncelik ] ) ); } Kuyruk_Baslat( ( Kuyruk * ) &ErtelenenGorevListesi1 ); Kuyruk_Baslat( ( Kuyruk * ) &ErtelenenGorevListesi2 ); Kuyruk_Baslat( ( Kuyruk * ) &BekleyenHazirListe ); #if ( GOREV_SILME_OZELLIGI == 1 ) { Kuyruk_Baslat( ( Kuyruk * ) &SonlanmayiBekleyenGorevler );

81

} #endif #if ( GOREV_DURDURMA_OZELLIGI == 1 ) { Kuyruk_Baslat( ( Kuyruk * ) &DurdurulanGorevListesi ); } #endif ErtelenenGorevListesi = &ErtelenenGorevListesi1; Tasma_ErtelenenGorevListesi = &ErtelenenGorevListesi2; } static void SonlanmayiBekleyenGorevleriKontrolEt( void ) { #if ( GOREV_SILME_OZELLIGI == 1 ) { char ListeBos; if( SilinenGorevler > ( unsigned char ) 0 ) { GorevleriDurdur(); ListeBos = KuyrukBos( &SonlanmayiBekleyenGorevler ); GorevleriBaslat(); if( !ListeBos ) { grvGKB *pGKB; KritikBolgeBaslangici(); { pGKB = ( grvGKB * ) Ilk_Kayit_Sahibini_Al( ( ( Kuyruk * ) &SonlanmayiBekleyenGorevler ) ); Kuyruktan_Sil( &( pGKB->GenelKuyrukOgesi ) ); --MevcutGorevSayisi; --SilinenGorevler; } KritikBolgeSonu(); GKByiSil( pGKB ); } } } #endif } static grvGKB *GKBveYigitiYerlestir( unsigned int YigitDerinligi ) { grvGKB *pYeniGKB;

82

pYeniGKB = ( grvGKB * ) pYerlestir( sizeof( grvGKB ) ); if( pYeniGKB != NULL ) { pYeniGKB->pStack = ( unsigned char * ) pYerlestir( ( ( size_t )YigitDerinligi ) * sizeof( unsigned char ) ); if( pYeniGKB->pStack == NULL ) { BellekBosalt( pYeniGKB ); pYeniGKB = NULL; } else { memset( pYeniGKB->pStack, YigitDoldurmaBayti, YigitDerinligi * sizeof( unsigned char ) ); } } return pYeniGKB; } #if ( ( GOREV_SILME_OZELLIGI == 1 ) || ( KAYNAKLARI_TEMIZLEME_OZELLIGI == 1 ) ) static void GKByiSil( grvGKB *pGKB ) { BellekBosalt( pGKB->pStack ); BellekBosalt( pGKB ); } #endif #if ( MevcutGorevAdresiniAlmaOzelligi == 1 ) GorevAdresi MevcutGorevAdresiniAl( void ) { GorevAdresi GeriDon; KritikBolgeBaslangici(); { GeriDon = ( GorevAdresi ) AktifGKB; } KritikBolgeSonu(); return GeriDon; } #endif

83

Cs_pic.c dosyas #include "kontrol.h" #include "cekirdek.h" #include "timers.h" //std pic c18 library #define OsilatorOlcegi #define KesmeBaslangicDegeri #define GlobalKesmeDegeri #define DegismeyenKesmeler #define DerleyiciBellekBuyuklugu 0x00 ( ( unsigned char ) 0x13 ) ( ( unsigned long ) 4 ) 0xc0 0x80

typedef void grvGKB; extern volatile grvGKB * volatile AktifGKB; extern volatile GorevAdresi GorevAdres1; static void ZamanlayiciKesmesiniAyarla( void ); static void TikKesmesi( void ); int a; void SistemKesme( void ); extern void Kesme (void); static void DusukOncelikliKesme( void ); #define IcerigiSakla( SecilenKesmeBayraklari ) \ { \ _asm \ MOVFF WREG, PREINC1 \ MOVFF STATUS, PREINC1 \ MOVFF IORLW MOVFF _endasm \ INTCON, WREG \ SecilenKesmeBayraklari \ WREG, PREINC1 \

84

\ KesmeleriPasiflestir(); \ \ _asm \ MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF BSR, PREINC1 \ FSR2L, PREINC1 \ FSR2H, PREINC1 \ FSR0L, PREINC1 \ FSR0H, PREINC1 \ TABLAT, PREINC1 \ TBLPTRU, PREINC1 \ TBLPTRH, PREINC1 \ TBLPTRL, PREINC1 \ PRODH, PREINC1 \ PRODL, PREINC1 \ PCLATU, PREINC1 \ PCLATH, PREINC1 \ CLRF FSR0L, 0 \ CLRF FSR0H, 0 \ MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \

85

MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF _endasm

POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ POSTINC0, PREINC1 \ INDF0, PREINC1 \ FSR0L, PREINC1 \ FSR0H, PREINC1 \ STKPTR, FSR0L \ \ \

while( STKPTR > ( unsigned char ) 0 ) \ { \ _asm MOVFF MOVFF MOVFF \ TOSL, PREINC1 \ TOSH, PREINC1 \ TOSU, PREINC1 \

86

POP \ _endasm \ } \ \ _asm \ MOVFF FSR0L, PREINC1 \ MOVF PREINC1, 1, 0 \ _endasm \ \ _asm \ MOVFF MOVFF MOVFF MOVFF _endasm \ } #define IcerigiGeriYukle() \ { \ _asm \ MOVFF MOVFF AktifGKB, FSR0L \ AktifGKB + 1, FSR0H \ \ MOVFF MOVFF POSTINC0, FSR1L \ POSTINC0, FSR1H \ \ AktifGKB, FSR0L \ AktifGKB + 1, FSR0H \ FSR1L, POSTINC0 \ FSR1H, POSTINC0 \

87

MOVFF MOVFF _endasm

POSTDEC1, FSR0L \ POSTDEC1, FSR0L \ \ \

STKPTR = 0; \ \ while( STKPTR < FSR0L ) \ { \ _asm \ PUSH \ MOVF POSTDEC1, 0, 0 \ MOVWF TOSU, 0 \ MOVF POSTDEC1, 0, 0 \ MOVWF TOSH, 0 \ MOVF POSTDEC1, 0, 0 \ MOVWF _endasm \ } \ \ _asm \ MOVFF MOVFF MOVFF MOVFF MOVFF POSTDEC1, FSR0H \ POSTDEC1, FSR0L \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ TOSL, 0 \

88

MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF

POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, POSTDEC0 \ POSTDEC1, INDF0 \ POSTDEC1, PCLATH \ POSTDEC1, PCLATU \ POSTDEC1, PRODL \ POSTDEC1, PRODH \ POSTDEC1, TBLPTRL \ POSTDEC1, TBLPTRH \ POSTDEC1, TBLPTRU \ POSTDEC1, TABLAT \

89

MOVFF MOVFF MOVFF MOVFF MOVFF MOVFF _endasm

POSTDEC1, FSR0H \ POSTDEC1, FSR0L \ POSTDEC1, FSR2H \ POSTDEC1, FSR2L \ POSTDEC1, BSR \ POSTDEC1, WREG \ \ \

if( WREG & GlobalKesmeDegeri ) \ { \ _asm \ MOVFF MOVFF RETFIE _endasm \ } \ else \ { \ _asm \ MOVFF MOVFF RETURN _endasm \ } \ } POSTDEC1, STATUS \ POSTDEC1, WREG \ 0 \ POSTDEC1, STATUS \ POSTDEC1, WREG \ 0 \

90

unsigned char *YigitiBaslat( unsigned char *pYigitBasi, dGorevKodu pKod, void *pvParameters ) { unsigned long uAdres; unsigned char uBlok; *pYigitBasi = 0x11; pYigitBasi++; *pYigitBasi = 0x22; pYigitBasi++; *pYigitBasi = 0x33; pYigitBasi++; uAdres = ( unsigned long ) pvParameters; *pYigitBasi = ( unsigned char ) ( uAdres & ( unsigned long ) 0x00ff ); pYigitBasi++; uAdres >>= 8; *pYigitBasi = ( unsigned char ) ( uAdres & ( unsigned long ) 0x00ff ); pYigitBasi++; *pYigitBasi = 0x44; pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x66; /* WREG. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0xcc; /* Status. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) KesmeBaslangicDegeri; /* INTCON */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x11; /* BSR. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x22; /* FSR2L. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x33; /* FSR2H. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x44; /* FSR0L. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x55; /* FSR0H. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x66; /* TABLAT. */ pYigitBasi++;

91

*pYigitBasi = ( unsigned char ) 0x00; /* TBLPTRU. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x88; /* TBLPTRUH. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x99; /* TBLPTRUL. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0xaa; /* PRODH. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0xbb; /* PRODL. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x00; /* PCLATU. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x00; /* PCLATH. */ pYigitBasi++; for( uBlok = 0; uBlok <= DerleyiciBellekBuyuklugu; uBlok++ ) { *pYigitBasi = ( unsigned char ) uBlok; *pYigitBasi++; } *pYigitBasi = ( unsigned char ) DerleyiciBellekBuyuklugu; /* Low. */ pYigitBasi++; *pYigitBasi = ( unsigned char ) 0x00; /* High. */ pYigitBasi++; uAdres = ( unsigned long ) pKod; *pYigitBasi = ( unsigned char ) ( uAdres & ( unsigned long ) 0x00ff ); pYigitBasi++; uAdres >>= 8; *pYigitBasi = ( unsigned char ) ( uAdres & ( unsigned long ) 0x00ff ); pYigitBasi++; uAdres >>= 8; *pYigitBasi = ( unsigned char ) ( uAdres & ( unsigned long ) 0x00ff ); pYigitBasi++; *pYigitBasi = ( unsigned char ) 1; pYigitBasi++; return pYigitBasi;

92

} char CizelgeleyiciyiBaslat( void ) { ZamanlayiciKesmesiniAyarla(); IcerigiGeriYukle(); if( PIR1bits.CCP1IF ) { _asm goto TikKesmesi _endasm } ( void ) TikKesmesi; return 1; } void CizelgeleyiciyiSonlandir( void ) { } void GecisYap( void ) { IcerigiSakla( DegismeyenKesmeler ); IcerigiDegistir(); IcerigiGeriYukle(); } //#pragma code high_vector=0x08 #pragma code InterruptVectorHigh = 0x08 void InterruptVectorHigh (void) { _asm goto SistemKesme _endasm } #pragma code //#pragma interrupt Kesme void SistemKesme (void) {

93

T0CON = 0x98; INTCONbits.TMR0IE = 0; TMR0L = 0; TMR0H = 0; if( PIR1bits.CCP1IF ) { INTCONbits.GIE = 0; IcerigiSakla( GlobalKesmeDegeri ); PIR1bits.CCP1IF = 0; TikleriArttir(); #if CALISMA_PRENSIBI == 1 { IcerigiDegistir(); } #endif IcerigiGeriYukle(); INTCONbits.GIE = 1; } Kesme(); } static void TikKesmesi( void ) { IcerigiSakla( GlobalKesmeDegeri ); PIR1bits.CCP1IF = 0; TikleriArttir(); #if CALISMA_PRENSIBI == 1 { IcerigiDegistir(); } #endif IcerigiGeriYukle(); } static void ZamanlayiciKesmesiniAyarla( void ) { const unsigned long SabitKarsilastirmaDegeri = ( ( SAAT_FREKANSI / OsilatorOlcegi ) / OS_SAAT_HIZI ); unsigned long KarsilastirmaDegeri; unsigned char cBayt; TMR1H = ( unsigned char ) 0x00; TMR1L = ( unsigned char ) 0x00; KarsilastirmaDegeri = SabitKarsilastirmaDegeri; CCPR1L = ( unsigned char ) ( KarsilastirmaDegeri & ( unsigned long ) 0xff );

94

KarsilastirmaDegeri >>= ( unsigned long ) 8; CCPR1H = ( unsigned char ) ( KarsilastirmaDegeri & ( unsigned long ) 0xff ); CCP1CONbits.CCP1M0 = 1; CCP1CONbits.CCP1M1 = 1; CCP1CONbits.CCP1M2 = 0; CCP1CONbits.CCP1M3 = 1; PIE1bits.CCP1IE = 1; INTCONbits.GIEL = 1; OpenTimer1( T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 & T1_CCP1_T3_CCP2 ); }

95

Cekirdek.h dosyas #ifndef CEKIRDEK_H #define CEKIRDEK_H #include "pic.h" #include "kuyruk.h" #ifdef __cplusplus extern "C" { #endif typedef void * GorevAdresi; typedef struct xZamanAsimi { char TasmaSayaci; SistemSaatiTipi BaslamaZamani; } ZamanasimiTipi; #define BosGorevOnceligi #define GorevDevret() #define GorevKritikBolge() #define GorevKritikBolgeSonu() #define gorevKesmeleriPasiflestir() #define gorevKesmeleriEtkinlestir() #define CizelgeleyiciBaslamadi 0 #define CizelgeleyiciCalisiyor #define CizelgeleyiciDuruyor 1 2 ( ( unsigned char ) 0 ) Gecis() KritikBolgeBaslangici() KritikBolgeSonu() KesmeleriPasiflestir() KesmeleriEtkinlestir()

signed char GorevOlustur( dGorevKodu vGorevKodu, const signed char * const GorevAdi, unsigned int YigitDerinligi, void *pvParameters, unsigned char Oncelik, GorevAdresi *pOlusturulanGorevler ); void GorevSil( GorevAdresi pGorev ); void GorevErtele( SistemSaatiTipi ErtelemeTikSayisi ); void GorevBeklet( SistemSaatiTipi * const pOncekiUyanmaZamani, SistemSaatiTipi ZamanArtisi ); unsigned char GorevOnceligiAl( GorevAdresi pGorev ); void GorevOnceligiAta( GorevAdresi pGorev, unsigned char YeniOncelik );

96

void GorevDurdur( GorevAdresi pDurdurulacakGorev ); void GorevBaslat( GorevAdresi pBaslatilacakGorev ); char KesmedenGorevBaslat( GorevAdresi pBaslatilacakGorev ); void CokluGorevBaslat( void ); void CokluGorevSonlandir( void ); void GorevleriDurdur( void ); signed char GorevleriBaslat( void ); unsigned char MevcutGorevSayisiniAl( void ); void GorevListesi( signed char *pTamponaYaz ); inline void TikleriArttir( void ); void ListedekiGorevYeri( const Kuyruk * const pOlayListesi, SistemSaatiTipi BeklenecekTikSayisi ); signed char OlayListesindenSil( const Kuyruk * const pOlayListesi ); void KaynaklariTemizle( void ); inline void IcerigiDegistir( void ); GorevAdresi MevcutGorevAdresiniAl( void ); void ZamanasimiDurumunuAyarla( ZamanasimiTipi * const pZamanasimi ); char ZamanasimiKontrol( ZamanasimiTipi * const pZamanasimi, SistemSaatiTipi * const pBeklenecekTikSayisi ); void Atlanan_Gecis( void ); char CizelgeleyiciDurumunuAl( void ); #ifdef __cplusplus } #endif #endif /* CEKIRDEK_H */

97

Kuyruk.h dosyas #ifndef KUYRUK_H #define KUYRUK_H #ifdef __cplusplus extern "C" { #endif struct xListeOgesi { SistemSaatiTipi Oge_Degeri; volatile struct xListeOgesi * pSonraki; volatile struct xListeOgesi * pOnceki; void * pSahibi; void * pHazne; }; typedef struct xListeOgesi Kuyruk_Ogesi; struct MiniListeOgesi { SistemSaatiTipi Oge_Degeri; volatile struct xListeOgesi *pSonraki; volatile struct xListeOgesi *pOnceki; }; typedef struct MiniListeOgesi xMiniListeOgesi; typedef struct Kuyruk { volatile unsigned char Oge_Sayisi; volatile Kuyruk_Ogesi * pEndeks; volatile xMiniListeOgesi Kuyruk_Sonu; } Kuyruk; #define ListeOgesiSahibiniAyarla( pKuyruk_Ogesi, pxSahibi ) >pSahibi = ( void * ) pxSahibi #define ListeOgeDegeriniAyarla( pKuyruk_Ogesi, xDeger ) >Oge_Degeri = xDeger #define Liste_Oge_Degerini_Al( pKuyruk_Ogesi ) pKuyruk_Ogesi )->Oge_Degeri ) #define KuyrukBos( pKuyruk ) unsigned char ) 0 ) #define MevcutListeUzunlugu( pKuyruk ) #define SonrakiKayitSahibiniAl( pGKB, pKuyruk ) \ ( pKuyruk_Ogesi )( pKuyruk_Ogesi )(( ( ( pKuyruk )->Oge_Sayisi == ( ( ( pKuyruk )->Oge_Sayisi )

98

{ \ Kuyruk * const pxSabitListe = pKuyruk; \ ( pxSabitListe )->pEndeks = ( pxSabitListe )->pEndeks->pSonraki; \ if( ( pxSabitListe )->pEndeks == ( Kuyruk_Ogesi * ) &( ( pxSabitListe )>Kuyruk_Sonu ) ) \ { \ ( pxSabitListe )->pEndeks = ( pxSabitListe )->pEndeks->pSonraki; \ } \ pGKB = ( pxSabitListe )->pEndeks->pSahibi; \ } #define Ilk_Kayit_Sahibini_Al( pKuyruk ) ( ( pKuyruk->Oge_Sayisi != ( unsigned char ) 0 ) ? ( (&( pKuyruk->Kuyruk_Sonu ))->pSonraki->pSahibi ) : ( NULL ) ) #define ListeIcerigi( pKuyruk, pKuyruk_Ogesi ) ( ( pKuyruk_Ogesi )->pHazne == ( void * ) pKuyruk ) void ListeyiBaslat( Kuyruk *pKuyruk ); void Kuyruk_Ogesi_Baslat( Kuyruk_Ogesi *pOge ); void ListeyeEkle( Kuyruk *pKuyruk, Kuyruk_Ogesi *pYeni_Oge ); void Kuyruk_Sonuna_Ekle( Kuyruk *pKuyruk, Kuyruk_Ogesi *pYeni_Oge ); void Kuyruktan_Sil( Kuyruk_Ogesi *pSilinecek_Oge ); #ifdef __cplusplus } #endif #endif

99

Macro.h dosyas #ifndef MACRO_H #define MACRO_H #if( _16_BIT_SISTEM_SAATI == 1 ) typedef unsigned int SistemSaatiTipi; #define max_gecikme ( SistemSaatiTipi ) 0xffff #else typedef unsigned long SistemSaatiTipi; #define max_gecikme ( SistemSaatiTipi ) 0xffffffff #endif #define BAYT_SIRALAMASI #define GlobalKesmeEtkinBiti 0x80 #define YigitBuyumesi #define TikHiziMS #define KesmeleriPasiflestir() #define KesmeleriEtkinlestir() #define KritikBolgeBaslangici() \ = 0; #define KritikBolgeSonu() \ MOVF POSTDEC1, 1, 0 \ _endasm \ if( INDF1 & GlobalKesmeEtkinBiti ) \ { \ KesmeleriEtkinlestir(); extern void GecisYap( void ); #define Gecis() \ } GecisYap() _asm 1 1 ( ( SistemSaatiTipi ) 1000 / OS_SAAT_HIZI ) INTCONbits.GIEH = 0; INTCONbits.GIEH = 1; POSTINC1 = INTCON; INTCONbits.GIEH

#define GorevIslev( vFunction, pvParameters ) void vFunction( void *pvParameters ) #define GorevFonksiyonu( vFunction, pvParameters ) void vFunction( void *pvParameters ) #define inline #define portNOP() _asm \

100

NOP \ _endasm #endif /* MACRO_H */

101

Pic.h dosyas #ifndef PIC_H #define PIC_H #include "..\inc\macro.h" #ifdef __cplusplus extern "C" { #endif unsigned char *YigitiBaslat( unsigned char *pYigitBasi, dGorevKodu pKod, void *pvParameters ); void *pYerlestir( size_t xSize ); void BellekBosalt( void *pv ); void Bloklari_Baslat( void ); char CizelgeleyiciyiBaslat( void ); void CizelgeleyiciyiSonlandir( void ); #ifdef __cplusplus } #endif #endif /* PIC_H */

102

Sayi.h dosyas #ifndef SAYI_H #define SAYI_H void vStartIntegerMathTasks( unsigned char Oncelik ); char xAreIntegerMathsTaskStillRunning( void ); #endif

103

Tanimlar.h dosyas #ifndef TANIMLAR_H #define TANIMLAR_H typedef void (*dGorevKodu)( void * ); #define Gecerli #define Gecersiz #define errKuyrukBos #define errKuyrukDolu #define errGerekliBellekAyrilamiyor #define errCalistirilacakGorevYok #define errKuyrukBloke #define errKuyrukGecis #endif /* TANIMLAR_H */ ( -1 ) ( -2 ) ( -4 ) ( -5 ) (1) (0) (0) (0)

104

Yapilandirma.h dosyas #ifndef YAPILANDIRMA_H #define YAPILANDIRMA_H #include <p18cxxx.h> #define CALISMA_PRENSIBI #define OS_SAAT_HIZI //SYSTEM TICK RATE #define SAAT_FREKANSI ) #define EN_YUKSEK_ONCELIK_SEVIYESI #define MINIMUM_YIGIT_BUYUKLUGU #define TOPLAM_HAFIZA_BUYUKLUGU #define MAKSIMUM_ISIM_UZUNLUGU #define _16_BIT_SISTEM_SAATI #define ONCELIK_ATAMA_OZELLIGI #define ONCELIK_OKUMA_OZELLIGI #define GOREV_SILME_OZELLIGI #define KAYNAKLARI_TEMIZLEME_OZELLIGI #define GOREV_DURDURMA_OZELLIGI #define GOREV_BEKLETME_OZELLIGI #define GOREV_ERTELEME_OZELLIGI #endif /* YAPILANDIRMA_H */ 1 //PREEMPTION ( ( SistemSaatiTipi ) 1000 ) ( ( unsigned long ) 4000000 ( ( unsigned char ) 4 ) ( 105 ) ( ( size_t ) 1024 ) (4) 1 1 0 1 0 1 1 1

105

Kontrol.h dosyas #ifndef INC_FREERTOS_H #define INC_FREERTOS_H #include <stddef.h> #include "tanimlar.h" #include "yapilandirma.h" #include "pic.h" #ifndef CALISMA_PRENSIBI #error Eksik Tanimlama: CALISMA_PRENSIBI tanimlanmali #endif #ifndef ONCELIK_ATAMA_OZELLIGI #error Eksik Tanimlama: ONCELIK_ATAMA_OZELLIGI tanimlanmali #endif #ifndef ONCELIK_OKUMA_OZELLIGI #error Eksik Tanimlama: ONCELIK_OKUMA_OZELLIGI tanimlanmali #endif #ifndef GOREV_SILME_OZELLIGI #error Eksik Tanimlama: GOREV_SILME_OZELLIGI tanimlanmali #endif #ifndef KAYNAKLARI_TEMIZLEME_OZELLIGI #error Eksik Tanimlama: KAYNAKLARI_TEMIZLEME_OZELLIGI tanimlanmali #endif #ifndef GOREV_DURDURMA_OZELLIGI #error Eksik Tanimlama: GOREV_DURDURMA_OZELLIGI tanimlanmali #endif #ifndef GOREV_BEKLETME_OZELLIGI #error Eksik Tanimlama: GOREV_BEKLETME_OZELLIGI tanimlanmali #endif #ifndef GOREV_ERTELEME_OZELLIGI #error Eksik Tanimlama: GOREV_ERTELEME_OZELLIGI tanimlanmali #endif #ifndef _16_BIT_SISTEM_SAATI #error Eksik Tanimlama: _16_BIT_SISTEM_SAATI tanimlanmali #endif #ifndef MevcutGorevAdresiniAlmaOzelligi #define MevcutGorevAdresiniAlmaOzelligi 0 #endif #endif

106

ZGEM

Kiisel Bilgiler Soyad, ad Uyruu Doum tarihi ve yeri Medeni hali Telefon Faks e-mail Eitim Derece Lisans

: OTUK, Hseyin : T.C. : 23.06.1980 stanbul : Evli : 0 (312) 292 40 26 : 0 (312) 292 40 25 : hcotuk@etu.edu.tr

Eitim Birimi Mezuniyet tarihi Sleyman Demirel niversitesi/Elektronik ve Haberleme Mh 2002

Deneyimi Yl 20042003-2004 Yabanc Dil ngilizce Yaynlar

Yer Elektronik Cihaz Sanayi Tic.Ltd.ti.

Grev Biliim Teknolojileri Mdr Ar-ge Mhendisi

TOBB Ekonomi ve Teknoloji niversitesi

Bildiriler otuk, H., IEEE 802.1x ve Radius protokolleri ile kimlik dorulama uygulamalar, nternet Haftas, TOBB Ekonomi ve Teknoloji niversitesi, Ankara, Aralk 2006.

107

You might also like