色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

結(jié)構(gòu)體成員初始化不完整從而受到棧污染導(dǎo)致奇怪bug

冬至子 ? 來(lái)源:吾愛(ài)單片機(jī) ? 作者:echigh ? 2023-05-25 11:11 ? 次閱讀

1.原因源于大家平時(shí)對(duì)網(wǎng)上大量不規(guī)范的例程的拷貝使用

2.比如在配置定時(shí)器輸出pwm時(shí)候,一般網(wǎng)上抄的例程如下:

//4、初始化輸出比較模式、配置輸出比較模式的結(jié)構(gòu)體參數(shù)
  TIM_OCStructInit(&TIM_OCInitStruct);//配置輸出比較結(jié)構(gòu)體的參數(shù)

  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);

這里是有問(wèn)題的,因?yàn)榻Y(jié)構(gòu)體TIM_OCInitStruct的成員不止這幾個(gè),如果不寫全,那其他幾個(gè)的值是棧里面的數(shù)據(jù),棧數(shù)據(jù)是之前的函數(shù)執(zhí)行后留下的,這樣其他幾個(gè)沒(méi)寫出來(lái)的成員就成了棧污染的受害者了。此時(shí)如果就這么初始化了,有時(shí)候會(huì)出現(xiàn)奇怪的BUG:比如通道關(guān)閉后IO仍然維持高電平。

3.正確的做法, 寫全所有的結(jié)構(gòu)體成員

//初始化TIM8 Channel3 PWM模式
  /*
  在PWM模式(模式1或模式2)下, TIMx_CNT和TIMx_CCRx始終在進(jìn)行比較, 
  (依據(jù)計(jì)數(shù)器的計(jì)數(shù)方向)以確 定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。
  */
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable; //所有成員初始化,否則數(shù)據(jù)不確定
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High; //所有成員初始化,否則數(shù)據(jù)不確定
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; //所有成員初始化,否則數(shù)據(jù)不確定
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式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; //輸出空閑狀態(tài)是互補(bǔ)輸出和死區(qū)插入那一節(jié)里面的知識(shí),這里沒(méi)影響
  TIM_OCInitStructure.TIM_Pulse=0;
  TIM_OC1Init(TIM8, &TIM_OCInitStructure);  //根據(jù)指定的參數(shù)初始化外設(shè)TIM8 OC3
  TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1預(yù)裝載使能,預(yù)裝載值在更新事件到來(lái)時(shí)被加載至當(dāng)前寄存器中

4.辯論:

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

答:

(1)或許有的編譯器會(huì)將未幅值的局部變量賦0,但不能保證每個(gè)編譯器都這么做。總之未幅值其值是不確定的(很容易驗(yàn)證:搞兩個(gè)函數(shù)執(zhí)行打印一下實(shí)測(cè)出來(lái))

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

2)可以用類似stm32單片機(jī)庫(kù)函數(shù)中的deinit規(guī)避棧污染

答:

