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

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

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

3天內不再提示

結構體成員初始化不完整從而受到棧污染導致奇怪bug

冬至子 ? 來源:吾愛單片機 ? 作者:echigh ? 2023-05-25 11:11 ? 次閱讀

1.原因源于大家平時對網上大量不規范的例程的拷貝使用

2.比如在配置定時器輸出pwm時候,一般網上抄的例程如下:

//4、初始化輸出比較模式、配置輸出比較模式的結構體參數
  TIM_OCStructInit(&TIM_OCInitStruct);//配置輸出比較結構體的參數

  TIM_OCInitStruct.TIM_Pulse=50; //配置CCR寄存器,控制占空比
  TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; //配置輸出比較模式
  TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//控制輸出的極性
  TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//輸出使能
  TIM_OC1Init(TIM2,&TIM_OCInitStruct);

這里是有問題的,因為結構體TIM_OCInitStruct的成員不止這幾個,如果不寫全,那其他幾個的值是棧里面的數據,棧數據是之前的函數執行后留下的,這樣其他幾個沒寫出來的成員就成了棧污染的受害者了。此時如果就這么初始化了,有時候會出現奇怪的BUG:比如通道關閉后IO仍然維持高電平。

3.正確的做法, 寫全所有的結構體成員

//初始化TIM8 Channel3 PWM模式
  /*
  在PWM模式(模式1或模式2)下, TIMx_CNT和TIMx_CCRx始終在進行比較, 
  (依據計數器的計數方向)以確 定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。
  */
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable; //所有成員初始化,否則數據不確定
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High; //所有成員初始化,否則數據不確定
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; //所有成員初始化,否則數據不確定
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式1
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
//  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性高
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //輸出空閑狀態是互補輸出和死區插入那一節里面的知識,這里沒影響
  TIM_OCInitStructure.TIM_Pulse=0;
  TIM_OC1Init(TIM8, &TIM_OCInitStructure);  //根據指定的參數初始化外設TIM8 OC3
  TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1預裝載使能,預裝載值在更新事件到來時被加載至當前寄存器中

4.辯論:

1)不明寫,編譯器也會給局部變量賦為0

答:

(1)或許有的編譯器會將未幅值的局部變量賦0,但不能保證每個編譯器都這么做。總之未幅值其值是不確定的(很容易驗證:搞兩個函數執行打印一下實測出來)

(2)在單片機程序里面,沒寫的寄存器不等于就是要賦0,所以即使編譯器幫忙賦0了,也是不對的

2)可以用類似stm32單片機庫函數中的deinit規避棧污染

答:

deinit只是將寄存器的值恢復到默認,不能清棧數據。

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

    關注

    31

    文章

    5383

    瀏覽量

    121428
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5204

    瀏覽量

    215186
  • 定時器
    +關注

    關注

    23

    文章

    3257

    瀏覽量

    115564
  • STM32單片機
    +關注

    關注

    59

    文章

    549

    瀏覽量

    58864
