0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

子函數(shù)多層調(diào)用的主要注意事項(xiàng)分析

中穎電子 ? 來(lái)源:中穎電子 ? 2024-03-27 15:36 ? 次閱讀

應(yīng)用方案設(shè)計(jì)中,開(kāi)發(fā)者經(jīng)常會(huì)碰到某個(gè)子函數(shù)需要多次多級(jí)調(diào)用的情況。程序執(zhí)行過(guò)程中有可能打斷本該順序執(zhí)行的指令轉(zhuǎn)而跨層執(zhí)行其他層級(jí)指令的情況,為了說(shuō)明方便,將主循環(huán)程序作為一層,不同的中斷服務(wù)程序各自為一層。

一、現(xiàn)象描述

keil編譯器編譯code后,經(jīng)常會(huì)遇到如下warning:[*** WARNING L15:MULTIPLE CALL TO SEGMENT ],碰到此warning就是編譯器提醒開(kāi)發(fā)者,不同層級(jí)出現(xiàn)調(diào)用同一子函數(shù)的情況,或者主循環(huán)與中斷服務(wù)中都有調(diào)用,或者不同中斷服務(wù)程序中都有調(diào)用。

二、注意事項(xiàng)分析

1)全局變量有可能被非可控篡改。

同一子函數(shù)在不同層同時(shí)調(diào)用,那如果在當(dāng)前層執(zhí)行此函數(shù)時(shí)被臨時(shí)打斷跨層后同樣執(zhí)行此函數(shù),那此子函數(shù)中的變了就有可能出現(xiàn)主循環(huán)中此子函數(shù)調(diào)用的變了出現(xiàn)非需求改變。

出錯(cuò)舉例:鍵盤應(yīng)用中,主循環(huán)和中斷中都調(diào)用USB上報(bào)鍵值的子函數(shù),如下:

7acc6dda-ec0c-11ee-a297-92fbcf53809c.png

當(dāng)主循環(huán)剛好在執(zhí)行這個(gè)子函數(shù)時(shí),出現(xiàn)中斷,轉(zhuǎn)而去執(zhí)行中斷服務(wù)程序,而中斷服務(wù)程序中也執(zhí)行這個(gè)子函數(shù)的時(shí)候。buffer_addr(xdata全局指針變量)的數(shù)據(jù)就將被填充成非正常的狀態(tài),整程序運(yùn)行就會(huì)出錯(cuò)。

2)局部變量和全局變量全被非可控篡改

KEIL編譯器在順序分配局部變量地址時(shí),不同層級(jí)臨時(shí)變量分配地址不會(huì)復(fù)用,但同層級(jí)調(diào)用的子函數(shù)分配局部變量的地址時(shí)可能是相同的,舉個(gè)簡(jiǎn)單的例子

7add0a50-ec0c-11ee-a297-92fbcf53809c.png

7ae82d04-ec0c-11ee-a297-92fbcf53809c.png

如上:

delay_us()和pwm_control_led_mode1()在主循環(huán)中調(diào)用,KEIL編譯器可能將兩個(gè)函數(shù)中的臨時(shí)變量i(不局限同名)分配到同一個(gè)RAM地址中,如果子函數(shù)同層級(jí)調(diào)用時(shí)不會(huì)有問(wèn)題的,因?yàn)楹瘮?shù)都是順序執(zhí)行的。

同樣是上述兩個(gè)函數(shù),delay_us()在timer0中斷服務(wù)程序中調(diào)用, pwm_control_led_mode1()在主循環(huán)和timer0中斷服務(wù)程序中都有調(diào)用,那編譯器有可能將delay_us()和pwm_control_led_mode1()判定為同層級(jí)(中斷服務(wù)),那臨時(shí)變量i就有可能分配為同一RAM地址。

此時(shí)如果主循環(huán)在pwm_control_led_mode1()函數(shù)中執(zhí)行到i=10時(shí)timer中斷發(fā)生,程序被打斷進(jìn)入中斷服務(wù)程序,中斷執(zhí)行delay_us()函數(shù)后i=500后回到主循環(huán),因?yàn)閮蓚€(gè)子函數(shù)中臨時(shí)變量i在RAM中的地址是公用的,所以回到主循環(huán)pwm_control_led_mode1()繼續(xù)執(zhí)行時(shí),其臨時(shí)變量i的值已經(jīng)是500了,變量led_status_temp[i]可能會(huì)因?yàn)閕值溢出導(dǎo)致賦值的數(shù)據(jù)被賦值到非led_status_temp變量存儲(chǔ)驅(qū)導(dǎo)致程序中變量出錯(cuò)。

三、解決辦法建議

出現(xiàn)[*** WARNING L15:MULTIPLE CALL TO SEGMENT ]warning的時(shí)候,程序都是存在潛在風(fēng)險(xiǎn)的,最徹底的改善就是從程序架構(gòu)上避免出現(xiàn)不同層級(jí)重復(fù)調(diào)用的情況。當(dāng)然正式應(yīng)用方案中可能會(huì)因?yàn)榭臻g大小或者其他原因不得不重復(fù)調(diào)用同一子函數(shù)的情況,針對(duì)此種情況,推薦幾種規(guī)避方式,僅供讀者參考