deinit只是將寄存器的值恢復(fù)到默認(rèn),不能清棧數(shù)據(jù)。

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

    關(guān)注

    31

    文章

    5363

    瀏覽量

    120918
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5196

    瀏覽量

    214522
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3255

    瀏覽量

    115158
  • STM32單片機(jī)
    +關(guān)注

    關(guān)注

    59

    文章

    549

    瀏覽量

    58760
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    esp32調(diào)試MQTT的程序,如何對(duì).host初始化?

    esp_mqtt_client_config_t mqtt_cfg這個(gè)結(jié)構(gòu)的時(shí)候,你們例程里面只初始化url,但是我在網(wǎng)上看到很多地方的參考程序都是初始化這些
    發(fā)表于 06-11 07:55

    QT解決串口數(shù)據(jù)接收不完整問(wèn)題

    1. 相關(guān)文章匯總(1)QT解決串口數(shù)據(jù)接收不完整問(wèn)題(貌似貼出的代碼可以存下串口接受的全部數(shù)據(jù))(2)qt中使用串口類接收數(shù)據(jù)不完整 (3)Qt5.7串口接收數(shù)據(jù)不完整因?yàn)榇诒緛?lái)就不是一次接收
    發(fā)表于 08-18 06:58

    【原創(chuàng)分享】變量的初始化技巧

    ,第二種使用對(duì)結(jié)構(gòu)成員變量賦值的方式。實(shí)質(zhì)上,第1種方式編譯器將自動(dòng)生成一些指令完成變量a的初始化,而第2種方式編譯器在處理Score a語(yǔ)句的時(shí)候只需要開(kāi)辟
    發(fā)表于 09-08 15:28

    Keil使用結(jié)構(gòu)數(shù)組的奇怪問(wèn)題相關(guān)資料下載

    今天用keil的時(shí)候發(fā)現(xiàn)一個(gè)很奇怪的點(diǎn),是關(guān)于結(jié)構(gòu)數(shù)組的。首先說(shuō)明我的keil版本是:V5.28.0.0問(wèn)題是這樣的:我在a.h文件定義了一個(gè)結(jié)構(gòu)
    發(fā)表于 11-30 06:47

    stm32 printf打印出錯(cuò)導(dǎo)致信息不完整怎么解決?

    stm32 printf打印出錯(cuò)導(dǎo)致信息不完整怎么解決?
    發(fā)表于 12-02 08:02

    怎樣去解決stm32串口DMA數(shù)據(jù)接收不完整的問(wèn)題呢

    stm32串口DMA數(shù)據(jù)接收不完整問(wèn)題說(shuō)明最近做了一個(gè)項(xiàng)目需要用串口來(lái)接收模塊端的應(yīng)答數(shù)據(jù),由于使用了實(shí)時(shí)操作系統(tǒng),考慮中斷嵌套或被打斷的問(wèn)題導(dǎo)致數(shù)據(jù)接收不完整的問(wèn)題,使用串口dma接收數(shù)據(jù),但
    發(fā)表于 02-21 06:19

    USART初始化結(jié)構(gòu)詳解

    USART 初始化結(jié)構(gòu)詳解標(biāo)準(zhǔn)庫(kù)函數(shù)對(duì)每個(gè)外設(shè)都建立了一個(gè)初始化結(jié)構(gòu),比如USART_Ini
    發(fā)表于 02-22 06:08

    結(jié)構(gòu)數(shù)組的初始化

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

    FAQ0066結(jié)構(gòu)成員未完全初始化導(dǎo)致程序異常的解決方法

    使用非官方程序,由于某些外設(shè)驅(qū)動(dòng)在配置結(jié)構(gòu)時(shí),未完全初始化所有成員,導(dǎo)致程序運(yùn)行異常。以 FSMC 為例,F(xiàn)SMC_NORSRAMInit
    發(fā)表于 10-20 06:59

    結(jié)構(gòu)的定義、初始化和賦值

    type)的一類。結(jié)構(gòu)可以被聲明為變量、指針或數(shù)組等,用以實(shí)現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)同時(shí)也是一些元素的集合,這些元素稱為
    發(fā)表于 11-20 09:29 ?5.5w次閱讀

    在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無(wú)法初始化的問(wèn)題如何解決

    本文檔的主要內(nèi)容詳細(xì)介紹的是在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無(wú)法初始化的問(wèn)題如何解決。
    發(fā)表于 08-20 17:31 ?0次下載
    在51平臺(tái)下<b class='flag-5'>初始化</b>文件的引入<b class='flag-5'>導(dǎo)致</b>全局變量無(wú)法<b class='flag-5'>初始化</b>的問(wèn)題如何解決

    Keil使用結(jié)構(gòu)數(shù)組的奇怪問(wèn)題

    今天用keil的時(shí)候發(fā)現(xiàn)一個(gè)很奇怪的點(diǎn),是關(guān)于結(jié)構(gòu)數(shù)組的。首先說(shuō)明我的keil版本是:V5.28.0.0問(wèn)題是這樣的:我在a.h文件定義了一個(gè)結(jié)構(gòu)
    發(fā)表于 11-21 16:36 ?3次下載
    Keil使用<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>數(shù)組的<b class='flag-5'>奇怪</b>問(wèn)題

    stm32串口DMA數(shù)據(jù)接收不完整問(wèn)題說(shuō)明

    stm32串口DMA數(shù)據(jù)接收不完整問(wèn)題說(shuō)明最近做了一個(gè)項(xiàng)目需要用串口來(lái)接收模塊端的應(yīng)答數(shù)據(jù),由于使用了實(shí)時(shí)操作系統(tǒng),考慮中斷嵌套或被打斷的問(wèn)題導(dǎo)致數(shù)據(jù)接收不完整的問(wèn)題,使用串口dma接收數(shù)據(jù),但
    發(fā)表于 12-24 19:37 ?21次下載
    stm32串口DMA數(shù)據(jù)接收<b class='flag-5'>不完整</b>問(wèn)題說(shuō)明

    淺談C語(yǔ)言中的三種不完整類型

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

    如何獲取ChatGPT回答不完整的內(nèi)容

    ____tz_zs 對(duì)于 ChatGPT 回答不完整的情況(篇幅限制,沒(méi)有說(shuō)完),可以輸入“繼續(xù)”指令,讓其繼續(xù)回答下去,獲得完整內(nèi)容。 如下圖,發(fā)問(wèn) “使用web3js 調(diào)用 eth鏈智能合約” 直到這里才是獲得了剛剛問(wèn)題 “使用web3js 調(diào)用 eth鏈智能合約”
    發(fā)表于 02-10 10:48 ?0次下載
    如何獲取ChatGPT回答<b class='flag-5'>不完整</b>的內(nèi)容
    主站蜘蛛池模板: 国语自产一区视频| 男人扒开添女人屁股| 亚洲免费福利在线视频| 欧美性FREE玩弄少妇| 伦理79电影网在线观看| 果冻传媒AV精品一区| 美女隐私黄www视频| 久久久久久91香蕉国产| 久久91精品国产91久久户| 国产色精品久久人妻无码| 国产精品av免费观看| 俄罗斯极品hd| 高清一区二区亚洲欧美日韩| 俄罗斯xxxxxbbbbb| 久青草影院| 欧美高清vivoesosexo18| 欧美一区二区激情视频| 亚洲裸舞 hd| 纲手裸乳被爆白浆| 欧美free嫩交hd| 中国老太60old mantv| 973午夜伦伦电影论片| 99视频精品全部免费 在线| poronovideos动物狗猪| 动听968| 免费鲁丝片一级在线观看| 日韩伦理电影秋霞影院| 色百度网址大全| 亚洲成人mv| 一区二区三区毛AAAA片特级| 《乳色吐息》无删减版在线观看 | 男女一边摸一边做羞羞的事情免费| 亚洲 中文 自拍 无码| 亚洲精品久久久无码一区二区| 中文字幕人成乱码中国| 国精产品砖一区二区三区糖心| 天天爽夜夜爽8888视频精品| 亚洲AV一宅男色影视| 国产精品久久大陆| 麻豆一二三区果冻| 午夜福利免费院|