2015-04-01 86 views
0

我對Arduino以外的嵌入式C++相當陌生,但到目前爲止,我已經能夠解決所有我運行過的問題進入,除了這一個。 我在Atmega 1284P上使用Atmel Studio,使用C++進行編碼。我使用以下變量進行比較,以TTL串行輸入(串行輸入是0和255之間在單個無符號字符字節轉印):無法將120的值賦予靜態常量無符號字符或將值賦給常量static static unsigned int

const unsigned char STEER_DEADZONE_MIN = 120; 
const unsigned char STEER_DEADZONE_MAX = 120; 
const unsigned char THROTTLE_DEADZONE_MIN = 136; 
const unsigned char THROTTLE_DEADZONE_MAX = 136; 

當我嘗試使用STEER_DEADZONE_MIN或任何列出的無符號字符的他們以12出來。我已經確認,我的程序將它視爲12,同時使用Atmel Studio模擬器手錶工具並將其打印到嵌入式設備上的LCD上。我實際上已經想出了一個用於刪除const的unsigned char的修復程序,但是我有const的原因,因爲我不想改變這個值。聲明它爲:

unsigned char TEST = 120; 
unsigned char TEST1 = 136; 

這導致值正確地爲120或136,但然後該值可能會被意外更改。它還看來,如果我做我的主循環內的分配爲:

const unsigned char TEST = 120; 

這也修復了值,但引入了自那以後沒有我的函數可以訪問其他的問題。

我也有一個看似相關的問題當談到一個const unsigned int。當我宣佈它的主循環之外:

const unsigned int SERVO_ESC_SPEED = 200; 
const unsigned int SERVO_STEER_SPEED = 200; 
const unsigned int SERVO_DISTANCE_SENSOR_SPEED = 200; 

價值出來爲37900,不過,我已經試過宣佈它在我的主循環裏面爲:

const unsigned int TEST = 200; 

糾正的價值,但作爲以上,並沒有幫助,因爲我的功能不再有權訪問它。在這種情況下,在主循環外刪除const不會修復該值。在這一點上我真的很茫然。我唯一能想到的其他事情就是嘗試創建一個包含所有這些const變量的設置類,並查看是否更正了這些值。我將嘗試下一步並更新結果。

+3

也許你在你的代碼中存在一個bug,它正在摧毀存儲'const'變量的區域;或者也可能是鏈接器或程序加載器出了問題,並且它不是首先正確設置'const'變量區域。嘗試編寫一個最小程序來測試,即只包含'main()'(或任何入口點)和一個'const'全局變量以及檢查該變量值所需的絕對最小代碼量。 – 2015-04-01 04:13:00

+0

好吧,我可以通過使用atmega1284P模板創建一個新的Atmel Studio項目,然後構建一個完全準系統main.cpp,只有那些定義的變量和一個main(),它只將它們直接打印到LCD。此時,我只能假定它是avr-gcc,atmel工作室或工具鏈/鏈接器模板中的一個錯誤。無論如何,我通過在Settings.h文件中創建Settings類並在類中聲明所有那些常量,找到了解決方法。 – theDoktorJ 2015-04-01 06:10:28

+1

只要您需要一些基本的解決方法,我就不會相信任何進一步的代碼。 – 2015-04-01 07:03:28

回答

0

如何讓它們變得靜態呢?

static const unsigned char STEER_DEADZONE_MIN = 120; 
static const unsigned char STEER_DEADZONE_MAX = 120; 
static const unsigned char THROTTLE_DEADZONE_MIN = 136; 
static const unsigned char THROTTLE_DEADZONE_MAX = 136; 
+0

對不起,格式不好,我不知道如何標記爲代碼或在評論中開始新行... 我試過了,它沒有幫助,不幸的是。他們仍然顯示爲12.我能夠使其工作如下所列,但沒有這樣的運氣:int static unsigned char STEER_DEADZONE_MIN = 120; static unsigned char STEER_DEADZONE_MAX = 120; static unsigned char THROTTLE_DEADZONE_MIN = 136; static unsigned char THROTTLE_DEADZONE_MAX = 136;' – theDoktorJ 2015-04-01 04:37:01

+0

有趣。我的懷疑在於const類型,它的全局性,以及您正在爲嵌入式編譯。我在這裏發現了一些有趣的信息,也許這將有助於產生一些想法:http://www.embedded.com/electronics-blogs/programming-pointers/4023879/Enumeration-Constants-vs-Constant-Objects 你是對的人。 .comment格式化打擊! ryancdotnet 2015-04-01 04:46:38

+0

有趣。我發現使用所有變量創建外部Settings類並將其設置爲Settings :: STEER_DEADZONE_MIN的解決方法似乎可行,但這是一個有趣的閱讀,我打算繼續嘗試解決爲什麼會失敗。謝謝您的幫助。 – theDoktorJ 2015-04-01 05:19:20