單片機(jī)型號(hào):STM32F030R8
我們進(jìn)行程序設(shè)計(jì)的時(shí)候,都會(huì)知道,系統(tǒng)上電或復(fù)位時(shí),會(huì)執(zhí)行變量初始化操作,但是有些情況下,我們并不希望變量初始化,例如,在系統(tǒng)異常復(fù)位發(fā)生后,我們希望系統(tǒng)能夠迅速恢復(fù)復(fù)位前的現(xiàn)場(chǎng)狀況,這樣就希望變量能夠保留原先的值,而不被初始化。實(shí)際上,大家都知道,變量是存儲(chǔ)在RAM中的,只要不掉電,變量的數(shù)值是不會(huì)改變的,只要我們不讓系統(tǒng)進(jìn)行初始化操作就可以了。
不同的編譯環(huán)境,有不同的設(shè)置方法,本文介紹在Keil中設(shè)置不初始化變量的方法。在這里需要說明的是,網(wǎng)上介紹了許多的設(shè)置方法,但并不是所有的方法都起作用,本文將介紹一種最為直接的方法。
1、打開Options for Target對(duì)話框Linker標(biāo)簽,勾選掉Use Memory Layout from Target Dialog,這個(gè)選項(xiàng)的意思是使用Target標(biāo)簽進(jìn)行鏈接設(shè)置,所以在其勾選的情況下,分散文件是不能自己編輯的,勾選掉以后,我們就可以進(jìn)行分散文件的設(shè)置了。
2、點(diǎn)擊分散文件后面的Edit按鈕,打開分散文件,按下圖所示的方法,增加節(jié)點(diǎn)。原先僅有一個(gè)RAM節(jié)點(diǎn),其起始地址是0x20000000,其長(zhǎng)度是0x00008000。我們新編輯的分散文件,將RAM分為2部分,第1部分長(zhǎng)度為0x7000,第2部分長(zhǎng)度為0x1000,并將第2部分設(shè)置為UNINIT,也就是不初始化,顯式節(jié)點(diǎn)名為NO_INIT。
3、有了上述設(shè)置后,我們就可以進(jìn)行變量設(shè)置了,在這里需要注意的是變量需定義為全局變量,且不能賦初值,后面要加入存放的節(jié)點(diǎn),如下面程序所示。我們定義了5個(gè)變量,第1個(gè)為u16_Start,后面為4個(gè)數(shù)組(僅是舉例子,沒有什么實(shí)際意義)。
uint16_t u16_Start __attribute__((section("NO_INIT"),zero_init));
uint16_t u16_a[2] __attribute__((section("NO_INIT"),zero_init));
uint16_t u16_b[2] __attribute__((section("NO_INIT"),zero_init));
uint16_t u16_c[2] __attribute__((section("NO_INIT"),zero_init));
uint16_t u16_d[2] __attribute__((section("NO_INIT"),zero_init));
4、正確編譯后,將程序下載到目標(biāo)板,我們就可以觀察到這些變量不會(huì)因?yàn)閱纹瑱C(jī)復(fù)位,而被初始化了。不過這又產(chǎn)生了一個(gè)新的問題,由于我們沒有給這些變量賦初值,當(dāng)系統(tǒng)上電時(shí),這些變量的值是隨機(jī)的,所以我們還需要辨別是系統(tǒng)上電,還是系統(tǒng)復(fù)位,使用下面的程序就可以了,這也是變量u16_Start的作用。當(dāng)系統(tǒng)上電時(shí),由于RAM是剛剛加電,所以變量u16_Start為12345的可能性幾乎為0,我們認(rèn)為這是系統(tǒng)上電,將u16_Start設(shè)置為12345后,并初始化這些變量。當(dāng)系統(tǒng)復(fù)位時(shí),u16_Start中的數(shù)值仍然保留,所以還為12345,這樣就不再初始化變量。
if (u16_Start != 12345)
{
u16_Start = 12345;
u16_a[0] = 0;
u16_a[1] = 0;
u16_b[0] = 0;
u16_b[1] = 0;
u16_c[0] = 0;
u16_c[1] = 0;
u16_d[0] = 0;
u16_d[1] = 0;
}
上一篇:STM32開發(fā)筆記14: STM32L053R8T6的解釋
下一篇:STM32開發(fā)筆記12: STM32F0引腳使用注意事項(xiàng)
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 晶心科技:只需提供兩個(gè)設(shè)計(jì)文件,就能輕松擴(kuò)展RISC-V指令集
- 艾邁斯歐司朗先進(jìn)的高精度溫度傳感器助推動(dòng)物健康管理
- Microchip與臺(tái)達(dá)電子簽署碳化硅解決方案合作協(xié)議,共創(chuàng)電源管理未來
- 馬斯克被曝將旗下腦機(jī)接口公司 Neuralink 登記為“小微企業(yè)”
- 寒武紀(jì)宣布將募資 39.85 億元加碼 AI 大模型芯片與軟件平臺(tái)
- 如何加快基于RISC-V的SoC項(xiàng)目上市時(shí)間?西門子EDA給出了解法
- 負(fù)責(zé)任的賦能技術(shù)實(shí)現(xiàn)邊緣AI全面適用
- 半導(dǎo)體創(chuàng)新推動(dòng)能源格局演變的三種方式
- 大模型怎么幫助RISC-V設(shè)計(jì)和驗(yàn)證?Nuclei Model讓芯來的IP更有競(jìng)爭(zhēng)力
- 合見工軟如何幫助“香山”解決高性能多核RISC-V驗(yàn)證難題?
- 5000-9000高性能的游戲筆記本推薦
- 尼康公告:還有6個(gè)月的時(shí)間將關(guān)閉D600傳感器維修服務(wù)
- SONOSPLAY:5:好的設(shè)計(jì)和性能敗給了功能的缺乏和陳舊的外觀
- 日韓貿(mào)易戰(zhàn)有助于存儲(chǔ)器產(chǎn)業(yè)庫存去化而回暖
- Oculus聯(lián)合創(chuàng)始人看跌:VR游戲沒有市場(chǎng)
- msp430溫度測(cè)量(已調(diào)試OK)
- MSP430液晶SED1335控制器程序
- 基于MSP430F449單片機(jī)寬帶直流放大器的設(shè)計(jì)
- MSP430 24C64控制程序
- msp430f449的RS232接口程序