×
嵌入式 > 技术百科 > 详情

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

发布时间:2024-05-19 发布时间:
|

要修改.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


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
FPGA及CPLD应用领域不断拓展