chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

在MCU編程中局部變量賦初始值的重要性

jf_pJlTbmA9 ? 來(lái)源:瑞薩MCU小百科 ? 作者:瑞薩MCU小百科 ? 2023-10-16 18:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C語(yǔ)言編程過(guò)程中,由于計(jì)算需要,會(huì)使用各種各樣的變量,用于給需要訪問(wèn)的地址取個(gè)名稱,方便編程中使用,代碼維護(hù)者也容易理解。

這里先給大家分享一個(gè)案例,讓大家意識(shí)到變量賦初始值的重要性。

某用戶在基于瑞薩MCU:RA6T2做開(kāi)發(fā)時(shí),發(fā)現(xiàn)一個(gè)問(wèn)題,MCU發(fā)出的CAN數(shù)據(jù)幀總是莫名其妙的出錯(cuò),比如應(yīng)用中明明只使用了CAN的擴(kuò)展幀,但是使用捕捉工具總是能捕捉到遠(yuǎn)程幀,出現(xiàn)遠(yuǎn)程幀的情況毫無(wú)規(guī)律可言,有時(shí)添加一個(gè)定時(shí)器中斷,該現(xiàn)象就不會(huì)出現(xiàn)了,有時(shí)修改了代碼里某處跟CAN沒(méi)有任何關(guān)系的代碼,該問(wèn)題又會(huì)出現(xiàn),過(guò)了兩周時(shí)間調(diào)試無(wú)果。在介入Debug時(shí)發(fā)現(xiàn),他使用的是CAN擴(kuò)展幀,擴(kuò)展幀使用29位ID標(biāo)識(shí)符,而且對(duì)ID區(qū)數(shù)據(jù)定義了一個(gè)如下結(jié)構(gòu)體:

wKgaomUD5XKAKA7FAAAHACC9mOU044.png

他在需要發(fā)送CAN幀時(shí),申請(qǐng)一個(gè)如上結(jié)構(gòu)體的臨時(shí)變量can_id,在把can_id.id賦值后,再把該變量的地址傳遞給CAN的發(fā)送函數(shù),在發(fā)送函數(shù)里使用如下語(yǔ)句把id的數(shù)據(jù)寫入CAN的發(fā)送消息緩沖寄存器

wKgaomUD5XOAApX2AAAHaPYEckQ954.png

如下圖,其中第30位的0表示數(shù)據(jù)幀,并不是遠(yuǎn)程幀,31位的1表示擴(kuò)展幀。

wKgZomUD5XWAca2cAADiCZqaiwY457.png

用戶是把can_id的所有數(shù)據(jù)賦值給了CFDTMID0寄存器,假如can_id.dummy中第二個(gè)位是1,會(huì)有什么后果呢?CFDTMID0.TMRTR=1,即CAN會(huì)發(fā)送遠(yuǎn)程幀。

用戶又問(wèn):我沒(méi)有給dummy賦值啊,為什么dummy的第二個(gè)位會(huì)變成1呢?這就是問(wèn)題所在了,就是因?yàn)樗麤](méi)有給can_id.dummy賦值,所以can_id.dummy有可能為任意的值。下面詳細(xì)分析一下,為什么這個(gè)局部變量的值會(huì)隨意變化。

大家知道,變量根據(jù)存儲(chǔ)類型和用途,一般可以分成:全局變量和局部變量。全局變量,就是指分配了固定地址的變量,全局變量可以在整個(gè)代碼范圍內(nèi)使用。我們?cè)谏暾?qǐng)全局變量時(shí),有時(shí)對(duì)它賦一個(gè)初始值,也時(shí)也不會(huì)賦初始值,在代碼上可能看不出有什么區(qū)別,但是編譯器在編譯程序時(shí),是區(qū)別對(duì)待他們的。對(duì)于有初始化的變量,編譯器還需要在Code Flash里(代碼存儲(chǔ)區(qū))分配一段空間,把變量的初始值全部存儲(chǔ)在該區(qū)域里,并且在MCU的啟動(dòng)代碼里插入一段程序,把這些Code Flash區(qū)的初始值拷貝到變量對(duì)應(yīng)的RAM地址中。假如上面的can_id是全局變量,并且申明變量的同時(shí)并按下圖賦初始值:

wKgaomUD5XeAaBPmAAAqgT5kmag262.jpg

