定義一個(gè)全局變量service_port,并附初值,在使用時(shí)總是莫名奇妙的變化成另一個(gè)值,其他地方?jīng)]有任何的修改,原因沒(méi)找到,但是在定義前加上const關(guān)鍵字修飾即可解決該問(wèn)題。
赫山網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(liá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)查看詳情吧