Notlar 9

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