當(dāng)多個實時線程需要訪問共享資源時,如果沒有一種同步機制,將破壞共享資源中數(shù)據(jù)的完整性。RTLinux提供一種簡單的加鎖方法mutex來控制對共享資源的存取,并支持POSIX的pthread_mutex_ family函數(shù)組[3]。目前有以下函數(shù)可以使用:
pthread_mutexattr_getpshared //得到指定屬性線程共享屬性值;
pthread_mutexattr_setpshared //設(shè)置指定屬性線程共享屬性值;
pthread_mutexattr_init //初始化mutex的屬性;
pthread_mutexattr_destroy //刪除mutex的屬性;
pthread_mutexattr_settype //設(shè)置mutex信號的類型;
pthread_mutexattr_gettype //得到mutex信號的類型;
pthread_mutex_init //按指定的屬性初始化mutex;
pthread_mutex_destroy //刪除給定的mutex;
pthread_mutex_lock //鎖定mutex,如果mutex已被鎖定,阻塞當(dāng)前線程直到解鎖;
pthread_mutex_trylock //鎖定mutex,如果mutex已被鎖定,函數(shù)立即返回;
pthread_mutex_unlock //解鎖mutex;
互斥信號類型有PTHREAD_MUTEX_NORMAL (default POSIX mutexes)和PTHREAD_MUTEX_SPINLOCK (spinlocks)
3 RTLinux的編程實例分析
下面結(jié)合一個具體的程序parport.c[4],對RTLinux的編程特點加以說明。程序parport.c中的實時線程在并口的2、3腳(并口的數(shù)據(jù)D0和D1)上周期輸出信號1,而對應(yīng)硬件中斷7的實時中斷服務(wù)程序?qū)⒃诓⒖诘?、3腳輸出信號0。連接并口的2腳和10腳(并口的確認信號線,對應(yīng)于計算機的硬件中斷7),則可在并口的2、3腳上產(chǎn)生一個方波信號。parport.c源程序如下:
#include
#include
#include
#include
#include
#include
pthread_t thread;
unsigned int intr_handler(unsigned int irq,struct pt_regs *regs){//中斷服務(wù)函數(shù)
outb(0, 0x378); //輸出字節(jié)0到并口數(shù)據(jù)線
rtl_hard_enable_irq(7); //使能硬件中斷7
return 0;
}
void * start_routine(void *arg){ //實時線程
struct sched_param p; //定義實時線程控制參數(shù)的數(shù)據(jù)結(jié)構(gòu)
p. sched_priority = 1; //設(shè)置優(yōu)先級為1
pthread_setschedparam (pthread_self(), SCHED_FIFO, &p);//設(shè)置實時線程的控制參數(shù)
pthread_make_periodic_np(pthread_self(),gethrtime(),100000);//啟動周期為10ns的實時線程
while (1){
pthread_wait_np(); //實時線程掛起
outb(3, 0x378); //實時線程周期執(zhí)行,輸出3到并口數(shù)據(jù)線
}
return 0;
}
int init_module(void) {//初始化模塊
int status;
rtl_irqstate_t f;
rtl_no_interrupts(f); //保存當(dāng)前的中斷狀態(tài)標志到變量f,并禁止中斷
status=rtl_request_irq(7, intr_handler); //設(shè)置硬件中斷7的處理程序
rtl_printf(″rtl_request_irq: %dn″, status); //輸出的控制臺
outb_p(inb_p(0x37A) | 0x10, 0x37A); //使能并口中斷(硬件上)
rtl_hard_enable_irq(7);//使能中斷7(軟件上)
rtl_restore_interrupts(f); //按照變量f恢復(fù)當(dāng)前的中斷狀態(tài)標志,并使能中斷
return pthread_create (&thread, NULL, start_routine, 0);//創(chuàng)建實時進程thread
}
void cleanup_module(void) { //清除模塊
rtl_free_irq(7); //禁止中斷7
pthread_delete_np (thread); //刪除實時進程thread
}
程序parport.c的make文件如下:
all: parport.o
include rtl.mk
clean:
rm -f *.o
按照如下命令對程序進行編譯:
make
運行程序可采用以下命令:
modprobe rtl_sched //調(diào)入所需的處理模塊
insmod parport.o //調(diào)入parport.o模塊
連接并口的2腳和10腳,即可通過示波器在并口的3腳上觀測到輸出的方波信號。
可以看到,RTLinux的實時程序被編寫成可加載的Linux內(nèi)核模塊,它能被動態(tài)地加入內(nèi)存,不能執(zhí)行Linux系統(tǒng)調(diào)用,模塊的初始化代碼對實時任務(wù)的結(jié)構(gòu)作初始化,把實時任務(wù)的時限、周期和釋放時間等實時參數(shù)傳遞給RTLinux。
通過對Linux最小的改動,提供一種可靠且廉價的硬實時操作系統(tǒng)RTLinux。RTLinux開發(fā)者可以充分利用Linux提供的各種方便來編寫任務(wù)的非實時部分,加速自己的任務(wù)進度。
評論