xenomai核心解析--雙核系統呼叫(三)--如何為xenomai新增一個系統呼叫
阿新 • • 發佈:2020-07-19
版權宣告:本文為本文為博主原創文章,轉載請註明出處。如有錯誤,歡迎指正。
@[toc]
### 一、新增系統呼叫
下面給xenomai新增一個系統呼叫`get_timer_hits()`,用於獲取應用程式執行CPU的定時器中斷產生的次數,類似於VxWorks裡的tickGet()。需要說明一下VxWorks是採用週期tick的方式來驅動系統運作,tickGet()獲取的也就是tick定時器中斷的次數,但xenomai使用的tickless,即定時器不是週期產生tick的。所以`get_timer_hits()`用於獲取定時器中斷次數,`get_timer_hits()`沒有具體用途,這裡主要用來舉例怎麼為xenomai新增一個實時系統呼叫。
在前兩篇文中說到,xenomai每個系統的系統系統呼叫號在`\cobalt\uapi\syscall.h`中:
```C
#define sc_cobalt_bind 0
#define sc_cobalt_thread_create 1
#define sc_cobalt_thread_getpid 2
......
#define sc_cobalt_extend 96
```
在此新增`sc_cobalt_get_timer_hits`的系統,為了避免與xenomai系統呼叫衝突(xenomai官方新增的系統呼叫號從小到大),那我們就從最後一個系統呼叫新增,即127號系統呼叫,如下。
```C
#define sc_cobalt_bind 0
#define sc_cobalt_thread_create 1
#define sc_cobalt_thread_getpid 2
......
#define sc_cobalt_extend 96
#define sc_cobalt_ftrace_puts 97
#define sc_cobalt_recvmmsg 98
#define sc_cobalt_sendmmsg 99
#define sc_cobalt_clock_adjtime 100
#define sc_cobalt_thread_setschedprio 101
#define sc_cobalt_get_timer_hits 127
#define __NR_COBALT_SYSCALLS 128 /* Power of 2 */
```
先確定一下我們這個函式的API形式,由於是一個非標準的形式,這裡表示如下:
>```C
>int get_timer_hits(unsigned long *u_tick);
>```
>
>引數為儲存hits的變數地址;
>
>返回值:成功0;出錯 <0;
系統呼叫的標頭檔案,然後新增一個系統呼叫的**宣告**,覺得它和clock相關,那就放在`kernel\xenomai\posix\clock.h`中吧。
```C
#