DSP C5000 DSP BIOS DSP BIOS aşağıdakileri sağlar: Gerçek- zamanlı zamanlayıcı Preemptive thread yönetim çekirdeği Gerçek zamanlı analiz Debug verisi ile ilgilenirken kesintisiz program akışı Gerçek Zamanlı veri değişimi (RTDX) (target ⇔ host) arasında target çalışırken veri değişimi DSP çevre birimlerinin programlanması Chip Support Library (CSL) kullanarak GIU tabanlı çevre birimi ilklendirme DSP/BIOS Configuration Tool Yeni bir konfigurasyon dosyası oluşturma • Sistemi yapılandırır – Nesneleri tanımlar ve oluşturur – Donanım kesmelerine ilişkin kesme vektörlerini yapılandırır – Belleği yapılandırır ve linker komut dosyasını oluşturur • Gerekli minimum veri ve yığıt boyutunu hesaplar Yapılandırıcı tarafından oluşturulan dosyalar Save program.cdb programcfg.h## programcfg.s## programcfg.cmd programcfg_c.c programcfg.h Konfigurasyon veritabanı dosyası Dosya Uzantıları prog.h prog.c prog.asm progcfg.s## progcfg.obj xxx.h prog.cdb progcfg.h## progcfg.cmd Linker Compiler/ Assembler prog.obj prog.cmd (optional) user.lib *.lib prog.out Üretilen dosyalar • myproject.cdb – tüm özellik ayarkarının ve yapılandırma veritabanının güncel olarak tutulduğu dosya • myprojectcfg.h – Oluşturulan tüm nesnelere ilişkin extern tanımlamaları ve CSL modül başlıkları • myprojectcfg_c.c – Oluşturulan nesnelerin tanımlanması ve ilklendirilmesi. • myprojectcfg.sXX – Hangi DSP/BIOS bileşenlerin mevcut olduğunu tanımlar ve bunları ilklendirir • myprojectcfg.cmd – linker command file, (CSL library ve .csldata yerleşimini de kapsayan) Başlangıç işleri BIOS_reset() system code user code Kesmeler kapatılır ve çeşitli ilklendirmeler yapılır BIOS_init() Kesme verktör tablosu ilklendirilir, bayraklar sıfırlanır main() Doanım ilklendirmesi yapılır ve gerekli kesmeler yarlanır BIOS_start() HWI_startup() Donanımı ve DSP/BIOS zamanlayıcısı nı başlatır C5000 IMR interrupt enables interrupt flags IFR global int enable INTM Başlangıç işleri • DSP ve donanım ilklendirme – Stack pointer, memory wait states, memory configuration registers – Bunlar DSP/BIOS kütüphanesinin parçası olan boot.c dosyasınadır • BIOS_init( ) otomatik olarak çağırılır – DSP/BIOS modüllerini ilklendirir. • main() – Gerekli sistem ilklendirmeleri – Seçilen kesmelerin enable edilmesi – Program ilklendirmesi içim mutlaka return edilmelidir. • BIOS_start( ) otomatik olarak çağırılır. – DSP/BIOS’u başlatır – Kesmeleri genel olarak izinlendirir. DSP/BIOS zamanlayıcısı main { return; } Timer1_ISR { start A; } Timer2_ISR { start B; } DSP/BIOS A B DSP/BIOS zamanlama sağlar: Çalışacak işler (olay işleyicisi tarafından işaretlenir). Zamanlayıcı duruma bağlı olarak işleri yönetir (mark to be run), priority, … çalışı yor alışıyor A boş boşta B Zaman 0 1 2 3 4 5 6 7 B askıya alınmıştır Đşler bağımsız yazılar program parçalarıdır. Daha kolay tasarlanır – Modüllerin etkileşimi minimize edilmiştir Zamanlamaları DSP/BIOS zamanlayıcısı ile sağlanır. Preemption • Önceliğe dayalı olarak bir işlev’ten diğerine kontrol’ün aktarılmasıdır – Yüksek öncelikli daima araya girer. – Devam eden bir işlevin, diğerini asenkron olarak bölmesine izin verir Tamanlandı Tamanlandı baş başladı ladı Pasif Çalışıyor Hazır Đletildi Devam edildi Preempted DSP BIOS zamanlayıcı (scheduler) Scheduler hem h/w hemde s/w kesme yönetimi sağlar DMA INT SWI askıda HWI_enter h/w real-time kod Post s/w interrupt (SWI) HWI_exit HWI Kesmelere hızlı yanıt Minimum içerik anahtarlama CPU için yüksek öncelik SWI üretme SWI: Süzgeç kodu SWI Yanıt zamanında gecikme Đçerik anahtarlama Seçilebilir öncelik düzeyleri Başka bir SWI üretebilme Çalışması zamanlayıc ile yönetilir. Önceliğe dayalı zamanlama post3 rtn HWI 2 (highest) post2 rtn HWI 1 post1 thread : altprogram ISR fonsiyon rtn SWI 3 int2 rtn SWI 2 rtn SWI 1 rtn MAIN int1 IDLE (lowest) Öncelikleri kullanıcı ayarlar...BIOS zamanlamayı sağlar. HW kesmelerin öncelikleri, donanımsal olarak belirlenmiştir. Kullanıcı yalnızca SW kesmelerin önceliklerini ayarlayabilir. SWI üreten Kesmeler HWI_enter post HWI_exit isr isr Running pp==22 Ready pp==11 Idle Idle zaman HWI_enter ve HWI_exit assembly macroları kullanılmalıdır Zamanlamayı etkileyebilen API’ ler: SWI_andn, SWI_dec, SWI_inc, SWI_or, SWI_post, PIP_alloc, PIP_free, PIP_get, PIP_put, PRD_tick, SEM_post HWI_enter and HWI_exit • HWI_enter – Seçilen kayıtçıları kaydeder – Đçiçe kesmeleri izin verme yada maskeleme işlemini yapar – Zamanlayıcıya yeni üretilen bir SWI yı bildirir. • HWI_exit – Seçilen kayıtçıları geri alır – Kesme maskesini eski haline getirir – Kesmeden çıkar Bu API’ler yalnızca asm den çağrılır. Assembly kesme yazmak (c54xx) SWI_post example Template ISR with no scheduling APIs called .include hwi.h54 .include swi.h54 .def isr1 .def isr1 isr1: isr1: ;save context (PUSHM) HWI_enter MASK,IMRDISABLEMASK ;ISR code SWI_post ;restore context (POPM) ;other ISR code ;return from interrupt HWI_exit MASKS,IMRRESTOREMASK HWI_enter ve HWI_exit’in artı ve - leri kayıtçıları kaydetmek ve geri almak kolaydır zamanlayıcı API’lerini çağırmak kolaydır Đç-içe kesmeleri mümkün kılar (preemption) Overhead Sadece Assemlerdan çağrılır C de ISR yazmak Int i; /*global var*/ void isr1(void) { HWI_enter(MASKS) i++; SWI_post(&swiAudio) HWI_exit(MASKS) } • ISR ‘ eğer zamanlayıcı API’leri yoksa sadece C de yazılabilir – interrupt void isr1(void) biçiminde tanımlanır HWI_enter ve HWI HWI_exit ISR kullanılırsa interrupt keyword kullanma! DSP/BIOS (SWI) Software Interrupts • HWI ISR leri SWI lara erteler • Preemptive HARDWARE INTERRUPT maxpri – Priority 0-14 XXXX • Context Switch 15 – SWI için otomatiktir XXXX minpri IDLE Software Interrupt nesneleri • SWI_Obj (Örnek) – – – – SWI_obj Pointer to a function Arg0 ve Arg1 Priority Initial Bit/Count value • Tüm kesmeler ortak bir yığıtta çalışır – Yerek değişkenler saklanır – Đç-içe fonksiyon çağrıları saklanır fxn arg0 arg1 priority mailbox SWI_obj fxn arg0 arg1 priority mailbox SWI_obj fxn arg0 arg1 priority mailbox FIR C func FFT ASM func Common .stack Zamanlama kuralları SWI API Highest Priority post isr isr pp==22 Running pp==11 Ready pp==11 post Idle Idle Lowest Priority zaman SWI_post() Şartsız olarak bir software interrupt üretir. Software interrupt hazır durumunda çalışır. DSP/BIOS Software Interrupt Mailbox • • Şartlı yada şartsız bir software interrupt üretmek için kullanılır Bir sayıcı yada bit alanı olarak kullanılır – SWI nın nasıl iletildiğini göstermek için bir bit set edilir. – Bir SWI çalışmadan önce birden fazla koşulun yerine getirilmesine olanak sağlar – Kaçan bir SWI ın izlenmesine imkan verir • Mailbox 16 bitlik bir tamsayıdır ( C5000) SWI_inc mailbox’ı artırır ve bir SWI C postalar Mailbox SWI C çalıştığında eski değerine getirilir Sayma olayları: SWI_dec() HWI SP Buffer SWI_dec(&SWI) SWI B Mailbox 11 SWI_dec() mailbox değerini azaltır SWI mailbox = 0 olduğunda postalanır SWI’nın özelliklerinde ilk mailbox değeri verilir Mailbox, SWI çalıştığında ilk değerine geri döner Kim Çağırdı: SWI_or SWI A SWI B SWI C SWI D SWI_or(1) SWI_or(2) SWI_or(4) SWI_or(8) SWI SUB Int mailbox; mailbox = SWI_getmbox(); switch(mailbox) { case 1: {do this} case 2: {do this} case 4: {do this} case 8: {do this} } SWI_or() mailbox’da bir biti set eder ve SWI yı postalar. SWI_getmbox() kullanılarak mailbox değeri okunur ve hangi rutinin SWI yı postaladığı anlaşılır Mailbox SWI çalıştığında resetlenir SWI ‘ları postalama (Özet) Mailbox bitmask Always post Post if mailbox = 0 SWI_or Mailbox sayıcıdır SWI_inc SWI_post SWI_andn SWI_dec SWI’nın özellklerinden ilk mailbox değerinin ayarlanması N/A Sürekli peryodik fonksiyonlar • Her N tick’de fonsiyon çağrılır • system tick’ ile tetiklenir – Timer interrupt yada – PRD_tick()’i çağıran peryodik kesme Çalışma zamanı tick func1() 1 2 3 4 func1() func2() 5 prdFunc1 Period 4 Function func1() Type continuous 6 7 8 9 10 prdFunc2 Period Function Type 9 func2() continuous DSP BIOS Modulleri ATM Module Atomic functions written in assembly language BUF Module Maintains buffer pools of fixed size buffers C54 Module Target-specific functions CLK Module System clock manager DEV Module Device driver interface GIO Module I/O module used with IOM mini-drivers Global Settings Global setting manager HOOK Module Hook function manager HST Module Host channel manager HWI Module Hardware interrupt manager IDL Module Idle function and processing loop manager LCK Module Resource lock manager LOG Module Event Log manager MBX Module Mailboxes manager MEM Module Memory manager PIP Module Buffered pipe manager PRD Module Periodic function manager QUE Module Queue manager RTDX Module Real-time data exchange manager SEM Module Semaphores manager SIO Module Stream I/O manager STS Module Statistics object manager SWI Module Software interrupt manager SYS Module System services manager TRC Module Trace manager TSK Module Multitasking manager std.h and stdlib.h functions Standard C library I/O functions Haberleşme teknikleri Process 0 Process 1 • Đşler arasında global değişkenleri kullanmak, preemption’ dan dolayı güvenli değildir. Bu nedenle; • Queues (bağlı listeler) – first-in, first-out diziler • Paylaşılan bir bellek üzerinde veri tamponlama – Zaman-bağımlı tamponlama • Zaman - bağımlı olarak transfer edilen yada yavaş veri için • Çift yada ping-pong tamponlama – Ring yada dairesel tamponlama • Kuyrukları veri belleği üzerindeki dairesel tampon göstergelerini aktarmak için kullanılabilir. Kuyruk (Que) • • • • Basit haberleşme için basit veri yapısı first-in, first-out Bağlı listeler biçimindeki verileri yönetir. Kuyruktaki herhangi bir yerin silinmesi ya da eklenmesi mümkündür. • Elemanlar herhangi bir veri yapısında olabilir. QUE_create. Create an empty queue. QUE_delete. Delete an empty queue. QUE_dequeue. Remove from front of queue (non-atomically). QUE_empty. Test for an empty queue. QUE_enqueue. Insert at end of queue (non-atomically). QUE_get. Remove element from front of queue (atomically) QUE_head. Return element at front of queue. QUE_insert. Insert in middle of queue (non-atomically). QUE_new. Set a queue to be empty. QUE_next. Return next element in queue (non-atomically). QUE_prev. Return previous element in queue (non-atomically). QUE_put. Put element at end of queue (atomically). QUE_remove. Remove from middle of queue (non-atomically). Data Pipes PIP buffers Software Interrupt Software Interrupt • Đşlemler arasındaki giriş çıkış bloklarıdır. • Bir pipe nesnesinin - writer ve reader olmak üzere 2 kısmı vardır • Senkronizasyon için dahili bilgilendirme fonksiyonları kullanılır. (notifywriter, notifyreader araclığıyla) • Kuyruk veri tamponları link sırasında atanır – Belli boyutta belli sayıda çerçeveden oluşur • nframes • framesize Multitasking Hardware Interrupts Hard Real-time Foreground Software Interrupts Multitasking Soft Real-time Idle Background Task Kontrol Bloğu Modeli DSP/BIOS Startup READY Task is deleted Preemption TSK_delete() TSK_yield() TSK_setpri() RUNNING TERMINATED Task exits Task suspends TSK_exit() TSK_sleep() SEM_pend() Task is deleted TSK_delete() Task is readied SEM_post() TSK_tick() BLOCKED TASK FONKSĐYONLARI TSK_checkstacks. Check for stack overflow TSK_create. Create a task ready for execution TSK_delete. Delete a task TSK_deltatime. Update task STS with time difference TSK_disable. Disable DSP/BIOS task scheduler TSK_enable. Enable DSP/BIOS task scheduler TSK_exit. Terminate execution of the current task TSK_getenv. Get task environment TSK_geterr. Get task error number TSK_getname. Get task name TSK_getpri. Get task priority TSK_getsts. Get task STS object TSK_itick. Advance system alarm clock (interrupt only) TSK_self. Get handle of currently executing task TSK_setenv. Set task environment TSK_seterr. Set task error number TSK_setpri. Set a task's execution priority TSK_settime. Set task STS previous time TSK_sleep. Delay execution of the current task TSK_stat. Retrieve the status of a task TSK_tick. Advance system alarm clock TSK_time. Return current value of system clock TSK_yield. Yield processor to equal priority task Semaphore’lar ve Öncelik SEM_pend(semObj) interrupt block! Priority=2 CC A ya bağlı olmaksızın SEM_pend(semObj) block! Priority=1 BB A ya bağlı olarak A ya bağlı olmaksızın SEM_post(semObj) Priority=1 AA preempted! B ve C için ön koşul zaman •Hem B hem de C A’ya bağlıdır. • ilk olarak B semafor üzerinde askıda kalır, sonra C •A semaforu postaladığında,ilk olarak B çalışır, çünkü ilk olarak o askıya alınmıştır. •Semaphore’lar işleri askıya almak için FIFO kuyruğu kullanırlar. Semaphore fonksiyonları • SEM_count. Get current semaphore count • SEM_create. Create a semaphore • SEM_delete. Delete a semaphore • SEM_ipost. Signal a semaphore (interrupt only) • SEM_new. Initialize a semaphore • SEM_pend. Wait for a semaphore • SEM_post. Signal a semaphore • SEM_reset. Reset semaphore Mailbox API • MBX_post – Bir mesajı bir tampona yükler – Eğer mailbox dolu ise yada bir başka yazıcı bekliyorsa, bloke eder. • MBX_pend – Bir mesajı tampon dışına yükler (tampondan dışarı alır). – Eğer mailbox boş ise yada bir başka okuyucu bekliyorsa bloke eder. task0 MBX_post task1 task2 task3 task4 MBX_pend Mail Box foksiyonları MBX_create. Create a mailbox MBX_delete. Delete a mailbox MBX_pend. Wait for a message from mailbox MBX_post. Post a message to mailbox Interfacing to Mailboxes Void writer(Int id){ typedef struct MsgObj { MsgObj msg; Int id; Int i; Char val; for (i=0; ; i++) { }; msg.id = id; msg.val = i % NUMMSGS + (Int)('a'); if ( MBX_post(&mbx, &msg, TIMEOUT) == 0 ){ SYS_abort("timeout %s”, TSK_getname()); }}} Void reader(Void){ MsgObj msg; Int i; for (i=0; ;i++) { if (MBX_pend(&mbx, &msg, TIMEOUT) == 0) { SYS_abort("timeout %s”, TSK_getname()); } LOG_printf(&logTrace,"%c from (%d)", msg.val, msg.id); }} SWI ve TSK Yığıt yapılandırması Bloke etme yada askıya alma Kullanıcı adı, hata değeri, Ortam işaretçisi SWI TSK Sistem yığıtını Her iş kendi kullanır yığıtına sahiptir Hayır Evet Hayır Evet API arayüzü Assembly ve C C
© Copyright 2024 Paperzz