zoukankan      html  css  js  c++  java
  • (八) 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
    #用户程序
    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

  • 相关阅读:
    下一代的前端构建工具:parcel打包react
    vue or react mvvm里的文字上下滚动
    CSS grid layout demo 网格布局实例
    js页面可视区域懒加载
    Vue双向绑定简单实现
    React Router 4.0中文快速入门
    Array.isArray() 和 isObject() 原生js实现
    60分钟课程: 用egg.js实现增删改查,文件上传和restfulApi, webpack react es6 (一)
    mirror.js 整合redux的好工具
    React-redux及异步获取数据20分钟快速入门
  • 原文地址:https://www.cnblogs.com/zhangshenghui/p/6424151.html
Copyright © 2011-2022 走看看