作者 主題: 請問一下 關於兩支程式的交互使用技巧  (閱讀 10028 次)

0 會員 與 1 訪客 正在閱讀本文。

deep

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
很抱歉我下了很爛的標題 因為我也不知道這個問題的專業術語該怎樣說
============問題如下=================

在我的開發版上 有好幾支程式 簡稱程式A B C D

今天我想要做的功能是 A是DRIVER B是應用A的APP C是另外一個設備的DRIVER D是另外依個設備的APP

而我想要當B藉由A收到PULSE後 啟動C程式

而現在 A B C D各個程式皆已完工(皆使用C)

但卡在這個問題

小弟有兩個解決方案

一:使用一個文件,當A收到PULSE後,B便到該文件寫入資料,但此時D便要不定時到該文件檢查是否有被寫入,小弟感覺這是滿笨的作法

二:利用MAKE 將兩個B.O及D.O LINK起來 然後可以互相使用裡面的函數,但在這方面有點難度,因為該應用程式都很大,小弟有時間上的限制,再加上小弟對於MAKEFILE並沒有很熟析

因此想要請問大家 C語言是否有直接呼叫一之應用程式去執行的功能
如此依來 小弟變可以在B程式中 直接插入要執行APP D的程式段便可了
便不用再仔細去了解D程式了

感謝回覆




darkranger

  • 榮譽學長
  • 俺是博士!
  • *****
  • 文章數: 1370
    • 檢視個人資料
    • http://darkranger.no-ip.org
二:利用MAKE 將兩個B.O及D.O LINK起來 然後可以互相使用裡面的函數,但在這方面有點難度,因為該應用程式都很大,小弟有時間上的限制,再加上小弟對於MAKEFILE並沒有很熟析

因此想要請問大家 C語言是否有直接呼叫一之應用程式去執行的功能
如此依來 小弟變可以在B程式中 直接插入要執行APP D的程式段便可了
便不用再仔細去了解D程式了

感謝回覆
1.
不只是 MAKEFILE,要這樣做,原始碼要熟....
2.
system() 跟 popen() 吧

deep

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
感謝darkranger的回覆!

關於SYSTEM()的函式 我已經有嚐試過了 此函式屬於行程及流程控制的函式
另外我也有找到許多類是的函式
但昨天有一點很重要的 我沒有提到
我要做的東西 式屬於MODULE階層的
在我要把她編成KERNEL的時候
系統不允許我使用SYSTEM()函式
但是在應用程式方面 的確是可行的

至於POPEN函式 我看說明與SYSTEM差不多 就沒試了

所以 現在我還在試 看看有沒有哪個函式能夠被我編進去MODULE 然後能正常使用的!!

如果期限內真的達不到的話 只好啃程式了~"~

 

deep

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
經過這一兩天TRACE的結果 發現其實很多模組及DRIVER其實都有很重的相依性

在A DRIVER或A MODULE去呼叫B DRIVER或D MODULE 似乎是很正常的事情

而約略看了一下程式 也大概領略了 大家常說 "在LINUX底下只要掛上DRIVER後的硬體,剩下就是讀寫檔案的工作了"

哀 無奈自己很少看DRIVER類型的C 而DRIVER的觀念還很薄弱 看的很吃力

再給自己加加油吧!!.... ;D


thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
kernel driver用system()或popen()會有問題的,
你可以這麼想(不是這個原因,不過這樣想比較好理解),
bootloader起來後,是先跑kernel,kernel跑完後才掛載filesystem,
在還沒有掛載 filesystem 前,跟檔案系統有關的如system()、popen()就會有問題。

driver若要通知 AP 做什麼事,要用其他的方式,
例如透過 ioctl() 方式的 select、 polling 等,這類由 AP 主動來接觸的方式,
driver要主動去呼叫 AP 會有困難。

deep

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
kernel driver用system()或popen()會有問題的,
你可以這麼想(不是這個原因,不過這樣想比較好理解),
bootloader起來後,是先跑kernel,kernel跑完後才掛載filesystem,
在還沒有掛載 filesystem 前,跟檔案系統有關的如system()、popen()就會有問題。

driver若要通知 AP 做什麼事,要用其他的方式,
例如透過 ioctl() 方式的 select、 polling 等,這類由 AP 主動來接觸的方式,
driver要主動去呼叫 AP 會有困難。

首先 先謝謝thyme的回覆
其實 經你這樣一說 我也覺得 我用user level的函式 去做driver很蠢
畢竟 開機後 boot起來 檢查driver 然後掛上filesystem 接著對os來說
"任何東西"都是檔案 包含driver 那這樣一來 我用user level的函式 去做driver
哪裡找的到函式對應的底層啊 呵呵  這是上面那段話給我的啟示

接著由於每一樣東西都是"檔案" 那對於要使用的io來說應該是掛好了io的driver後
然後 在user level寫一支ap 去檢查是否有輸入
當有輸入了之後 再呼叫要使用的driver
而此時 driver若有user level的命令可用的話
便可以 直接透過 system()去呼叫了

記得 之前好像有看過 driver 又分兩層 上面所說的用ap 透過ioctl 應該就是上層吧
而真正碰到io的 應該就是更底層了

以上 我的理解 應該正確吧!? :D

至於module呼叫module 我覺得應該還是可行啦
因為我也有看到別支driver的程式 有這樣的寫法
先寫好底層driver後 然後 再寫一支module
去讓driver 在掛上module後 有別的功能
只是 程式很複雜 一直沒有空好好去追一下

小弟還很菜 希望各位前輩 指點指點摟
感謝!感謝!

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
至於module呼叫module 我覺得應該還是可行啦
因為我也有看到別支driver的程式 有這樣的寫法
先寫好底層driver後 然後 再寫一支module
去讓driver 在掛上module後 有別的功能
只是 程式很複雜 一直沒有空好好去追一下

「module呼叫module」其實很簡單,把那個 function 直接 export 出來,
其他地方直接呼叫就可以了,
這邊唯一要注意的是,這麼一來會有相依性,被呼叫的 module 要先載入,
否則會發生找不到 symbol 的錯誤出現。

deep

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
「module呼叫module」其實很簡單,把那個 function 直接 export 出來,
其他地方直接呼叫就可以了,
這邊唯一要注意的是,這麼一來會有相依性,被呼叫的 module 要先載入,
否則會發生找不到 symbol 的錯誤出現。

了解摟  感謝thyme
這一兩個星期 比較有空的時候
再來實驗看看

感謝thyme