日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(八) stm8程序段定位,理解lkf文件

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (八) stm8程序段定位,理解lkf文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要修改.lkf 文件。

ST 有個中文文檔: 如何基于STM8S系列MCU進行項目開發

頁29/34

當“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
#用戶程序
Debug\main.o


# 一些必要的cosmic庫
libis0.sm8
libm0.sm8

?# 重定義常量段,開始于0x8000,用于放置中斷向量表(STM8硬件決定此位置)
# –k 用于程序冗余代碼優化,詳情可參考cosmic用戶手冊。
+seg .const -b 0x8000 –k
# 中斷向量
Debug\stm8_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

轉載于:https://www.cnblogs.com/zhangshenghui/p/6424151.html

總結

以上是生活随笔為你收集整理的(八) stm8程序段定位,理解lkf文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。