1)執(zhí)行子函數(shù)關(guān)中斷法

程序開(kāi)發(fā)中,出現(xiàn)多層調(diào)用的情況一般就是兩種情況,一是主循環(huán)跟中斷服務(wù)程序中重復(fù)調(diào)用,另外就是不同中斷服務(wù)程序中同時(shí)調(diào)用,經(jīng)過(guò)上面分析,但凡出問(wèn)題時(shí),都是在執(zhí)行被重復(fù)調(diào)用的子函數(shù)時(shí)打斷去執(zhí)行其他層指令,要徹底解決出問(wèn)題的可能,只需在執(zhí)行低優(yōu)先級(jí)層(比如主循環(huán))同一子函數(shù)之前關(guān)中斷,執(zhí)行完此子函數(shù)后再開(kāi)中斷就可解決所以可能存在的問(wèn)題。

說(shuō)明:有一種情況雖然會(huì)這個(gè)warning,但不會(huì)出問(wèn)題,比如在不同的中斷服務(wù)程序中掉用同一個(gè)子函數(shù),但是中斷的優(yōu)先級(jí)同級(jí),也就是不存在嵌套的情況。

優(yōu)點(diǎn):簡(jiǎn)單便捷,徹底解決問(wèn)題。

缺點(diǎn):有些應(yīng)用中因?yàn)闀r(shí)序的問(wèn)題,不允許臨時(shí)關(guān)中斷。

2)子函數(shù)copy改名法

就是重復(fù)調(diào)用的子函數(shù),copy一份改一下函數(shù)名稱,分別給不同層級(jí)調(diào)用,這樣waring也會(huì)消失。

優(yōu)點(diǎn):簡(jiǎn)單,不存在臨時(shí)變量被改的情況

缺點(diǎn):仍然存在全局變量同時(shí)操作并被修改的情況,需要設(shè)計(jì)者注意是否會(huì)存在執(zhí)行此子函數(shù)時(shí)臨時(shí)中斷換層又執(zhí)行到此子函數(shù)的情況。

3)臨時(shí)變量不復(fù)用法

在開(kāi)發(fā)者確定不會(huì)存在執(zhí)行此子函數(shù)時(shí)臨時(shí)中斷換層又執(zhí)行到此子函數(shù)的情況(全局變量篡改)下,可配置KEIL編譯器,使編譯器給臨時(shí)變量分配地址時(shí),每個(gè)臨時(shí)變量占用一個(gè)地址,不復(fù)用。配置方式如下:

7af879de-ec0c-11ee-a297-92fbcf53809c.png

編譯器中嵌入這個(gè)NOOVERLAY命令,意思是臨時(shí)變量不復(fù)用RAM地址

優(yōu)點(diǎn):可簡(jiǎn)單方便解決臨時(shí)變量篡改導(dǎo)致的問(wèn)題。

缺點(diǎn):增加RAM的使用量。

說(shuō)明:如果重復(fù)調(diào)用的子函數(shù)臨時(shí)變量很少,不妨就將子函數(shù)中的臨時(shí)變量直接定義成全局變量,這樣不至于增加太多的RAM空間。

結(jié)束語(yǔ):

上述推薦的方法只是一點(diǎn)建議,必定還有很多辦法可以解決這類問(wèn)題,個(gè)人認(rèn)為最重要的是慎重處理此warning,并明確其存在的風(fēng)險(xiǎn)和內(nèi)在邏輯,至于如何解除應(yīng)用風(fēng)險(xiǎn),每個(gè)人每個(gè)方案的做法可以根據(jù)實(shí)際情況處理。



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1368

    瀏覽量

    114701
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28371

原文標(biāo)題:子函數(shù)多層調(diào)用主要事項(xiàng)

