91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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
    +關注

    關注

    146

    文章

    18027

    瀏覽量

    368963
  • CAN
    CAN
    +關注

    關注

    57

    文章

    2922

    瀏覽量

    468437
  • 編程
    +關注

    關注

    88

    文章

    3689

    瀏覽量

    95385
  • 變量
    +關注

    關注

    0

    文章

    614

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    分享原子鐘科研領域的重要性

    ,以其無與倫比的精度和穩定性,成為了科研領域的核心設備之一。本文將深入探討原子鐘科研領域的重要性,揭示其如何推動科學技術的進步。1.天文學與宇宙研究天文學領域,
    的頭像 發表于 05-15 15:55 ?209次閱讀
    分享原子鐘<b class='flag-5'>在</b>科研領域的<b class='flag-5'>重要性</b>

    連接器氣密檢測的重要性

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

    PCB拼板設計全解析:重要性、優勢與應用實踐

    一站式PCBA智造廠家今天為大家講講PCB拼板設計的重要性表現哪些方面?PCB拼板設計的基本概念及其重要性。電子制造行業,SMT貼片工藝中,PCB拼板設計是一項極為關鍵的步驟。通過優化PCB拼板
    的頭像 發表于 03-13 09:35 ?604次閱讀
    PCB拼板設計全解析:<b class='flag-5'>重要性</b>、優勢與應用實踐

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

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

    構建綜合指揮調度系統的重要性

    構建綜合指揮調度系統的重要性不言而喻,它對于提升應急響應速度、優化資源配置、加強跨部門協作、提高決策效率和確保公共安全等方面都具有至關重要的作用。以下是古河云科技構建綜合指揮調度系統重要性的幾個關鍵方面:
    的頭像 發表于 02-06 16:56 ?576次閱讀

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

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

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

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

    電橋電子測試中的重要性

    電橋電子測試中的重要性體現在多個方面,以下是詳細的分析: 一、精確測量電參數 電橋作為一種精密的測量工具,能夠精確測量電阻、電容、電感等電參數。
    的頭像 發表于 01-09 10:03 ?955次閱讀

    PCB板元器件點膠加固的重要性

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

    PROM器件物聯網設備中的重要性

    PROM器件(Programmable Read-Only Memory,可編程只讀存儲器)物聯網(IoT)設備中扮演著至關重要的角色。以下是關于PROM器件物聯網設備中
    的頭像 發表于 11-23 11:35 ?760次閱讀

    ?選對波長對固化時候的重要性

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

    元器件電路設計中的重要性

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

    plc編程st語言怎么編

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

    關于蓄電池氣密檢測儀重要性和使用方法

    能源存儲領域,電池的性能和安全非常重要,氣密作為衡量其質量的關鍵指標之一,直接影響電池的使用壽命、性能和安全。因此,蓄電池氣密
    的頭像 發表于 08-23 15:48 ?670次閱讀
    關于蓄電池氣密<b class='flag-5'>性</b>檢測儀<b class='flag-5'>重要性</b>和使用方法

    鴻蒙原生應用元服務開發-倉頡基本概念程序結構

    類型一致。定義全局變量或靜態成員變量時,必須指定初始值。定義局部變量或實例成員
    發表于 08-13 10:57
    主站蜘蛛池模板: 色综合网天天综合色中文男男 | 天堂网www在线资源链接 | 性欧美大胆高清视频 | 欧美一区二区三区性 | 狠狠色噜噜狠狠狠狠97影音先锋 | 亚洲国产欧美在线成人aaaa | 国产成年网站v片在线观看 国产成人91青青草原精品 | 成人黄色免费观看 | 一区二区三区视频 | 天天躁夜夜躁狠狠躁躁88 | 婷婷五月天.com | 糖心vlog麻豆精东影业传媒 | 欧美日韩a级a| h网站在线播放 | 午夜亚洲国产 | 特级免费毛片 | 中日韩免费视频 | 最新午夜宅男 | 免费福利在线播放 | 一区国产传媒国产精品 | 色网站免费视频 | 成人av电影在线 | 日色视频 | 天天怕夜夜怕狠狠怕 | 欧美αv日韩αv另类综合 | 国内久久精品 | 国产小片 | 亚洲美女视频在线观看 | 久久15| 麻豆美女大尺度啪啪 | 人人做人人澡人人人爽 | 四虎影院精品在线观看 | 伊人一区二区三区 | 亚洲wwww| 好吊色37pao在线观看 | 在线高清国产 | 中文字幕欧美成人免费 | 中文天堂在线观看 | 天堂新版www中文 | 一本在线免费视频 | 视频亚洲一区 |