一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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 ? 來源:瑞薩MCU小百科 ? 作者:瑞薩MCU小百科 ? 2023-10-16 18:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

某用戶在基于瑞薩MCU:RA6T2做開發(fā)時(shí),發(fā)現(xiàn)一個(gè)問題,MCU發(fā)出的CAN數(shù)據(jù)幀總是莫名其妙的出錯(cuò),比如應(yīng)用中明明只使用了CAN的擴(kuò)展幀,但是使用捕捉工具總是能捕捉到遠(yuǎn)程幀,出現(xiàn)遠(yuǎn)程幀的情況毫無規(guī)律可言,有時(shí)添加一個(gè)定時(shí)器中斷,該現(xiàn)象就不會(huì)出現(xiàn)了,有時(shí)修改了代碼里某處跟CAN沒有任何關(guān)系的代碼,該問題又會(huì)出現(xiàn),過了兩周時(shí)間調(diào)試無果。在介入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ù)里使用如下語句把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)程幀。

用戶又問:我沒有給dummy賦值啊,為什么dummy的第二個(gè)位會(huì)變成1呢?這就是問題所在了,就是因?yàn)樗麤]有給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,如果代碼中用戶沒有再賦值,它的值也不會(huì)變化,這樣就不會(huì)發(fā)生用戶的那個(gè)遠(yuǎn)程幀的問題了。對(duì)于沒有賦初始值的全局變量,編譯器只是分配RAM的地址,并不會(huì)修改RAM地址里的數(shù)據(jù),那么這個(gè)變量的值就會(huì)依賴于MCU啟動(dòng)時(shí)RAM里的值了。為了避免未賦值的全局變量出現(xià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)使用的變量,引入了局部變量概念。在開始執(zhí)行該函數(shù)時(shí),才從堆棧里分配地址給局部變量使用,函數(shù)執(zhí)行結(jié)束后,該變量占用的RAM區(qū)域被堆?;厥眨?dāng)下次再調(diào)用該函數(shù),再重新分配RAM。因此對(duì)于局部變量,每次申請(qǐng)到的地址是不同的,該地址很可能是其它函數(shù)使用過并改寫數(shù)據(jù)了的,因此每次函數(shù)調(diào)用時(shí)can_id.dummy的數(shù)據(jù)是不確定的。因?yàn)槎褩^(qū)里的數(shù)據(jù)是被反復(fù)利用的,即使MCU的初始化代碼對(duì)堆棧區(qū)域做清零處理,也是沒有意義的。

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

