要修改.lkf 文件。
ST 有個中文文檔: 如何基于STM8S系列MCU進行項目開發
當“Auto”選擇框被勾選時,.lkf文件會自動生成在項目主目錄下的 debug/ 和 release/ 目錄中。下面以上圖所示 io_test Project的 lkf 文件為例,來進一步理解.lkf 。在.lkf中,以“#”開頭的行是注釋行,為方便用戶理解,將原注釋刪除,代之以中文注釋如下:
# 定義(+seg)一個常量段(.const),開始(b)于0x8080,最大分配(m)0x1ff80個字節(即不超過# 0x27FFF),為該段起名(n)為.const(和常量段的保留字同名),需要初始化的變量的初始值存# 放于此段(-it)
+seg .const -b 0x8080 -m 0x1ff80 -n .const -it
# 定義(+seg)一個程序段(.text),緊跟(-a)在.const段后面(和.const 共同位于0x8080 –
# 0x27FFF),為該段起名(n)為. text (和程序段的保留字同名)。
+seg .text -a .const -n .text
# 定義(+seg)一個程序段(.text),緊跟(-a)在.const段后面(和.const 共同位于0x8080 –
# 0x27FFF),為該段起名(n)為. text (和程序段的保留字同名)。
+seg .text -a .const -n .text
# 定義(+seg)一個EEPROM段(.eeprom),開始(b)于0x4000,最大分配(m)0x800個字節(即不超#過0x47FF),為該段起名(n)為. eeprom (和EEPROM段的保留字同名)。
+seg .eeprom -b 0x4000 -m 0x800 -n .eeprom
# .bsct段服務于定義在0頁(地址小于0x100)以內需要初始化的全局變量(如@tiny char a = 9;)
+seg .bsct -b 0x0 -m 0x100 -n .bsct
# .ubsct段服務于定義在0頁(地址小于0x100)以內不需要初始化的全局變量(如@tiny char b;)
+seg .ubsct -a .bsct -n .ubsct
# .bit表示位域段,定義后即可在程序中使用_Bool變量(如_Bool c = 1;),-id表示該段需要初始化。
+seg .bit -a .ubsct -n .bit -id
# 這是ST7時代(STM8是基于ST7發展而來的)由于物理堆棧小,速度慢,使用內存來模擬堆棧的變通手段。
+seg .share -a .bit -n .share -is
# .data段服務于定義在0頁(地址大于0xFF)以外需要初始化的全局變量(如@near char d = 8;)
+seg .data -b 0x100 -m 0x1300 -n .data
# .bss段服務于定義在0頁(地址大于0xFF)以內不需要初始化的全局變量(如@ near char e;)
+seg .bss -a .data -n .bss
# 段定義結束,下面放置的庫及Obj文件中的變量、常量、程序就按照上面的規定進行分配。
#初始化程序
crtsi0.sm8
#用戶程序
Debugmain.o
…
# 一些必要的cosmic庫
libis0.sm8
libm0.sm8
# 重定義常量段,開始于0x8000,用于放置中斷向量表(STM8硬件決定此位置)
# –k 用于程序冗余代碼優化,詳情可參考cosmic用戶手冊。
+seg .const -b 0x8000 –k
# 中斷向量
Debugstm8_interrupt_vector.o
#定義了三個變量,用于系統初始化
+def __endzp=@.ubsct
# end of uninitialized zpage
+def __memory=@.bss # end of bss segment
+def __stack=0x17ff # 不同的芯片__stack內容不同,由系統自動生成
3 進一步掌握STVD/COSMIC
3.1 如何分配變量到指定的地址
舉例:
unsigned char temp_A@0x00; //定義無符號變量temp_A,強制其地址為0x00
unsigned char temp_B@0x100; //定義無符號變量temp_B,強制其地址為0x100
@tiny unsigned char temp_C; //定義無符號變量temp_C,由編譯器自動在地址小于0x100的RAM中為其分配一個地址
@near unsigned char temp_D; //定義無符號變量temp_D,由編譯器自動在地址大于0xFF的RAM中為其分配一個地址
另外也可以采用偽指令“pragma”將函數或者變量定義到指定的section中,例如:
#pragma section [name] // 將下面定義的未初始化變量定義到.name section中
Unsigned char data1;
Unsigned int data2;
……(任何需要定義在.name section中的變量)
……
#pragma section [] // 返回到正常的section.
(關于section的定義方法可以參考3.7節的描述。)
注意:pragma偽指令可以用來定位函數,初始化變量或者未初始化變量。這三者用不同的括號區分。
(name):代碼
[name] :未初始化變量
{name}:初始化變量
在.lkf中加入你自定義的段 比如叫 .myflash,在c程序中使用#pragma section(myflash) ,緊隨其后的代碼就放到指定的myflash限定的地址中去了
謝謝.問題已經解決.樓上各位大俠說得都在理.問題是我要在IDE方式下處理段的定位問題.目前我已經找到解決方法,如下:
1) 在ST IDE 的工程下,(按SHIFT+F7或選擇菜單Project->settings)
2) 選擇linker屬性頁
3)在category下拉菜單下選input
4)(門道在這) 在segment/section name表格中按鼠標右鍵選add segment,然后新建一個段,修改段的起始地址和結束地址
5)然后在新的段中按鼠標右鍵選add section 加入程序中已經定義好的片段APP_CODE
程序中的開始部分定義的,如下
#pragma section (APP_CODE)
#pragma section const {APP_CONST}
編譯后如下
--------
Segments
--------
start 00004000 end 00004001 length 1 segment .eeprom
start 00000000 end 0000000a length 10 segment .bsct, initialized
start 0000808d end 00008097 length 10 segment .bsct, from
start 0000000a end 000000ac length 162 segment .ubsct
start 000000ac end 000000ac length 0 segment .bit
start 000000ac end 000000ac length 0 segment .share
start 00000100 end 00000100 length 0 segment .data
start 00000100 end 00000100 length 0 segment .bss
start 00000100 end 000003f1 length 753 segment .FLASH_CODE, initialized
start 00008097 end 00008388 length 753 segment .FLASH_CODE, from
start 00008080 end 00008080 length 0 segment .const
start 00008388 end 00008924 length 1436 segment .IAP_CODE
start 00008924 end 00008968 length 68 segment .IAP_CONST
start 00009c00 end 00009cc0 length 192 segment .MYINTER_CODE
start 00009cc0 end 0000a398 length 1752 segment .text
start 0000a398 end 0000bba6 length 6158 segment .APP_CODE
start 0000bba6 end 0000c6da length 2868 segment .APP_CONST
start 00000000 end 0002beef length 179951 segment .debug
start 00008000 end 00008080 length 128 segment .const
start 00008080 end 0000808d length 13 segment .init
上一篇:STM8l051,新建工程
下一篇:STM8避坑—串口中斷
推薦閱讀
史海拾趣
Allied Electronics,總部位于美國德克薩斯州的一家分銷公司,專注于為各種行業提供電子元件和電子產品。以下是關于Allied Electronics發展的五個相關故事:
成立和初期發展: Allied Electronics成立于1928年,最初以銷售家庭無線電零件和配件為主要業務。隨著無線電和電子行業的發展,公司逐漸擴大了產品范圍,開始提供更廣泛的電子元件和設備,以滿足不斷增長的市場需求。
與RS Components的合并: 2000年,Allied Electronics與英國的RS Components公司合并,成為全球領先的電子元件分銷商之一。這一合并加強了兩家公司在全球市場的地位,并且拓展了它們的產品線和客戶群。
公司戰略調整: 隨著數字化技術的快速發展,Allied Electronics逐漸調整了業務戰略,加大了對電子元件和器件的供應,并拓展了工業自動化、物聯網和電子制造等領域的業務。通過與各種行業的合作伙伴建立緊密的關系,公司不斷提升了產品質量和服務水平。
技術創新和數字化轉型: Allied Electronics致力于技術創新和數字化轉型,通過建立先進的電子商務平臺和在線資源中心,為客戶提供更便捷的采購體驗。同時,公司還加強了與供應商的合作關系,引入了更多的創新產品,滿足不同客戶的需求。
持續發展和全球擴張: 作為全球領先的電子元件分銷商之一,Allied Electronics不斷加大在全球范圍內的市場擴張力度,開設了多個銷售辦事處和物流中心,以更好地服務于全球客戶。同時,公司還積極參與行業展會和活動,加強了與全球電子行業的合作與交流,推動了公司的持續發展和壯大。
Advanced Analog自1999年創立起,便專注于電源管理IC的設計及研發。面對當時電子市場的激烈競爭,公司憑借對技術的深刻理解和敏銳的市場洞察力,成功開發出多款高性能、高可靠性的電源管理IC產品,迅速在行業中嶄露頭角。通過不斷的技術創新和優化,Advanced Analog逐漸在電源管理IC領域建立起自己的技術優勢和品牌影響力。
ELECTRONICON Kondensatoren GmbH,其前身為RFT Kondensatorenwerk Gera,于20世紀30年代末與德國圖林根東部的Gera的電容器制造商建立了緊密的合作。自此,ELECTRONICON開始嶄露頭角,專注于電容器技術的研發與生產。公司始終將產品的質量和可靠性作為核心理念,為未來的發展奠定了堅實的基礎。
在快速發展的過程中,CTC Coils Ltd公司始終注重企業文化建設和團隊建設。公司倡導創新、務實、高效的企業精神,鼓勵員工勇于創新、追求卓越。同時,公司還注重員工的培訓和成長,為員工提供廣闊的發展空間和良好的職業晉升通道。這些舉措使得公司凝聚力不斷增強,為公司的長遠發展奠定了堅實的基礎。
請注意,這些故事是虛構的,旨在展示一個電子行業公司可能經歷的發展路徑和關鍵階段。實際情況可能因公司具體情況和市場環境的不同而有所差異。
隨著在高壓電源領域的深入發展,HVPSI逐漸參與到行業標準的制定工作中。公司憑借其在技術上的深厚積累和市場經驗,為行業標準的制定提供了寶貴的建議和數據支持。這些標準的出臺不僅規范了市場秩序,也進一步鞏固了HVPSI在行業內的領先地位。
BOSER公司始終關注企業社會責任和可持續發展。公司在生產過程中積極采用環保材料和技術,降低能耗和排放。同時,BOSER還積極參與公益事業,為社會做出貢獻。這些舉措不僅提升了公司的社會形象,也為公司的可持續發展奠定了堅實基礎。
需要強調的是,以上五個故事是基于電子行業常見趨勢和挑戰虛構的BOSER公司的發展故事。雖然這些故事是虛構的,但它們反映了電子公司在發展過程中可能遇到的機遇和挑戰,以及如何通過不斷創新和適應市場變化來實現持續發展。如果您希望了解真實存在的電子公司的發展故事,建議查閱相關公司的官方資料或新聞報道。