IAR下使用noinit段

IAR下使用noinit段的方法和指定地址的變量分配

noinit段對我們大多數搞單片機開發者來說並不陌生,該段如果被使用的話是會被編譯器自動分配到芯片SRAM的一塊區域中(注意是RAM區而非Flash),在該段定義的變量在除了掉電之外的任何芯片復位的情況下都不會被重新初始化,所以這個段的意義就大了,常用來保存一些敏感信息,特殊應用場合下的不能被複位的數據或者做復位判斷標誌等數據,個人感覺這個數據段的用途還是非常廣的,且很好用。

    那下面我們就以飛思卡爾Kinetis系列的KL26在IAR環境下爲例,簡單介紹一下noinit段的使用方法,方法還是非常簡單的,如下圖,定義noinit段的變量有兩種形式,一種是直接在變量類型前面加上"__no_init”關鍵字,另一種是使用預編譯指令#pragma這種IAR下常用的指定段的方式,俺還是prefer第一種方式的,簡單明瞭。

image

    實際上講到這裏已經算是結束了畢竟noinit段的使用方法還是比較簡單的。但我並不想這麼早就收尾了,還想介紹一下noinit使用的另一種情況(俺還沒完了,呵呵),那就是正常情況下noinit段所在的SRAM區地址範圍是被編譯器自動分配的,但是如果我是強迫症的話(咳咳,俺不是啊,是假設啊,呵呵)或者用戶有需要就是想把noinit中的變量指定到固定的地址中去(有些應用是需要的,比如帶Bootloader的應用,因爲Bootloader代碼和用戶代碼是兩個獨立的工程且分開編譯的,那Bootloader裏面是沒有這個變量的,所以需要告訴Bootloader用戶代碼中在noinit段定義的變量所在的具體地址,然後Bootloader直接去該地址讀取),這就需要我們“耍些手段”去強制編譯器把該noinit的變量分配到我們制定的地址去。當然實現這個功能,IAR下有幾種方法,我這裏只給出一種比較可靠的方法,即修改鏈接文件,在IAR的鏈接文件中給noinit區分配好指定的空間大小和地址範圍,這樣就可以根據外部變量的大小去來決定在鏈接文件中分給noinit區的空間大小和地址範圍,具體方法如下:

1. 打開IAR下用戶工程的鏈接文件(這裏我以KL26 128kB flash的鏈接文件爲例),如下圖中所示在給RAM分配起始空間時可以預留出0x30即48個字節(下面應用中我定義了12個整型變量,需要48個字節);

clip_image002[5]

2. 爲noinit區指定一個固定的區(如果不指定的話是由編譯器自動分配的),我這裏給noinit區分配的地址範圍設定爲(RAMstart-0x30)到RAMstart(這樣不會與其他數據衝突),佔用0x30個字節,同時noinit區的首地址也確定下來了,即RAMstart-0x30;

clip_image004

3. 這一步就是把.noinit段範圍分配到上面定義的noinit_region區,實際上就是告訴編譯器以後被定義成__no_init的變量需要強制放到noinit_region區;

clip_image006

4. 然後在c文件中直接定義一個temp數組並聲明成__no_init段,12個元素,共佔用48個字節,如果你定義13個元素52個字節,編譯器會出錯提示超出範圍了,所以如果我們需要更改變量的大小記得鏈接文件也要修改;

clip_image008

5. 最後編譯整個工程,打開生成的.map文件,可以看到如下圖示,即temp變量爲固定分配到0x1ffff410地址,大小爲0x30個字節,怎麼樣,很酷吧,呵呵。

clip_image010

    到這裏纔可以說算是結束了,不知道博友們認真看下來是否有所收穫,有收穫的同志記得在俺博客下面點個贊哈,哈哈。好了,這篇文章就到這了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章