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