這時(shí)can_id.dummy=0,如果代碼中用戶沒(méi)有再賦值,它的值也不會(huì)變化,這樣就不會(huì)發(fā)生用戶的那個(gè)遠(yuǎn)程幀的問(wèn)題了。對(duì)于沒(méi)有賦初始值的全局變量,編譯器只是分配RAM的地址,并不會(huì)修改RAM地址里的數(shù)據(jù),那么這個(gè)變量的值就會(huì)依賴于MCU啟動(dòng)時(shí)RAM里的值了。為了避免未賦值的全局變量出現(xiàn)上述的問(wèn)題,我們一般會(huì)在MCU啟動(dòng)代碼里插入未賦初始值全局變量的清零操作,相當(dāng)于做了一個(gè)未賦初始值的全局變量的初始化賦值操作。

像上面的案例,can_id申請(qǐng)的是局部變量,這又是什么情況呢?

因?yàn)镸CU的RAM資源有限,為了最大限度的利用RAM,MCU會(huì)提前分配一塊RAM區(qū)域,叫堆棧區(qū),這塊區(qū)域大家共用,對(duì)于只需要在某個(gè)函數(shù)內(nèi)使用的變量,引入了局部變量概念。在開(kāi)始執(zhí)行該函數(shù)時(shí),才從堆棧里分配地址給局部變量使用,函數(shù)執(zhí)行結(jié)束后,該變量占用的RAM區(qū)域被堆?;厥?,當(dāng)下次再調(diào)用該函數(shù),再重新分配RAM。因此對(duì)于局部變量,每次申請(qǐng)到的地址是不同的,該地址很可能是其它函數(shù)使用過(guò)并改寫數(shù)據(jù)了的,因此每次函數(shù)調(diào)用時(shí)can_id.dummy的數(shù)據(jù)是不確定的。因?yàn)槎褩^(qū)里的數(shù)據(jù)是被反復(fù)利用的,即使MCU的初始化代碼對(duì)堆棧區(qū)域做清零處理,也是沒(méi)有意義的。

由此看來(lái),局部變量在申請(qǐng)的時(shí)候賦一個(gè)初始值,是非常有必要的。雖然有時(shí)候賦初始值沒(méi)有用,但是出現(xiàn)問(wèn)題時(shí)常常是致命的,而且也是非常難以定位的,你可能覺(jué)得我的代碼里后面肯定會(huì)賦值的,但是后面維護(hù)該項(xiàng)目的其他工程師并不一定意識(shí)到這一點(diǎn)。像類似上面的案例,我在其他用戶當(dāng)中也是經(jīng)常見(jiàn)到的。因此軟件工程師在編程的時(shí)候,一定要養(yǎng)成局部變量賦初始值的習(xí)慣。

來(lái)源:瑞薩MCU小百科
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理

審核編輯 黃宇

