解析單片機中的keil常見問題

2021-03-02 21ic電子網

       在程序中出現了如下警告:

  *** WARNING L15: MULTIPLE CALL TO SEGMENT

  SEGMENT: ?PR?_CRCDATA?PANEL_DISP

  CALLER1: ?C_C51STARTUP

  CALLER2: ?PR?UART_RECV?PANEL_DISP

  *** WARNING L15: MULTIPLE CALL TO SEGMENT

  SEGMENT: ?PR?ANALOGALLBECKON?PANEL_DISP

  CALLER1: ?C_C51STARTUP

  CALLER2: ?PR?UART_RECV?PANEL_DISP

  *** WARNING L15: MULTIPLE CALL TO SEGMENT

  SEGMENT: ?PR?SWITCHALLBECKON?PANEL_DISP

  CALLER1: ?C_C51STARTUP

  CALLER2: ?PR?UART_RECV?PANEL_DISP

  我的程序編譯出來就這3個警告,但是程序可以正常下載運行。但是我覺得有這些警告會使程序存在bug。從字面上看是它的意思是我程序中接受函數UART_RECV()多調用了analogAllBeckon()、switchAllBeckon()。

  因為51的普通函數是不可重入的,變量放在固定的地址,兩個函數同時運行時,就會修改同一個變量,從而導致結果錯誤。於是我在analogAllBeckon()、switchAllBeckon()函數後面加了void analogAllBeckon()reentrant{//All Analog data beckon使程序消除了警告。這種方法是表明函數是可被多哥任務調用而不修改函數裡邊的變量值,以此來實現函數的重入性。

  關於reentrant的使用keil的官方論壇上有詳細的討論。

  Andy Neil(官方工程師)建議

  "Are you sure that you really need to make everything reentrant?...A reading of the Keil app notes & knowledgebase articles on this subject showed that it was not necessary. "

  由於每一次調用被reentrant聲明的函數都要把函數的參數和內部變量壓棧,所以很容易使堆棧區溢出,S52隻有256Bytes的data段,一個簡單的函數如果有一個參數三個內部變量,則需要壓棧4位元組以上,這還不包括函數調用堆棧.reentrant其實並不是適合低端的單片機,keil論壇上有人說對於那些有KB以上RAM的單片機reentrant才適合。

 

相關焦點

  • Keil編譯警告:function "assert_param" declared implicitly的...
    1 問題描述新建STM32的keil工程,在編譯時出現警告「..FWLIBsrcstm32f10x_rcc.c(273): warning: #223-D: function 「assert_param」 declared implicitly」,接下來一堆警告和錯誤。
  • Keil編譯常見問題
    while(1) //無限循環,這在不使用作業系統的程序中最常見{...}return 0; //這句聲明在正常情況下不可能執行到,編譯器發出警告}解決:不理會..第二種情況比較常見,函數a調用函數b,但函數b的函數體在函數a的下面:void a(void) //函數a的實體{b(); //調用函數b}void b(void) //函數b的實體{...
  • 51,AVR,PIC,MSP430,STM32單片機比較
    IDE環境推薦 keil。編程器自己自製ISP下載線就行,好做,成本5元左右。,eeprom大,出廠時程序引導區就已經加密,並且stc解密的市面價格在1.5w到2.5w之間,可見解密難度大,在一定程度上保護了單片機工程師的利益和產品開發商的利益。生產時就已經考慮到與傳統51的兼容問題,兼容做的很好,又增加了許多功能,軟復位功能我比較喜歡。缺點:資料就是宏晶網上的資料,資料少,不適合初學者---我指學習它自己增加的功能。
  • 單片機編程軟體大佬:明確單片機編程軟體編寫單片機程序步驟
    單片機用什麼軟體編程?單片機開發中除必要的硬體外,同樣離不開軟體,我們寫的彙編語言源程序要變為CPU可以執行的機器碼有兩種方法,一種是手工彙編,另一種是機器彙編,目前已極少使用手工彙編的方法了。機器彙編是通過彙編軟體將源程序變為機器碼,用於MCS-51單片機的彙編軟體有早期的A51,隨著單片機開發技術的不斷發展,從普遍使用彙編語言到逐漸使用高級語言開發,單片機的開發軟體也在不斷發展,Keil軟體是目前最流行開發MCS-51系列單片機的軟體,這從近年來各仿真機廠商紛紛宣布全面支持Keil即可看出。
  • 單片機使用printf函數進行串口列印輸出
    以前在使用keil編寫51單片機程序的時候,經常使用printf函數列印輸出一些關鍵的過程數據到電腦,方便監控程序的運行狀況。最近使用IAR for MSP430 調試 MSP430G2553 程序的時候,發現了一些小問題,MSP430G2553單片機並沒有按照我的預期輸出數據到電腦。帶著疑惑我查看了keil的幫助文件裡面的printf函數說明,原來printf函數最終是調用putchar函數來實現列印輸出字符的。
  • keil 中常見的幾種警告
    keil中常見的幾種警告,固然,相對於錯誤的,警告的程度不及錯誤的嚴重性,有時候忽略,會出現意想不到的錯誤。先看看常見的幾種錯誤,分析出來現的原因。本文引用地址:http://www.eepw.com.cn/article/201609/296870.htm  1.
  • 單片機:明明是一門動手實踐課程,卻硬生生學成了理論課
    學習單片機的現狀是:明明是一門動手實踐的課程,卻硬生生學成了理論課。還記得大學學習單片機的時候,老師在講臺上熱情激昂的講著51單片機的彙編指令,卻隻字不提單片機的編程環境,整個學期結束唯一記住的就是110條彙編指令。你肯定理解錯了,這裡記住的其實是數字110,那些指令一條也沒有記住。
  • 單片機c語言中的左移右移
    例如:a = 0x8f; // 10001111a << 2; // 左端移出的值丟棄,右端補0結果:a = 0x3c (00111100)本文引用地址:http://www.eepw.com.cn/article/201611/321270.htm在keil c51
  • MSP430G2553單片機使用printf函數進行串口列印輸出
    以前在使用keil編寫51單片機程序的時候,經常使用printf函數列印輸出一些關鍵的過程數據到電腦,方便監控程序的運行狀況。最近使用IAR for MSP430 調試MSP430G2553程序的時候,發現了一些小問題,MSP430G2553單片機並沒有按照我的預期輸出數據到電腦。
  • 單片機使用printf函數的兩種辦法
    今天就簡單來說說怎麼在51單片機中使用"printf"函數:包括使用自帶的printf函數和自己動手寫一個printf函數,再貼代碼之前先介紹幾個相關的知識,主要用於自己寫printf函數。97轉化為ASCII碼的97的程序就像下面這樣vsprintf(string,"%d",97),當然還有一點需要注意:在keil裡面使用sprintf需要包含stdio.h這個頭文件(當然這裡也可以使用sprintf,作用完全差不多,只需要稍加修改即可,不多介紹)。
  • 單片機延時程序經驗
    標準的C語言中沒有空語句。但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在彙編語言中很容易實現,寫幾個nop就行了。
  • 基於單片機的仰臥起坐計數器
    本設計將計算機軟、硬體技術溶為一體,以51單片機作為控制核心,達到對仰臥起坐的自動計數。具體過程包括開始、結束控制,計數值的實時顯示,測試結束的提示等。該設計具有結構簡單、功能齊全、實用性強,可靠性高等特點。
  • 單片機小製作,DIY表情矩陣
    如果你選擇的單片機支持ISP燒錄,並且有ISP燒錄條件的話,就可以使用計算機上的仿真軟體來進行程序的燒寫。ISP燒錄條件是指備有USB轉串口的轉換線或者計算機具有串口,並且你的單片機系統支持ISP燒錄。進行單片機製作的時候不可避免地會遇到對程式語言的選擇,所有的單片機都支持使用彙編語言開發。除了彙編語言,單片機還可支持其他高級語言。
  • 【編程基礎學習教程】Keil(MDK-ARM)介紹、下載、安裝與註冊
    具有代碼域及域切換功能(CodeBanking & Bank Switching)    c.可用於RTX51作業系統RTX51是一個實時多任務作業系統,它改變了傳統的編程模式,甚至不必用main( )函數,單片機系統軟體向RTOS發展是一種趨勢,這種趨勢對於186和386及68K系列CPU更為明顯和必須,對8051因CPU較為簡單,程序結構等都不太複雜,RTX51作用顯得不太突出,其專業版軟體PK51軟體包甚至不包括RTX51Full,而只有一個RTX51TINY版本的RTOS。
  • 單片機系統中常見的報警方式有哪幾種?
    採用這種方式進行報警時,單片機應用系統將對語音信號進行採集、處理、合成和識別,使報警系統的功能更加完善,報警信息更加具體、生動、準確,直至給出報警對象的具體信息。(4)圖形、圖像報警。利用單片機應用系統進行報警的常用方法是什麼?常用的方法就是把採集到的數據送到單片機應用系統進行處理,與該參數的上、下限給定值進行比較,若超過給定值時則進行報警,否則,就作為正常值進行顯示或控制。
  • keil5.24創建uCOSIII工程實現stm32實時作業系統(環境配置)
    自從ARM keil升級到keil5系列版本後,Keil工具對作業系統,以及各種庫文件的移植大大簡化了只需要動動手指,勾選一些庫文件就能實現移植工作了。1:假設你安裝了keil 5.24(稍早點版本支持的os偏少),並且下載了你需要的支持包。
  • 單片機C語言延時需注意的問題
    標準的C語言中沒有空語句。但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在彙編語言中很容易實現,寫幾個nop就行了。  在keil C51中,直接調用庫函數:  #include // 聲明了void _nop_(void);  _nop_(); // 產生一條NOP指令  作用:對於延時很短的,要求在us級的,採用「_nop_」函數,這個函數相當彙編NOP指令,延時幾微秒。NOP指令為單周期指令,可由晶振頻率算出延時時間,對於12M晶振,延時1uS。
  • Keil中C語言與彙編語言混合編程需要注意的幾個地方
    在keil C語言與彙編語言的混合編程中曾經遇到過的一些問題,寫下來留作以後參考。4、寄存器衝突問題的解決彙編程序塊中常常會使用到51的通用寄存器,比如R0-R7。這種情況下可能會和C語言程序中已經使用到的R0-R7產生衝突,以至於產生一些非常隱蔽和古怪的錯誤。雖然有人說KEIL可以自動分配寄存器組使之不產生衝突。但是在我這裡具體測試時還是有衝突的(或者是我的KEIL設置有問題?)
  • 51單片機實現scanf和printf函數
    學習單片機有很長時間了,之前要再屏幕上顯示一個變量或者通過串口傳出一些變量值觀測的話,需要進行一系列的取餘取整運算,很是麻煩。本文引用地址:http://www.eepw.com.cn/article/201611/318359.htm最近又研究了一下keil中針對printf和scanf的實現機理,做了一些改動,實現了標準格式化輸入輸出,共大家參考。1.
  • 圖形化編程玩51單片機(十八)-電子廣告顯示屏
    3,打開keil編譯器軟體,在文本框裡粘貼,生成hex文件。4,打開燒錄軟體,找到剛剛的hex文件,下載到單片機。上期內容回顧:圖形化編程玩51單片機(十七)-數字鐘友情提示:1,感覺不錯,請在文章結尾點擊「在看」,幫忙分享一下,讓更多的人看到。