国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

某用戶在基于瑞薩MCU:RA6T2做開發時,發現一個問題,MCU發出的CAN數據幀總是莫名其妙的出錯,比如應用中明明只使用了CAN的擴展幀,但是使用捕捉工具總是能捕捉到遠程幀,出現遠程幀的情況毫無規律可言,有時添加一個定時器中斷,該現象就不會出現了,有時修改了代碼里某處跟CAN沒有任何關系的代碼,該問題又會出現,過了兩周時間調試無果。在介入Debug時發現,他使用的是CAN擴展幀,擴展幀使用29位ID標識符,而且對ID區數據定義了一個如下結構體:

wKgaomUD5XKAKA7FAAAHACC9mOU044.png

他在需要發送CAN幀時,申請一個如上結構體的臨時變量can_id,在把can_id.id賦值后,再把該變量的地址傳遞給CAN的發送函數,在發送函數里使用如下語句把id的數據寫入CAN的發送消息緩沖寄存器

wKgaomUD5XOAApX2AAAHaPYEckQ954.png

如下圖,其中第30位的0表示數據幀,并不是遠程幀,31位的1表示擴展幀。

wKgZomUD5XWAca2cAADiCZqaiwY457.png

用戶是把can_id的所有數據賦值給了CFDTMID0寄存器,假如can_id.dummy中第二個位是1,會有什么后果呢?CFDTMID0.TMRTR=1,即CAN會發送遠程幀。

用戶又問:我沒有給dummy賦值啊,為什么dummy的第二個位會變成1呢?這就是問題所在了,就是因為他沒有給can_id.dummy賦值,所以can_id.dummy有可能為任意的值。下面詳細分析一下,為什么這個局部變量的值會隨意變化。

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

wKgaomUD5XeAaBPmAAAqgT5kmag262.jpg

這時can_id.dummy=0,如果代碼中用戶沒有再賦值,它的值也不會變化,這樣就不會發生用戶的那個遠程幀的問題了。對于沒有賦初始值的全局變量,編譯器只是分配RAM的地址,并不會修改RAM地址里的數據,那么這個變量的值就會依賴于MCU啟動時RAM里的值了。為了避免未賦值的全局變量出現上述的問題,我們一般會在MCU啟動代碼里插入未賦初始值全局變量的清零操作,相當于做了一個未賦初始值的全局變量的初始化賦值操作。

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

因為MCU的RAM資源有限,為了最大限度的利用RAM,MCU會提前分配一塊RAM區域,叫堆棧區,這塊區域大家共用,對于只需要在某個函數內使用的變量,引入了局部變量概念。在開始執行該函數時,才從堆棧里分配地址給局部變量使用,函數執行結束后,該變量占用的RAM區域被堆棧回收,當下次再調用該函數,再重新分配RAM。因此對于局部變量,每次申請到的地址是不同的,該地址很可能是其它函數使用過并改寫數據了的,因此每次函數調用時can_id.dummy的數據是不確定的。因為堆棧區里的數據是被反復利用的,即使MCU的初始化代碼對堆棧區域做清零處理,也是沒有意義的。

由此看來,局部變量在申請的時候賦一個初始值,是非常有必要的。雖然有時候賦初始值沒有用,但是出現問題時常常是致命的,而且也是非常難以定位的,你可能覺得我的代碼里后面肯定會賦值的,但是后面維護該項目的其他工程師并不一定意識到這一點。像類似上面的案例,我在其他用戶當中也是經常見到的。因此軟件工程師在編程的時候,一定要養成局部變量賦初始值的習慣。

來源:瑞薩MCU小百科
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    147

    文章

    18924

    瀏覽量

    398070
  • CAN
    CAN
    +關注

    關注

    59

    文章

    3067

    瀏覽量

    472741
  • 編程
    +關注

    關注

    90

    文章

    3716

    瀏覽量

    97184
  • 變量
    +關注

    關注

    0

    文章

    616

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

    前面已產生的(讀局部變量相對安全)。 UI刷新:把計算結果分發到多個顯示控件(尤其事件結構里,集中計算后分發顯示)。 臨時過渡:重構舊代碼時短期使用,之后應回到線傳遞或架構化方式。 不建議
    發表于 02-04 08:42

    關聯使能VP時為何改變VP默認初始值?控件關聯了使能VP變量,為何默認不是0?

    關聯使能VP時為何改變VP默認初始值?控件關聯了使能VP變量,為何默認不是0?
    發表于 02-03 14:19

    堆棧的原理揭秘

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

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

    進行操作,也就是說,即使形參的發生改變,實參的也完全不受影響。   2、指針傳遞:指針傳遞其實是傳遞的一種,它傳遞的是地址。傳遞過程中,被調函數的形參作為被調函數的
    發表于 01-21 06:48

    工業配電系統中局部放電在線監測技術的應用研究

    摘要 隨著工業用電規模的持續擴大,中壓配電系統保障企業連續生產中的重要性日益凸顯。開關柜作為工業配電系統的關鍵節點,其內部絕緣狀態直接影響供電安全與運行可靠局部放電作為絕緣劣化的
    的頭像 發表于 01-14 10:28 ?172次閱讀
    工業配電系統<b class='flag-5'>中局部</b>放電在線監測技術的應用研究

    C語言編程-局部性原理

    使用的磁盤塊。 應用程序 局部性原理應用程序的設計中也扮演著重要角色。例如,Web瀏覽器將最近被引用的文檔放在本地磁盤上。 對程序數據引用的局部性通過舉例來說明程序的
    發表于 01-07 06:01

    嵌入式C語言中各變量存儲位置

    局部變量局部靜態變量、全局變量、全局靜態變量區別如下: 局部變量: 棧區;
    發表于 12-25 07:54

    C語言全局變量重點使用

    重要的循環中我們不建議使用全局變量。 如果函數過多的使用全局變量,比較好的做法是拷貝全局變量局部
    發表于 12-12 06:58

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

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

    第7章 變量進階與點陣LED(7.1 7.2)

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

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

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

    常用變量的介紹

    extern:用在全局變量上表示該變量在其他文件中已經定義;用在函數上作用同全局變量; static:用在全局變量上,和非靜態全局變量相比,
    發表于 11-21 07:05

    C語言開發單片機為什么大多數都采用全局變量的形式?

    單片機的芯片資源從來都是 “精打細算” 的級別,CPU 主頻普遍不高,RAM 總容量本就緊張,分給棧空間的更是少得可憐。要是像普通軟件那樣,依賴函數返回傳遞數據、頻繁用局部變量周轉,一來二去占用
    的頭像 發表于 11-12 14:29 ?424次閱讀
    C語言開發單片機為什么大多數都采用全局<b class='flag-5'>變量</b>的形式?

    按照芯來文檔設置可以通過segger IDE debug了,但是沒法看全局或者局部變量值,怎么解決?

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

    連接器氣密檢測的重要性

    連接器氣密是電氣系統穩定運行的基石,尤其嚴苛環境下至關重要。精誠工科作為氣密檢測領域深耕多年的專家,為您提供專業、高效的連接器氣密
    的頭像 發表于 03-17 11:01 ?827次閱讀
    連接器氣密<b class='flag-5'>性</b>檢測的<b class='flag-5'>重要性</b>