国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Keil5中寫的軟件延時(shí)函數(shù)不起作用現(xiàn)象解析_ARM_Compiler_volatile關(guān)鍵字

這篇具有很好參考價(jià)值的文章主要介紹了Keil5中寫的軟件延時(shí)函數(shù)不起作用現(xiàn)象解析_ARM_Compiler_volatile關(guān)鍵字。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、問題描述

在學(xué)習(xí)野火霸天虎F407寄存器點(diǎn)亮LED時(shí),出現(xiàn)實(shí)驗(yàn)現(xiàn)象:LED燈不亮,野火霸天虎F407資料。
Keil5中寫的軟件延時(shí)函數(shù)不起作用現(xiàn)象解析_ARM_Compiler_volatile關(guān)鍵字,# STM32,arm開發(fā),嵌入式開發(fā),stm32,單片機(jī)

main.c代碼如下:

#include "stm32f4xx.h"

void Delay(unsigned int count);

int main(void)
{   
#if 0
    /* 第一步:開啟GPIO端口的時(shí)鐘 */
    /* 打開GPIOF端口的時(shí)鐘 */
    *(unsigned int *)(0x40023800+0x3f0) |= (1<<5);
    
    /* 第二步:控制GPIO的方向 */
    /* GPIOF 配置為輸出 */
    *(unsigned int *)(0x40021400+0x00) &= ~((0x03) << (2*6));
    *(unsigned int *)(0x40021400+0x00) |= (1 << (2*6));
    
    /* 第三步:控制GPIO的數(shù)據(jù)輸出寄存器 */
    /* PF6 輸出高電平 */
    *(unsigned int *)(0x40021400+0x14) |= (1 << 6);
    /* PF6 輸出低電平 */
    *(unsigned int *)(0x40021400+0x14) &= ~(1 << 6);
    
#elif 0
    /* 第一步:開啟GPIO端口的時(shí)鐘 */
    /* 打開GPIOF端口的時(shí)鐘 */
    RCC_AHB1ENR |= (1<<5);
    
    /* 第二步:控制GPIO的方向 */
    /* GPIOF 配置為輸出 */
    GPIO_MODER &= ~((0x03) << (2*6));
    GPIO_MODER |= (1 << (2*6));
    
    /* 第三步:控制GPIO的數(shù)據(jù)輸出寄存器 */
    /* PF6 輸出高電平 */
    GPIO_ODR |= (1 << 6);
    /* PF6 輸出低電平 */
    GPIO_ODR &= ~(1 << 6);
#elif 0
    //任務(wù)1-把其他兩個(gè)燈也點(diǎn)亮
    RCC_AHB1ENR |= (1<<5); //開啟GPIO端口時(shí)鐘
    
    //設(shè)置GPIOF6為推挽輸出
    GPIO_MODER &= ~((0x03) << (2*6));  
    GPIO_MODER |= (1 << (2*6));
    GPIO_ODR |= (1 << 6);
    GPIO_ODR &= ~(1 << 6);
    //設(shè)置GPIOF7為推挽輸出
    GPIO_MODER &= ~((0x03) << (2*7));  
    GPIO_MODER |= (1 << (2*7));
    GPIO_ODR |= (1 << 7);
    GPIO_ODR &= ~(1 << 7);
    //設(shè)置GPIOF8為推挽輸出
    GPIO_MODER &= ~((0x03) << (2*8));  
    GPIO_MODER |= (1 << (2*8));
    GPIO_ODR |= (1 << 8);
    GPIO_ODR &= ~(1 << 8);

#elif 1
    //任務(wù)1-把其他兩個(gè)燈也點(diǎn)亮
    RCC_AHB1ENR |= (1<<5); //開啟GPIO端口時(shí)鐘
    
    //設(shè)置GPIOF6為推挽輸出
    GPIO_MODER &= ~((0x03) << (2*6));  
    GPIO_MODER |= (1 << (2*6));
    //設(shè)置GPIOF7為推挽輸出
    GPIO_MODER &= ~((0x03) << (2*7));  
    GPIO_MODER |= (1 << (2*7));
    //設(shè)置GPIOF8為推挽輸出
    GPIO_MODER &= ~((0x03) << (2*8));  
    GPIO_MODER |= (1 << (2*8));
    
    while(1)
    {
        GPIO_ODR &= ~(1 << 6);
        Delay(0xfffff);
        GPIO_ODR |= (1 << 6);
        Delay(0xfffff);
        
        GPIO_ODR &= ~(1 << 7);
        Delay(0xfffff);
        GPIO_ODR |= (1 << 7);
        Delay(0xfffff);
        
        GPIO_ODR &= ~(1 << 8);
        Delay(0xfffff);
        GPIO_ODR |= (1 << 8);
        Delay(0xfffff);
    }  
 #endif 
}


//延時(shí)函數(shù)
void Delay(unsigned int count)
{
    for(;count!=0;count--);
}

void SystemInit(void)
{
    /* 函數(shù)體為空,目的是為了騙過編譯器不報(bào)錯(cuò) */
}