收藏 人收藏

    評論

    相關推薦

    esp32調試MQTT的程序,如何對.host初始化

    esp_mqtt_client_config_t mqtt_cfg這個結構的時候,你們例程里面只初始化url,但是我在網上看到很多地方的參考程序都是初始化這些
    發表于 06-11 07:55

    QT解決串口數據接收不完整問題

    1. 相關文章匯總(1)QT解決串口數據接收不完整問題(貌似貼出的代碼可以存下串口接受的全部數據)(2)qt中使用串口類接收數據不完整 (3)Qt5.7串口接收數據不完整因為串口本來就不是一次接收
    發表于 08-18 06:58

    【原創分享】變量的初始化技巧

    ,第二種使用對結構成員變量賦值的方式。實質上,第1種方式編譯器將自動生成一些指令完成變量a的初始化,而第2種方式編譯器在處理Score a語句的時候只需要開辟
    發表于 09-08 15:28

    Keil使用結構數組的奇怪問題相關資料下載

    今天用keil的時候發現一個很奇怪的點,是關于結構數組的。首先說明我的keil版本是:V5.28.0.0問題是這樣的:我在a.h文件定義了一個結構
    發表于 11-30 06:47

    stm32 printf打印出錯導致信息不完整怎么解決?

    stm32 printf打印出錯導致信息不完整怎么解決?
    發表于 12-02 08:02

    怎樣去解決stm32串口DMA數據接收不完整的問題呢

    stm32串口DMA數據接收不完整問題說明最近做了一個項目需要用串口來接收模塊端的應答數據,由于使用了實時操作系統,考慮中斷嵌套或被打斷的問題導致數據接收不完整的問題,使用串口dma接收數據,但
    發表于 02-21 06:19

    USART初始化結構詳解

    USART 初始化結構詳解標準庫函數對每個外設都建立了一個初始化結構,比如USART_Ini
    發表于 02-22 06:08

    結構數組的初始化

    char i; TEST data1[5] = {{1,2},{3,4},{5,6},{7,8},{9,10}};//經常使用的初始化方式TEST data2[5] ={0};//初始全為0,否則
    發表于 05-21 15:24

    FAQ0066結構成員未完全初始化導致程序異常的解決方法

    使用非官方程序,由于某些外設驅動在配置結構時,未完全初始化所有成員導致程序運行異常。以 FSMC 為例,FSMC_NORSRAMInit
    發表于 10-20 06:59

    結構的定義、初始化和賦值

    type)的一類。結構可以被聲明為變量、指針或數組等,用以實現較復雜的數據結構結構同時也是一些元素的集合,這些元素稱為
    發表于 11-20 09:29 ?5.5w次閱讀

    在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決

    本文檔的主要內容詳細介紹的是在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決。
    發表于 08-20 17:31 ?0次下載
    在51平臺下<b class='flag-5'>初始化</b>文件的引入<b class='flag-5'>導致</b>全局變量無法<b class='flag-5'>初始化</b>的問題如何解決

    Keil使用結構數組的奇怪問題

    今天用keil的時候發現一個很奇怪的點,是關于結構數組的。首先說明我的keil版本是:V5.28.0.0問題是這樣的:我在a.h文件定義了一個結構
    發表于 11-21 16:36 ?3次下載
    Keil使用<b class='flag-5'>結構</b><b class='flag-5'>體</b>數組的<b class='flag-5'>奇怪</b>問題

    stm32串口DMA數據接收不完整問題說明

    stm32串口DMA數據接收不完整問題說明最近做了一個項目需要用串口來接收模塊端的應答數據,由于使用了實時操作系統,考慮中斷嵌套或被打斷的問題導致數據接收不完整的問題,使用串口dma接收數據,但
    發表于 12-24 19:37 ?22次下載
    stm32串口DMA數據接收<b class='flag-5'>不完整</b>問題說明

    淺談C語言中的三種不完整類型

    不完整類型(Incomplete types)是缺少足夠信息來確定該類型對象大小的對象類型,不完整類型可以在翻譯單元的某些點完整
    發表于 12-16 09:52 ?541次閱讀

    如何獲取ChatGPT回答不完整的內容

    ____tz_zs 對于 ChatGPT 回答不完整的情況(篇幅限制,沒有說完),可以輸入“繼續”指令,讓其繼續回答下去,獲得完整內容。 如下圖,發問 “使用web3js 調用 eth鏈智能合約” 直到這里才是獲得了剛剛問題 “使用web3js 調用 eth鏈智能合約”
    發表于 02-10 10:48 ?0次下載
    如何獲取ChatGPT回答<b class='flag-5'>不完整</b>的內容
    主站蜘蛛池模板: 操操操综合 | 无遮挡很污很爽很黄的网站 | 色屋在线| 99在线热播精品免费 | 4455亚洲| 羞羞答答xxdd影院欧美 | 美女午夜| 亚洲天堂手机在线 | 久久久午夜 | 三级毛片在线免费观看 | 毛色毛片免费观看 | 国产乱码免费卡1卡二卡3卡四 | 一级特黄特黄的大片免费 | 不卡精品国产_亚洲人成在线 | 亚洲视频一二三 | 中国一级特黄真人毛片免费看 | 日本在线视频一区二区 | 麻豆国产一区二区在线观看 | jlzzjlzz欧美大全 | 男人日女人免费视频 | 日本免费一区二区在线观看 | 51精品视频免费国产专区 | 午夜影视啪啪免费体验区入口 | 国产成人亚洲影视在线 | 97伊人久久 | 毛片一区二区三区 | 亚洲国产精品国产自在在线 | 美女扒开内裤让男人桶 | 欧美a在线| 美女自熨出白浆视频在线播放 | 99久久精品费精品国产一区二区 | 五月天免费在线播放 | 特黄色毛片 | 黄色激情小说视频 | 成年人www| 日本欧美视频 | 视色4se在线视频播放 | 亚洲福利秒拍一区二区 | 国产精品欧美一区二区三区不卡 | 色婷婷一区二区三区四区成人 | 性做久久久久久久免费观看 |