定義一個(gè)全局變量service_port,并附初值,在使用時(shí)總是莫名奇妙的變化成另一個(gè)值,其他地方?jīng)]有任何的修改,原因沒(méi)找到,但是在定義前加上const關(guān)鍵字修飾即可解決該問(wèn)題。
定義一個(gè)全局變量static uint8_t simulation_value=0;,并附初值,但是其他地方有修改++,但是在進(jìn)行其他操作時(shí),該變量會(huì)變成并不是預(yù)期的值。當(dāng)在定義時(shí)static uint8_t simulation_value,并不賦初值,即可解決該問(wèn)題。
對(duì)于該問(wèn)題,在網(wǎng)上找了其他高手的一些解釋:
一、簡(jiǎn)單的講一下原理。在嵌入式系統(tǒng)中,全局變量的初始化是在系統(tǒng)啟動(dòng)的過(guò)程中來(lái)做的。做法其實(shí)很簡(jiǎn)單,就是把外存(ROM或Flash等存放CODE的介質(zhì))中的全局變量空間拷貝到內(nèi)存中的全局變量空間映像中。如果沒(méi)有這一步正確的從外存到內(nèi)存的拷貝工作,你的全局變量是沒(méi)有初始化值的。
編譯器如果沒(méi)有生成這步代碼,那你的全局變量就都是沒(méi)有辦法初始化的。
用const為啥能解決問(wèn)題呢?因?yàn)閏onst型的變量被Keil直接放到了外存中,也就是放到了代碼段中。以后使用const實(shí)際不是訪問(wèn)內(nèi)存而是外存!
現(xiàn)在說(shuō)你的全局變量初始化的問(wèn)題解決方案:
1. 研究編譯結(jié)果,看全局變量的初值被放在了code段的哪個(gè)位置,以及全局變量在內(nèi)存中的位置定義,然后在初始化過(guò)程中——進(jìn)入main函數(shù)之前,把這些值拷貝過(guò)來(lái)。因?yàn)榫幾g器是按照段來(lái)處理全局變量的,所以所有全局變量的相對(duì)位置都是一一對(duì)應(yīng)的,用memcpy就可以了。
2. 不要在全局變量中這樣初始化,而是通過(guò)函數(shù)來(lái)初始化,在main函數(shù)的開(kāi)頭用init函數(shù)來(lái)初始化所有的全局變量。
二、哪個(gè)大師說(shuō)過(guò)的一句話,程序中莫名其秒的變量問(wèn)題[無(wú)論局部還是全局],大都是數(shù)組越界造成的!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