本文作者:milershao 很多人選用STVD+COSMIC做為stm8 系列MCU產(chǎn)品開發(fā)的IDE,在編譯調(diào)試過(guò)程中常常遇到些問(wèn)題。這里我稍加整理,分享幾個(gè)硬件線路和軟件語(yǔ)法以外的話題。拋磚引玉,細(xì)節(jié)請(qǐng)自行研究相關(guān)手冊(cè)。 一、零頁(yè)內(nèi)存區(qū)出界溢出的問(wèn)題。 對(duì)于這個(gè)問(wèn)題一般會(huì)提諸如bsct/ubsct size overflow…… 
這個(gè)提示告知默認(rèn)的零頁(yè)區(qū)放不下現(xiàn)有全局變量或靜態(tài)變量,導(dǎo)致溢出。這里的RAM零頁(yè)數(shù)據(jù)區(qū),即00-0xff區(qū)域。至于BSCT/UBSCT是什么意思在COSMIC 編譯手冊(cè)里有講。關(guān)于各STM8芯片的存儲(chǔ)分配請(qǐng)看數(shù)據(jù)手冊(cè)里的MEMORY MAP. 
上面截圖來(lái)自于COSMIC 里的編譯手冊(cè)里的相關(guān)描述。

上面截圖來(lái)自于STVD+COSMIC 編譯環(huán)境的相關(guān)配置頁(yè)面。 解決這個(gè)問(wèn)題比較簡(jiǎn)潔的辦法有兩種: 1、把大部分全局變量或靜態(tài)變量前冠以@near, 保留部分使用頻繁的數(shù)據(jù)在零頁(yè)區(qū); 
上面截圖來(lái)自于COSMIC 里的編譯手冊(cè)里存儲(chǔ)模式的相關(guān)描述。
2、 在編譯配置那里將堆棧模式改為長(zhǎng)堆棧模式,數(shù)據(jù)默認(rèn)放在0x100以上的區(qū)域,把需要放在0頁(yè)區(qū)的變量前冠以@TINY。操作如下圖所示。 
二、數(shù)據(jù)存儲(chǔ)區(qū)溢出話題。 數(shù)據(jù)存儲(chǔ)區(qū)溢出是指除了堆棧的以外的RAM空間不足以存放現(xiàn)有全局變量或靜態(tài)變量。一般有諸如.DATA/.BSS size overflow的提示。 
如下圖,紅色RAM空間存放各種全局變量或靜態(tài)變量,灰色區(qū)用作堆棧。
 上面截圖來(lái)自于STM8S參考手冊(cè)里的相關(guān)描述。
假設(shè)現(xiàn)有變量數(shù)據(jù)不能壓縮精簡(jiǎn),那就嘗試將堆棧區(qū)域壓縮。比方將下圖中的0x1ff改為0x2ff,具體改多少要結(jié)合你實(shí)際應(yīng)用和芯片本身RAM空間大小,滿足需求就好。當(dāng)然如果RAM空間跟你實(shí)際需求相差甚遠(yuǎn),自然得想別的辦法了。 
順便提下,STM8的堆棧是向下生長(zhǎng)的,或者是從高位地址往低位地址壓入數(shù)據(jù)的。起始棧頂一般默認(rèn)為RAM最大地址處。 三、一個(gè)跟程序代碼編譯優(yōu)化有關(guān)的話題 ST官方也為STM8各系列提供了參考標(biāo)準(zhǔn)外設(shè)固件庫(kù),里面有大量的外設(shè)操作庫(kù)函數(shù)。在利用庫(kù)函數(shù)編程時(shí),有時(shí)會(huì)發(fā)現(xiàn)并沒(méi)有寫幾句代碼,結(jié)果生成的目標(biāo)文件很大,明顯不太正常。這個(gè)可能在C Compiler的優(yōu)化那個(gè)地方選擇不合適,要打開SPLIT選項(xiàng)。 下面有兩幅圖,找了個(gè)簡(jiǎn)單例程測(cè)試下。main()里就一個(gè)GPIO讀端口,外加TIM1 的默認(rèn)設(shè)置函數(shù)和配置函數(shù)。 沒(méi)打開SPLIT選項(xiàng)時(shí),生成的程序代碼為4965 Byte,打開SPLIT選項(xiàng)后生成的程序代碼是548 Byte,二者的常量代碼均為124 Byte。很明顯,開與不開相差甚遠(yuǎn)。 
上圖是優(yōu)化配置里的SPLIT項(xiàng)關(guān)閉時(shí)的情形。

上圖是優(yōu)化配置里的SPLIT項(xiàng)打開時(shí)的情形。 注: 1、關(guān)于SPLIT選項(xiàng)的說(shuō)明,COSMIC手冊(cè)里有描述。 2、開與不開SPLIT項(xiàng)的機(jī)器碼文件大小差別也得看你具體調(diào)用的庫(kù)函數(shù)和實(shí)際應(yīng)用,并非總是跟上面的例子那樣懸殊。 四、中斷矢量文件話題。 一般來(lái)說(shuō),不論你自己新建工程還是利用ST官方庫(kù)的模板建立工程,項(xiàng)目里總會(huì)自動(dòng)生成一個(gè)中斷矢量文件 stm8_interrupt_vector.c。這里面其實(shí)就是放的一個(gè)常量表,即STM8芯片各個(gè)中斷矢量的入口地址。  有的人希望使用自己的中端矢量名字,想把這個(gè)stm8_interrupt_vector.c拿掉,比方說(shuō)改換為vector.c 。發(fā)現(xiàn)怎么改都不行。每次改完編譯,stm8_interrupt_vector.c如幽靈般的又回來(lái)了。
其實(shí),這里是可以修改的,但要LINKER 配置的那個(gè)地方同步修改,就像下方圖示那樣。好奇的話可以去試試。  另外,不建議在這個(gè)矢量文件里寫中斷函數(shù)或其它函數(shù),不然有時(shí)可能會(huì)出現(xiàn)些讓你找不著北的奇怪問(wèn)題。
五、斷言函數(shù)出錯(cuò)提示問(wèn)題。 這個(gè)問(wèn)題一般是剛接觸STM8開發(fā)的人使用庫(kù)過(guò)程中才遇到的。他把main.c里的void assert_failed(uint8_t* file, uint32_t line) 函數(shù)體刪掉了導(dǎo)致的。 一般出錯(cuò)時(shí)有如下提示: 
這個(gè)函數(shù)作什么用就不用解釋了,建議你先不要急于刪它。不想要時(shí),就在stm8s_conf.h文件里把 #define USE_FULL_ASSERT (1)注釋后即可刪除相關(guān)代碼。 |