/*
1-把其他兩個(gè)燈也點(diǎn)亮
2-實(shí)現(xiàn)三個(gè)燈閃爍(時(shí)間的控制使用軟件延時(shí))
*/

二、問題分析

通過分析main.c代碼,導(dǎo)致出現(xiàn)上述現(xiàn)象的間接原因是延時(shí)函數(shù)沒有起作用。檢查延時(shí)函數(shù)的實(shí)現(xiàn)代碼,并沒有錯(cuò)誤。這不禁使我想起《程序員的自我修養(yǎng)——鏈接、裝載、庫》一書所提到的程序源代碼經(jīng)過預(yù)編譯-》編譯-》匯編-》鏈接,所以極大可能是編譯器在編譯過程中優(yōu)化掉了我的延時(shí)函數(shù),使得整個(gè)程序不能按照預(yù)定功能實(shí)現(xiàn)。

打開keil5的調(diào)試功能,查看對應(yīng)main.c的反匯編文件:
經(jīng)過優(yōu)化的delay函數(shù):
Keil5中寫的軟件延時(shí)函數(shù)不起作用現(xiàn)象解析_ARM_Compiler_volatile關(guān)鍵字,# STM32,arm開發(fā),嵌入式開發(fā),stm32,單片機(jī)
未經(jīng)過優(yōu)化的delay函數(shù):
Keil5中寫的軟件延時(shí)函數(shù)不起作用現(xiàn)象解析_ARM_Compiler_volatile關(guān)鍵字,# STM32,arm開發(fā),嵌入式開發(fā),stm32,單片機(jī)
優(yōu)化之后的 delay 函數(shù)沒有for循環(huán)延時(shí)操作,因此失去延時(shí)的效果。

三、問題解決

3.1 降低ARM Compiler version

在Target設(shè)置界面下,Code Generation默認(rèn)的是ARM Compiler version 6。
Keil5中寫的軟件延時(shí)函數(shù)不起作用現(xiàn)象解析_ARM_Compiler_volatile關(guān)鍵字,# STM32,arm開發(fā),嵌入式開發(fā),stm32,單片機(jī)
將ARM Compiler version 6改為ARM Compiler version 5即可。Keil5中寫的軟件延時(shí)函數(shù)不起作用現(xiàn)象解析_ARM_Compiler_volatile關(guān)鍵字,# STM32,arm開發(fā),嵌入式開發(fā),stm32,單片機(jī)

3.2 volatile關(guān)鍵字修飾

volatile關(guān)鍵字影響編譯器編譯的結(jié)果,用volatile聲明的變量表示該變量隨時(shí)可能發(fā)生變化,與該變量有關(guān)的運(yùn)算,不要進(jìn)行編譯優(yōu)化,以免出錯(cuò)。volatile關(guān)鍵字最通俗的解釋是,告訴編譯器這個(gè)變量我有其他用,不要給我隨便優(yōu)化掉。

原延時(shí)函數(shù)

//延時(shí)函數(shù)
void Delay(unsigned int count)
{
    for(;count!=0;count--);
}

添加volate關(guān)鍵字修飾

//延時(shí)函數(shù)
void Delay(volatile unsigned int count)
{
    for(;count!=0;count--);
}

推薦使用方法2,原因如下:

1.自定義延時(shí)函數(shù)中使用 volatile 去聲明 val 變量可以解決編譯器優(yōu)化帶來的延時(shí)失效問題;
2.編譯器優(yōu)化可以使代碼更加精煉,執(zhí)行效率更高。

參考資料

1. Keil AC5 和 AC6的一些區(qū)別
2. 編譯器優(yōu)化對自定義延時(shí)程序的影響(volatile詳解實(shí)驗(yàn)一)
3. C語言丨深入理解volatile關(guān)鍵字文章來源地址http://www.zghlxwxcb.cn/news/detail-518067.html

