在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

中穎電子 ? 來源:中穎電子 ? 2024-03-27 15:36 ? 次閱讀

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

一、現(xiàn)象描述

keil編譯器編譯code后,經(jīng)常會遇到如下warning:[*** WARNING L15:MULTIPLE CALL TO SEGMENT ],碰到此warning就是編譯器提醒開發(fā)者,不同層級出現(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)行就會出錯(cuò)。

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

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

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ù)同層級調(diào)用時(shí)不會有問題的,因?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()判定為同層級(中斷服務(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]可能會因?yàn)閕值溢出導(dǎo)致賦值的數(shù)據(jù)被賦值到非led_status_temp變量存儲驅(qū)導(dǎo)致程序中變量出錯(cuò)。

三、解決辦法建議

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

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

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

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

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

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

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

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

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

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

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

在開發(fā)者確定不會存在執(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):可簡單方便解決臨時(shí)變量篡改導(dǎo)致的問題。

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

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

結(jié)束語:

上述推薦的方法只是一點(diǎ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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1368

    瀏覽量

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

    關(guān)注

    0

    文章

    613

    瀏覽量

    28368

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

    買電動車需要注意什么及注意事項(xiàng) 個(gè)人將就電動車行業(yè)的比較混亂的商標(biāo)、商號、名稱等眾多的現(xiàn)象進(jì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)該注意的問題點(diǎn)

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

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

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

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

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

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

    購買手機(jī)主要注意事項(xiàng) 一、選品牌 現(xiàn)在市面上經(jīng)國家無線電管理部門核準(zhǔn)銷售的國內(nèi)、國外手機(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 ?2521次閱讀

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

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

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

    簡單描述了一些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 ?1071次閱讀
    空閑任務(wù)鉤<b class='flag-5'>子函數(shù)</b>詳解

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

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

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

    多層板埋孔設(shè)計(jì)注意事項(xiàng)
    的頭像 發(fā)表于 12-20 16:06 ?127次閱讀
    主站蜘蛛池模板: 国产一区二区三区免费大片天美 | 色噜噜狠狠狠色综合久 | 免费毛片网站在线观看 | 亚洲国产成人在人网站天堂 | 韩国电影天堂 | 久久亚洲国产午夜精品理论片 | 日本妈妈4 | 国产在线一区视频 | 最新地址四虎www4hutv | wwwwwww色| 最好看的最新中文字幕2018免费视频 | 丁香五香天堂网卡 | 免费黄视频在线观看 | 人人艹在线视频 | 亚洲码欧美码一区二区三区 | 1024 cc香蕉在线观看看中文 | 国产精品久久久久久久久免费观看 | 亚洲精品综合网在线8050影院 | 九九九国产在线 | 日韩毛片在线 | 特黄特色的大片观看免费视频 | aa小视频| 日本一区二区精品88 | 天天干天天操天天爱 | 最近高清在线国语 | 亚洲成人网在线 | 久久综合欧美成人 | a毛片基地免费全部香蕉 | 中文字幕第五页 | 国产视频黄 | 色老头·com 色老头成人免费综合视频 色老头久久久久 | 亚洲成网站www久久九 | 欧美一级特黄aaaaaaa在线观看 | 白嫩少妇激情无码 | 亚洲精品91香蕉综合区 | 天天操夜夜爽 | 免费高清在线视频色yeye | 欧美黄色大片免费观看 | 黄色美女网站免费看 | 求网址你懂的手机在线观看网站 | 亚洲综合色网站 |