聲明:本文內(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)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    19103

    瀏覽量

    403077
  • CAN
    CAN
    +關(guān)注

    關(guān)注

    59

    文章

    3093

    瀏覽量

    473370
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3723

    瀏覽量

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

    關(guān)注

    0

    文章

    616

    瀏覽量

    29565
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    高光譜視覺(jué)檢測(cè)中光源的重要性

    高光譜視覺(jué)檢測(cè)中光源的重要性
    的頭像 發(fā)表于 03-20 17:31 ?148次閱讀
    高光譜視覺(jué)檢測(cè)中光源的<b class='flag-5'>重要性</b>

    如何規(guī)范用、但不濫用局部變量(Local Variable)

    前面已產(chǎn)生的(讀局部變量相對(duì)安全)。 UI刷新:把計(jì)算結(jié)果分發(fā)到多個(gè)顯示控件(尤其事件結(jié)構(gòu)里,集中計(jì)算后分發(fā)顯示)。 臨時(shí)過(guò)渡:重構(gòu)舊代碼時(shí)短期使用,之后應(yīng)回到線傳遞或架構(gòu)化方式。 不建議
    發(fā)表于 02-04 08:42

    關(guān)聯(lián)使能VP時(shí)為何改變VP默認(rèn)初始值?控件關(guān)聯(lián)了使能VP變量,為何默認(rèn)不是0?

    關(guān)聯(lián)使能VP時(shí)為何改變VP默認(rèn)初始值?控件關(guān)聯(lián)了使能VP變量,為何默認(rèn)不是0?
    發(fā)表于 02-03 14:19

    堆棧的原理揭秘

    局部變量的大小,將堆棧寄存器esp的下移,即可留出對(duì)應(yīng)的空間用于存儲(chǔ)該變量。而刪除時(shí),只需要將當(dāng)前ebp的給esp【即將棧頂指針直接壓
    發(fā)表于 01-23 07:08

    傳遞、指針傳遞、引用傳遞介紹

    進(jìn)行操作,也就是說(shuō),即使形參的發(fā)生改變,實(shí)參的也完全不受影響。   2、指針傳遞:指針傳遞其實(shí)是傳遞的一種,它傳遞的是地址。傳遞過(guò)程中,被調(diào)函數(shù)的形參作為被調(diào)函數(shù)的
    發(fā)表于 01-21 06:48

    工業(yè)配電系統(tǒng)中局部放電在線監(jiān)測(cè)技術(shù)的應(yīng)用研究

    摘要 隨著工業(yè)用電規(guī)模的持續(xù)擴(kuò)大,中壓配電系統(tǒng)保障企業(yè)連續(xù)生產(chǎn)中的重要性日益凸顯。開(kāi)關(guān)柜作為工業(yè)配電系統(tǒng)的關(guān)鍵節(jié)點(diǎn),其內(nèi)部絕緣狀態(tài)直接影響供電安全與運(yùn)行可靠。局部放電作為絕緣劣化的
    的頭像 發(fā)表于 01-14 10:28 ?271次閱讀
    工業(yè)配電系統(tǒng)<b class='flag-5'>中局部</b>放電在線監(jiān)測(cè)技術(shù)的應(yīng)用研究

    C語(yǔ)言編程-局部性原理

    使用的磁盤塊。 應(yīng)用程序 局部性原理應(yīng)用程序的設(shè)計(jì)中也扮演著重要角色。例如,Web瀏覽器將最近被引用的文檔放在本地磁盤上。 對(duì)程序數(shù)據(jù)引用的局部性通過(guò)舉例來(lái)說(shuō)明程序的
    發(fā)表于 01-07 06:01

    嵌入式C語(yǔ)言中各變量存儲(chǔ)位置

    局部變量局部靜態(tài)變量、全局變量、全局靜態(tài)變量區(qū)別如下: 局部變量: 棧區(qū);
    發(fā)表于 12-25 07:54

    C語(yǔ)言全局變量重點(diǎn)使用

    重要的循環(huán)中我們不建議使用全局變量。 如果函數(shù)過(guò)多的使用全局變量,比較好的做法是拷貝全局變量局部
    發(fā)表于 12-12 06:58

    智能顯示模塊怎么顯示工程中給寄存器設(shè)置初始值?我想給變量一個(gè)上電的默認(rèn)該如何設(shè)置?

    智能顯示模塊怎么顯示工程中給寄存器設(shè)置初始值?我想給變量一個(gè)上電的默認(rèn)該如何設(shè)置?
    發(fā)表于 12-11 09:54

    第7章 變量進(jìn)階與點(diǎn)陣LED(7.1 7.2)

    知識(shí)——變量的作用域和存儲(chǔ)類別。 7.1變量的作用域 所謂的作用域就是指變量起作用的范圍,也是變量的有效范圍。變量按他的作用域可以分為
    的頭像 發(fā)表于 12-10 16:25 ?481次閱讀

    智能顯示模塊怎么顯示工程中給寄存器設(shè)置初始值?我想給變量一個(gè)上電的默認(rèn)該如何設(shè)置?

    智能顯示模塊怎么顯示工程中給寄存器設(shè)置初始值?我想給變量一個(gè)上電的默認(rèn)該如何設(shè)置?
    發(fā)表于 12-06 10:20

    常用變量的介紹

    extern:用在全局變量上表示該變量在其他文件中已經(jīng)定義;用在函數(shù)上作用同全局變量; static:用在全局變量上,和非靜態(tài)全局變量相比,
    發(fā)表于 11-21 07:05

    C語(yǔ)言開(kāi)發(fā)單片機(jī)為什么大多數(shù)都采用全局變量的形式?

    單片機(jī)的芯片資源從來(lái)都是 “精打細(xì)算” 的級(jí)別,CPU 主頻普遍不高,RAM 總?cè)萘勘揪途o張,分給??臻g的更是少得可憐。要是像普通軟件那樣,依賴函數(shù)返回傳遞數(shù)據(jù)、頻繁用局部變量周轉(zhuǎn),一來(lái)二去占用
    的頭像 發(fā)表于 11-12 14:29 ?540次閱讀
    C語(yǔ)言開(kāi)發(fā)單片機(jī)為什么大多數(shù)都采用全局<b class='flag-5'>變量</b>的形式?

    按照芯來(lái)文檔設(shè)置可以通過(guò)segger IDE debug了,但是沒(méi)法看全局或者局部變量值,怎么解決?

    如題,按照芯來(lái)文檔設(shè)置可以通過(guò)segger IDE debug了,但是沒(méi)法看全局或者局部變量值,很麻煩。有遇到過(guò)解決了的嗎?
    發(fā)表于 10-20 09:20