文章出處:【微信號(hào):SINO_25181447,微信公眾號(hào):中穎電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPC流程和要注意事項(xiàng)簡(jiǎn)介

    FPC流程和要注意事項(xiàng)簡(jiǎn)介 做FPC有幾年了,自己也學(xué)習(xí)和總結(jié)了一些經(jīng)驗(yàn)。想和大家交流下。先聊聊流程吧!
    發(fā)表于 03-17 10:15 ?5861次閱讀

    買電動(dòng)車需要注意什么及注意事項(xiàng)

    買電動(dòng)車需要注意什么及注意事項(xiàng) 個(gè)人將就電動(dòng)車行業(yè)的比較混亂的商標(biāo)、商號(hào)、名稱等眾多的現(xiàn)象進(jìn)行一下簡(jiǎn)單的分類,雖不敢妄
    發(fā)表于 06-27 13:31 ?3.7w次閱讀

    USB 芯片的電路及PCB 設(shè)計(jì)的重要注意事項(xiàng)

    USB 芯片的電路及PCB 設(shè)計(jì)的重要注意事項(xiàng)
    發(fā)表于 08-20 10:26

    USB 芯片的電路及PCB 設(shè)計(jì)的重要注意事項(xiàng)

    USB 芯片的電路及PCB 設(shè)計(jì)的重要注意事項(xiàng)
    發(fā)表于 08-20 11:04

    使用全局變量及調(diào)用子函數(shù)應(yīng)該注意的問(wèn)題點(diǎn)

    有沒(méi)有大神可以給一些關(guān)于Main程序調(diào)用子程序時(shí)候,需要注意的問(wèn)題點(diǎn)的~~~~蝦米自己寫了個(gè)小程序,后來(lái)想分解成Main函數(shù)和幾個(gè)子函數(shù),但是總是不能實(shí)現(xiàn)預(yù)想的功能。具體的就是有的時(shí)候
    發(fā)表于 03-06 21:22

    FPGA學(xué)習(xí)及設(shè)計(jì)中需要注意事項(xiàng)有哪些?

    想要做一名做FPGA的工程師 ,請(qǐng)問(wèn) FPGA學(xué)習(xí)及設(shè)計(jì)中需要注意事項(xiàng)有哪些?
    發(fā)表于 04-02 06:48

    膽機(jī)使用的注意事項(xiàng)

    膽機(jī)使用的注意事項(xiàng):膽機(jī)使用的注意事項(xiàng) 我是初哥, 現(xiàn)在對(duì)膽機(jī)感興趣, 但聽(tīng)說(shuō)膽機(jī)使用麻煩, 請(qǐng)問(wèn)有什么需要注意的?湖南吉首火車站 范增不必?fù)?dān)心, 膽機(jī)的使用方法
    發(fā)表于 11-29 17:09 ?46次下載

    購(gòu)買手機(jī)主要注意事項(xiàng)

    購(gòu)買手機(jī)主要注意事項(xiàng) 一、選品牌 現(xiàn)在市面上經(jīng)國(guó)家無(wú)線電管理部門核準(zhǔn)銷售的國(guó)內(nèi)、國(guó)外手機(jī)品牌、種類很多,消費(fèi)者在選擇時(shí)應(yīng)主要考慮該品牌手機(jī)生產(chǎn)商的
    發(fā)表于 12-19 10:37 ?13.4w次閱讀

    LUA腳本API函數(shù)中的回調(diào)函數(shù)使用方法和注意事項(xiàng)資料和程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是LUA腳本API函數(shù)中的回調(diào)函數(shù)使用方法和注意事項(xiàng)資料和程序免費(fèi)下載。
    發(fā)表于 10-17 08:00 ?5次下載
    LUA腳本API<b class='flag-5'>函數(shù)</b>中的回調(diào)<b class='flag-5'>函數(shù)</b>使用方法和<b class='flag-5'>注意事項(xiàng)</b>資料和程序免費(fèi)下載

    宏定義 “中斷函數(shù)接口”的注意事項(xiàng)

    宏定義“中斷函數(shù)接口”的注意事項(xiàng)
    的頭像 發(fā)表于 03-07 16:42 ?2525次閱讀

    LabVIEW中調(diào)用DLL的整個(gè)過(guò)程及注意事項(xiàng)

    LabVIEW中調(diào)用DLL的整個(gè)過(guò)程及注意事項(xiàng)說(shuō)明。
    發(fā)表于 05-25 15:10 ?116次下載

    IGBT的主要參數(shù)和注意事項(xiàng)

    簡(jiǎn)單描述了一些IGBT的主要參數(shù)和注意事項(xiàng)
    發(fā)表于 03-16 14:52 ?50次下載

    空閑任務(wù)鉤子函數(shù)詳解

    空閑任務(wù)鉤子函數(shù)詳解 1、鉤子函數(shù) FreeRTOS中有多個(gè)鉤子函數(shù),鉤子函數(shù)類似回調(diào)函數(shù),當(dāng)某個(gè)功能(
    的頭像 發(fā)表于 07-30 10:57 ?1074次閱讀
    空閑任務(wù)鉤<b class='flag-5'>子函數(shù)</b>詳解

    光纜安裝的主要注意事項(xiàng)

    光纜安裝的主要注意事項(xiàng)? 光纜安裝是建設(shè)光纖網(wǎng)絡(luò)的關(guān)鍵步驟之一,其正確安裝對(duì)于網(wǎng)絡(luò)質(zhì)量和穩(wěn)定性至關(guān)重要。下面將為大家詳細(xì)介紹光纜安裝的主要注意事項(xiàng)。 首先,光纜安裝前要進(jìn)行規(guī)劃和設(shè)計(jì)。在實(shí)施光纜安裝
    的頭像 發(fā)表于 12-27 15:02 ?832次閱讀

    多層板埋孔設(shè)計(jì)注意事項(xiàng)

    多層板埋孔設(shè)計(jì)注意事項(xiàng)
    的頭像 發(fā)表于 12-20 16:06 ?129次閱讀