libmodbus
Copyright 2021, 月下麒麟
Trace go
Reference: trace here
進行查找其函式定義
發現定義僅寫,若指標為空,則不繼續往下執行
另外,回傳的內容為指標(ctx)去取得結構modbus_t的成員backend,
但該成員(backend)其型別是另一結構modbus_backend_t,
繼續指向modbus_backend_t,並欲取得成員set_slave。
到這裡,進入第二層結構定義裡面,
同時,你也會有疑問,那然後呢? 抵達世界的盡頭 ~.~
別緊張,請善用搜尋~ modbus_backend_t
找出所有有關該結構名稱存在的地方
除了在modbus-private.h 定義處出現外,
分別在modbus-rtu.c modbus-tcp.c,
關鍵就是利用struct賦予初值,而初值的內容為函式名稱
同時,會將函式名稱套入到 結構定義處
這個技巧運用到了結構初值的賦予,與function point
小補充:
那你可能也觀察到 _modbus_rtu_backend 這個struct variable要做什麼用?
對先對modbus_backend_t進行搜尋,
會發現到modbus-rtu.c 與 modbus-tcp.c都有它的身影,
這與上一篇文章的初始化有關帶你閱讀一座程式 函式分解I
可以觀察到利用結構modbus_backend_t去創建兩個賦予結構初值的陣列,
並且將該宣告的陣列給予名稱 _modbus_tcp_backend , _modbus_rtu_backend
賦予名稱最主要的意義為,可以讓它被接續使用
進行名稱搜訊
呼應上一篇,就是讓此處的初始化指向該陣列。
鏡頭拉回來,進行_modbus_set_slave的解析
判斷slave號碼是介於0~247的範圍,
這部分可以參考Modbus Serial Specification裏頭有載名。
這三個結構成員出現在modbus_backend_t結構裡面。
會發現到不是還有一個backend_type嗎? 為何沒放進來?
因為該成員變數僅用來區分tcp, rtu。
那要介紹這三個主要為跟Modbus Protocol有關
這段說明書上的文字就很詳細的定義解釋了。
最後一上圖,Reference:實例研討: 從 C++ 學習 C 高級技巧
今天就寫到這,感謝您的閱讀。