來源:瑞薩MCU小百科
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quá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ī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17981

    瀏覽量

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

    關(guān)注

    57

    文章

    2920

    瀏覽量

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

    關(guān)注

    88

    文章

    3689

    瀏覽量

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

    關(guān)注

    0

    文章

    614

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    連接器氣密檢測(cè)的重要性

    連接器氣密是電氣系統(tǒng)穩(wěn)定運(yùn)行的基石,尤其嚴(yán)苛環(huán)境下至關(guān)重要。精誠(chéng)工科作為氣密檢測(cè)領(lǐng)域深耕多年的專家,為您提供專業(yè)、高效的連接器氣密
    的頭像 發(fā)表于 03-17 11:01 ?347次閱讀
    連接器氣密<b class='flag-5'>性</b>檢測(cè)的<b class='flag-5'>重要性</b>

    ADS1298 CONFIG2讀取初始值不正常是什么原因引起的?

    你好,我從貴公司申請(qǐng)了幾片ADS1298的芯片,使用后發(fā)現(xiàn)以下問題:1。芯片ID,CONFIG2讀取初始值不正常2。前四個(gè)通道控制寄存器讀寫正常,后四個(gè)通道寄存器無法讀寫,請(qǐng)問是否出現(xiàn)過類似情況,望盡快回復(fù),謝謝
    發(fā)表于 02-13 08:02

    構(gòu)建綜合指揮調(diào)度系統(tǒng)的重要性

    構(gòu)建綜合指揮調(diào)度系統(tǒng)的重要性不言而喻,它對(duì)于提升應(yīng)急響應(yīng)速度、優(yōu)化資源配置、加強(qiáng)跨部門協(xié)作、提高決策效率和確保公共安全等方面都具有至關(guān)重要的作用。以下是古河云科技構(gòu)建綜合指揮調(diào)度系統(tǒng)重要性的幾個(gè)關(guān)鍵方面:
    的頭像 發(fā)表于 02-06 16:56 ?537次閱讀

    TLC5615芯片輸出的初始值是不是為0?

    TLC5615芯片輸出的初始值是不是為0,還有為什么我的5615芯片我給了數(shù)據(jù)進(jìn)入要么就是輸出的0V要么就是輸出的4.8或者5V
    發(fā)表于 01-20 09:25

    EE-88:使用21xx編譯器C中初始變量

    電子發(fā)燒友網(wǎng)站提供《EE-88:使用21xx編譯器C中初始變量.pdf》資料免費(fèi)下載
    發(fā)表于 01-13 15:54 ?0次下載
    EE-88:使用21xx編譯器<b class='flag-5'>在</b>C中<b class='flag-5'>初始</b>化<b class='flag-5'>變量</b>

    電橋電子測(cè)試中的重要性

    電橋電子測(cè)試中的重要性體現(xiàn)在多個(gè)方面,以下是詳細(xì)的分析: 一、精確測(cè)量電參數(shù) 電橋作為一種精密的測(cè)量工具,能夠精確測(cè)量電阻、電容、電感等電參數(shù)。
    的頭像 發(fā)表于 01-09 10:03 ?898次閱讀

    PCB板元器件點(diǎn)膠加固的重要性

    PCB板元器件點(diǎn)膠加固的重要性PCB板元器件點(diǎn)膠加固電子制造過程中起到了至關(guān)重要的作用,其重要性主要體現(xiàn)在以下幾個(gè)方面:一、提高機(jī)械強(qiáng)度點(diǎn)膠加固可以顯著降低電子元件的翹曲和變形現(xiàn)象,
    的頭像 發(fā)表于 12-20 10:18 ?1264次閱讀
    PCB板元器件點(diǎn)膠加固的<b class='flag-5'>重要性</b>

    PROM器件物聯(lián)網(wǎng)設(shè)備中的重要性

    PROM器件(Programmable Read-Only Memory,可編程只讀存儲(chǔ)器)物聯(lián)網(wǎng)(IoT)設(shè)備中扮演著至關(guān)重要的角色。以下是關(guān)于PROM器件物聯(lián)網(wǎng)設(shè)備中
    的頭像 發(fā)表于 11-23 11:35 ?727次閱讀

    ?選對(duì)波長(zhǎng)對(duì)固化時(shí)候的重要性

    的。本文將探討波長(zhǎng)選擇固化過程中的重要性,并介紹幾種常見的波長(zhǎng)及其應(yīng)用場(chǎng)景。波長(zhǎng)是光的一種特性,它決定了光的能量分布和穿透能力。固化過程中,不同波長(zhǎng)的光對(duì)材料
    的頭像 發(fā)表于 11-08 14:15 ?807次閱讀
    ?選對(duì)波長(zhǎng)對(duì)<b class='flag-5'>在</b>固化時(shí)候的<b class='flag-5'>重要性</b>

    元器件電路設(shè)計(jì)中的重要性

    元器件電路設(shè)計(jì)中的重要性是不言而喻的,它們構(gòu)成了電路的基本單元,并決定了電路的功能、性能以及可靠。以下從幾個(gè)方面詳細(xì)闡述元器件電路設(shè)計(jì)中的重要
    的頭像 發(fā)表于 10-29 16:17 ?1116次閱讀

    plc編程st語言怎么編

    控制。下面是一個(gè)基本的ST語言編程指南,包括如何開始編寫一個(gè)簡(jiǎn)單的程序。 1. 基本結(jié)構(gòu) ST程序通常包含變量聲明、函數(shù)(或過程)定義和主程序塊。 變量聲明 :程序開始處聲明所有使用
    的頭像 發(fā)表于 08-25 10:05 ?2811次閱讀

    關(guān)于蓄電池氣密檢測(cè)儀重要性和使用方法

    能源存儲(chǔ)領(lǐng)域,電池的性能和安全非常重要,氣密作為衡量其質(zhì)量的關(guān)鍵指標(biāo)之一,直接影響電池的使用壽命、性能和安全。因此,蓄電池氣密
    的頭像 發(fā)表于 08-23 15:48 ?637次閱讀
    關(guān)于蓄電池氣密<b class='flag-5'>性</b>檢測(cè)儀<b class='flag-5'>重要性</b>和使用方法

    鴻蒙原生應(yīng)用元服務(wù)開發(fā)-倉頡基本概念程序結(jié)構(gòu)

    類型一致。定義全局變量或靜態(tài)成員變量時(shí),必須指定初始值。定義局部變量或?qū)嵗蓡T
    發(fā)表于 08-13 10:57

    XC8編譯器調(diào)用函數(shù)后局域變量值被改變是哪里出了問題?

    最近發(fā)現(xiàn)個(gè)問題,有個(gè)函數(shù)里邊調(diào)用別的函數(shù)后老出錯(cuò),查找程序沒有問題,經(jīng)過仿真后發(fā)現(xiàn)在調(diào)用一個(gè)子函數(shù)后有幾個(gè)局部變量值會(huì)發(fā)生改變,再分析原因,發(fā)現(xiàn)本函數(shù)的局部變量和子函數(shù)的局部變量有地址重合的,子函數(shù)
    發(fā)表于 07-26 07:36

    IO模塊的作用及其工業(yè)生產(chǎn)中的重要性

    IO模塊,作為自動(dòng)化控制系統(tǒng)的重要組成部分,發(fā)揮著至關(guān)重要的作用。本文為您介紹IO模塊工業(yè)生產(chǎn)中的作用及其重要性
    的頭像 發(fā)表于 07-17 15:59 ?1489次閱讀