到了這里,關(guān)于Keil5中寫的軟件延時(shí)函數(shù)不起作用現(xiàn)象解析_ARM_Compiler_volatile關(guān)鍵字的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【工具使用】Keil5軟件使用-進(jìn)階工程配置篇

    【工具使用】Keil5軟件使用-進(jìn)階工程配置篇

    ????本文面向已經(jīng)懂得軟件基本操作的職業(yè)老手,如果是未使用過該軟件的小鮮肉,請移步基礎(chǔ)篇。這里以STM32芯片為例對工具進(jìn)行講解,其他品牌的芯片在工程配置上可能存在差異。 ????Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個(gè)功能強(qiáng)大的仿真調(diào)試

    2024年02月03日
    瀏覽(21)
  • Keil5,ARM編譯器 軟件優(yōu)化注意事項(xiàng)

    循環(huán)是大多數(shù)程序中的常見結(jié)構(gòu)。由于大量的執(zhí)行時(shí)間通常花費(fèi)在循環(huán)中,因此值得關(guān)注時(shí)間關(guān)鍵循環(huán)。 如果不謹(jǐn)慎地編寫,環(huán)路終止條件可能會(huì)導(dǎo)致大量開銷。在可能的情況下: 使用簡單的終止條件。 寫入倒計(jì)時(shí)到零循環(huán)。 使用? unsigned int ?類型的計(jì)數(shù)器。 測試與零的

    2024年02月03日
    瀏覽(23)
  • keil5.38 debug配置STlink調(diào)試,軟件閃退

    keil5.38 debug配置STlink調(diào)試,軟件閃退

    keil5.38 debug配置STlink調(diào)試,軟件閃退 因?yàn)樾掳娴腒eil加入了盜版下載器的校驗(yàn)機(jī)制 百度云盤 鏈接:舊版版本STLINK文件連接 提取碼:7epc 解壓下載文件后得到STlink文件夾,替換到新版本的keil的ARM目錄即可

    2024年02月11日
    瀏覽(78)
  • keil5軟件安裝&開發(fā)環(huán)境搭建教程(mdk,c51通用)

    keil5軟件安裝&開發(fā)環(huán)境搭建教程(mdk,c51通用)

    這是我在csdn上寫的第一篇文章,心情激動(dòng)興奮。因?yàn)橹岸际强磩e人寫的博客,從來沒想過自己去寫一篇,在學(xué)長的鼓勵(lì)下,嘗試完成人生第一篇博客。仍有不足,希望大佬多多指正! 寫這篇的目的是因?yàn)閗eil5的安裝是許多人入門嵌入式的第一步,而且以后遇到許多不知名的

    2024年02月05日
    瀏覽(31)
  • Keil5軟件安裝方法(兼容stm32與c51方法)

    Keil5軟件安裝方法(兼容stm32與c51方法)

    目錄 一、下載軟件包 二、安裝軟件 1、安裝C51v960a.exe (1)右鍵以管理員權(quán)限運(yùn)行程序 ?(2)開始安裝軟件 ?(3)勾選協(xié)議 (4)選擇安裝路徑 ?(5)填寫名字與郵箱 ?(6)等待安裝 (7)安裝完畢 ?(8)以管理員打開軟件 (9)打開注冊機(jī) (10)破解成功 2、安裝mdk528.exe

    2023年04月24日
    瀏覽(27)
  • STM32——01-開發(fā)軟件Keil5及STM32CubeMX的安裝

    STM32——01-開發(fā)軟件Keil5及STM32CubeMX的安裝

    1.1開發(fā)環(huán)境的安裝 ?編程語言:C語言 需要安裝的軟件有兩個(gè):Keil5和STM32CubeMX 安裝 ????????安裝包(不需要太新,以 MDK324 為例,最新的 MDK327 有問題) ????????安裝過程一路下一步即可(建議不要安裝在 C 盤) ????????安裝路徑一定不要有中文或空格!!(重要

    2024年02月08日
    瀏覽(18)
  • 小游戲:人生中寫的第一個(gè)小游戲——貪吃蛇(C語言)

    小游戲:人生中寫的第一個(gè)小游戲——貪吃蛇(C語言)

    ????????小編開了一個(gè)關(guān)于游戲的專欄,主要是運(yùn)用easyx圖形庫進(jìn)行的。 ? ? ? ?第一章:人生中寫的第一個(gè)小游戲——貪吃蛇(C語言) ????????這個(gè)游戲的代碼我在gitee上發(fā)布了,大家如果不嫌棄,可以進(jìn)入這個(gè)網(wǎng)址進(jìn)行查看和復(fù)制:https://gitee.com/rising-sun-1。 ? ? ?

    2024年02月09日
    瀏覽(32)
  • keil5出現(xiàn)‘Target not created‘ keil5出現(xiàn)‘Target not created‘

    新建工程中寫了main函數(shù)進(jìn)行編譯時(shí)出現(xiàn)錯(cuò)誤的問題: 查找報(bào)錯(cuò)的關(guān)鍵提示: cannot open source input file \\\"core_cm3.h\\\": No such file or directory ? #include \\\"core_cm3.h\\\" 這是因?yàn)槟阊b的MDK版本太新了,比如MDK5.12/5.13,它們不會(huì)從MDK安裝目錄去查找頭文件。 所以導(dǎo)致這個(gè)錯(cuò)誤。 解決方法如下:

    2024年02月11日
    瀏覽(23)
  • XmlDocument.SelectNodes 不起作用

    XmlDocument.SelectNodes 不起作用

    今天采用Xpath讀取Xml節(jié)點(diǎn),怎么都讀不出。 錯(cuò)誤代碼如下: 經(jīng)排查 dotnet 文檔,發(fā)現(xiàn)代碼編寫沒有問題。文檔描述如下: 文檔示例如下: 示例代碼: 示例XML: 自己程序采用Xml:

    2024年02月10日
    瀏覽(19)
  • Swagger傳參不起作用

    Swagger傳參不起作用

    本來是在swagger上面測試的,但是參數(shù)沒有傳進(jìn)來,debug發(fā)現(xiàn)傳的courseId為null 這個(gè)肯定就是傳參的問題 拿去postman測試 發(fā)現(xiàn)結(jié)果正常 ? 這時(shí)候就應(yīng)該考慮是swagger的問題了 這個(gè)時(shí)候發(fā)現(xiàn)swagger上面的ParameterType是body類型的 那就好解決了,自己的請求地址是代碼拼接類型的,也就

    2024年02月02日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包