問題產(chǎn)生環(huán)境:
? ? 1蚊伞、STM32F1 MCU? 中通過USART2使用PD7席赂、PA2、 PA3實現(xiàn)RS485通信时迫,RS485通信部分代碼測試是沒有問題的颅停,很穩(wěn)定;
? ? 2掠拳、能過PA0模擬按鍵癞揉,當(dāng)按下時向RS485從設(shè)備發(fā)送功能碼輪詢數(shù)據(jù);
? ? 3溺欧、自已實現(xiàn)的RS485協(xié)議棧喊熟,功能碼0x1到0x6及0x16單獨測試是通過的;
? ? 4姐刁、程序能過3中的RS485協(xié)議棧實現(xiàn)的主芥牌、從機(jī)應(yīng)用代碼。一主機(jī)少量(比如10個)從機(jī)時龙填,測試沒有問題胳泉,但當(dāng)從機(jī)達(dá)到100個時程序無響應(yīng)死機(jī)了拐叉。
問題原因:
? ? ?程序椦乙牛空間小了不能滿足100個從機(jī)(結(jié)構(gòu)體為15字節(jié))所占的空間(STM32 程序默認(rèn)棧空間為0x00000400凤瘦,即1024字節(jié))宿礁。
問題簡單再現(xiàn):
int main(void)
{
? ? float fa[300];? ? ? ? // 局部變量
? ? // 其它操作......
}
問題解決:
? ? ? ?1、找到startup_stm32f10x_hd.s文件調(diào)整默認(rèn)棧大小蔬芥。
? ? ? ? ? ? 找到代碼 :Stack_Size EQU 0x00000400? ?比修改為 Stack_Size EQU 0x00000800
? ? ? ?2梆靖、避免使用占用棧空間過大的變量笔诵。
? ? ? ?3返吻、將局部變量調(diào)整為全局變量。此方法大多情況會解決問題乎婿。
? ??