[有關Marlin程式碼的問題請教各位高手]
官方版2.0.2韌體
在Configuration.h頁籤下第100~111行間:
// Effective X/Y positions of the three vertical towers.
#
define
SIN_60 0.8660254037844386
#define COS_60 0.5
#define DELTA_TOWER1_X -SIN_60*DELTA_RADIUS // front left tower
#define DELTA_TOWER1_Y -COS_60*DELTA_RADIUS
#define DELTA_TOWER2_X SIN_60*DELTA_RADIUS // front right tower
#define DELTA_TOWER2_Y -COS_60*DELTA_RADIUS
#define DELTA_TOWER3_X 0.0 // back middle tower
#define DELTA_TOWER3_Y DELTA_RADIUS
// Diagonal rod squared
#define DELTA_DIAGONAL_ROD_2 pow(DELTA_DIAGONAL_ROD,2)
問題1:
為何要透過定義SIN_60與COS_60的值來執行後續的delta轉換,而非直接使用語法庫裡的sin()與cos()函數來執行呢?這樣如果有角度誤差要修正不是很麻煩嗎?
問題2:
既然有sq()函數可以直接作平方計算,為何還特地使用pow()後指定2次方參數,這樣有畫蛇添足的感覺,是有什麼程式撰寫上的實務考量嗎?
因為小弟實在是程式外行,想要修改程式碼來校正誤差,但是又怕改的不好造成Bug,想來請教一下論壇上有程式實務經驗的前輩,希望能夠幫我解惑一下。
MoMo Yang
2015-10-12 03:08:19
問題1: define是預處理, 所以在編譯前就做掉了, 效率會高於呼叫sin()及cos()
問題2: sq() 是Android定義的, 不是標準C語言的函式, 所以可能作者不知道有這個定義, 也有可能是為了提高移植性, 也有可能是作者心情好
MoMo Yang
2015-10-12 03:14:33
另外若要取得0.8660254037844386可以透過以下兩個方式
sqrt(3.0)/2
sin(60*3.1415926/180)
很顯然用define效率高很多
Roy Lo
2015-10-12 03:14:39
如果 sq(x) 的結果和 pow(x,2)一樣的話,用那一個都可以吧,不過我查了 sq() 的定義,參數是任意的數字型別,而 pow() 的參數型別為 float, 也許作者有其他的考量~也可能只是寫程式的習慣
Roy Lo
2015-10-12 03:15:35
Rickey Yang
2015-10-12 08:04:18
我也覺得是效率考量
尤其控制的東西多了
又要減少各被控件與感測件的作動時間差
減少計算函式引入差很多
戴士偉
2015-10-12 08:16:19
汪之逸
2015-10-12 10:40:39
官方Marlin用sq不是用pow, 避免某些compiler的差異...
李穆
2015-10-12 11:50:46