1. 程式人生 > >STM8+STVD+COSMIC 學習筆記 address is out of range and is ignored

STM8+STVD+COSMIC 學習筆記 address is out of range and is ignored

在連續整了一個下午,一個晚上,又一個上午之後終於可以用STVD除錯了!以此來紀念一下。

微控制器時STM8AF5189,工程是人家編譯好的,結果拿到手裡編譯後發現s19檔案變大了不少,而且裡面的地址出現了一些0x0000開始的地址,正常情況下應該是從0x8080開始才對,最開始的感覺就是編譯器配置問題,在改了若干項配置,包括優化等等,還是不能模擬,debug時提示swim communication error,在排除了硬體問題之後,感覺是軟體問題。經歷了長時間折騰後打算用IAR,結果換用IAR問題又是一大堆。無奈又回頭折騰STVD,偶然的發現,可能是c編譯器的問題,也就是COSMIC的問題,當時用的是從網上下的一個,沒注意有程式碼限制。後來從網上找到一款切實不錯的COSMIC,安裝完成後,打上補丁,可以debug了,s19檔案裡的地址也正常了。

下載地址:連結:http://pan.baidu.com/s/1hrK4iyw 密碼:j5z8

在此繼續雜記一些東西。

STM8AF5189,LQFP64封裝有CAN,64K flash,4096B RAM,2048B EEPROM,供電3-5.5v。http://www.lierda.com/product/id/149/show.html

很多人選用STVD+COSMIC做為stm8 系列MCU產品開發的IDE,在編譯除錯過程中常常遇到些問題。這裡我稍加整理,分享幾個硬體線路和軟體語法以外的話題。拋磚引玉,細節請自行研究相關手冊。

一、零頁記憶體區出界溢位的問題。

對於這個問題一般會提諸如bsct/ubsct size overflow……


這個提示告知預設的零頁區放不下現有全域性變數或靜態變數,導致溢位。這裡的RAM零頁資料區,即00-0xff區域。至於BSCT/UBSCT是什麼意思在COSMIC 編譯手冊裡有講。關於各STM8晶片的儲存分配請看資料手冊裡的MEMORY MAP.


上面截圖來自於COSMIC 裡的編譯手冊裡的相關描述


上面截圖來自於STVD+COSMIC 編譯環境的相關配置頁面。

解決這個問題比較簡潔的辦法有兩種:

1、把大部分全域性變數或靜態變數前冠以@near,保留部分使用頻繁的資料在零頁區;


上面截圖來自於COSMIC 裡的編譯手冊裡儲存模式的相關描述。

2、在編譯配置那裡將堆疊模式改為長堆疊模式,資料預設放在

0x100以上的區域,把需要放在0頁區的變數前冠以@TINY。操作如下圖所示。


二、資料儲存區溢位話題。

資料儲存區溢位是指除了堆疊的以外的RAM空間不足以存放現有全域性變數或靜態變數。一般有諸如.DATA/.BSS size overflow的提示。


如下圖,紅色RAM空間存放各種全域性變數或靜態變數,灰色區用作堆疊。


上面截圖來自於STM8S參考手冊裡的相關描述。

假設現有變數資料不能壓縮精簡,那就嘗試將堆疊區域壓縮。比方將下圖中的0x1ff改為0x2ff,具體改多少要結合你實際應用和晶片本身RAM空間大小,滿足需求就好。當然如果RAM空間跟你實際需求相差甚遠,自然得想別的辦法了。


順便提下,STM8的堆疊是向下生長的,或者是從高位地址往低位地址壓入資料的。起始棧頂一般預設為RAM最大地址處。

三、一個跟程式程式碼編譯優化有關的話題

ST官方也為STM8各系列提供了參考標準外設韌體庫,裡面有大量的外設操作庫函式。在利用庫函式程式設計時,有時會發現並沒有寫幾句程式碼,結果生成的目標檔案很大,明顯不太正常。這個可能在C Compiler的優化那個地方選擇不合適,要開啟SPLIT選項。

下面有兩幅圖,找了個簡單例程測試下。main()裡就一個GPIO讀埠,外加TIM1 的預設設定函式和配置函式。

沒開啟SPLIT選項時,生成的程式程式碼為4965 Byte,開啟SPLIT選項後生成的程式程式碼是548 Byte,二者的常量程式碼均為124 Byte。很明顯,開與不開相差甚遠。


上圖是優化配置裡的SPLIT項關閉時的情形。


上圖是優化配置裡的SPLIT項開啟時的情形。

注:

1、關於SPLIT選項的說明,COSMIC手冊裡有描述。

2、開與不開SPLIT項的機器碼檔案大小差別也得看你具體呼叫的庫函式和實際應用,並非總是跟上面的例子那樣懸殊。

四、中斷向量檔案話題。

一般來說,不論你自己新建工程還是利用ST官方庫的模板建立工程,專案裡總會自動生成一箇中斷向量檔案 stm8_interrupt_vector.c。這裡面其實就是放的一個常量表,即STM8晶片各個中斷向量的入口地址。


有的人希望使用自己的中端向量名字,想把這個stm8_interrupt_vector.c拿掉,比方說改換為vector.c 。發現怎麼改都不行。每次改完編譯,stm8_interrupt_vector.c如幽靈般的又回來了。

其實,這裡是可以修改的,但要LINKER 配置的那個地方同步修改,就像下方圖示那樣。好奇的話可以去試試。


另外,不建議在這個向量檔案裡寫中斷函式或其它函式,不然有時可能會出現些讓你找不著北的奇怪問題。

五、斷言函數出錯提示問題。

這個問題一般是剛接觸STM8開發的人使用庫過程中才遇到的。他把main.c裡的void assert_failed(uint8_t* file, uint32_t line) 函式體刪掉了導致的。

一般出錯時有如下提示:


這個函式作什麼用就不用解釋了,建議你先不要急於刪它。不想要時,就在stm8s_conf.h檔案裡把#define USE_FULL_ASSERT (1)註釋後即可刪除相關程式碼。