打印
[STM8]

stm8 程序段定位问题

[复制链接]
6947|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyx_200|  楼主 | 2010-3-25 11:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
file:///c:/111.bmp
我想将IAP和APP的地址空间分开,如何把开始地址有0X8968定位到0XA000?
来自 2楼
yyx_200|  楼主 | 2010-3-25 17:17 | 只看该作者
谢谢.问题已经解决.楼上各位大侠说得都在理.问题是我要在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

使用特权

评论回复
板凳
yyx_200|  楼主 | 2010-3-25 16:05 | 只看该作者
可能我没有说清楚:.目前我已经编译完成.下表是MAP文件:
start 00008080 end 00008080 length     0 segment .const
start 00008388 end 000083cc length    68 segment .IAP_CONST
start 000083cc end 00008968 length  1436 segment .IAP_CODE
start 00008968 end 00009040 length  1752 segment .text
我现在设置UBC[7:0]=3 (USER BOOT CODE为3K字节 )
.text 的开始地址应该在00008c00
我应该如何在ST  开发集成环境下设置.test的开始地址=0x8c00?谢谢先.

使用特权

评论回复
地板
汉之云| | 2010-3-25 16:26 | 只看该作者
要修改.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)一个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内容不同,由系统自动生成

使用特权

评论回复
5
汉之云| | 2010-3-25 16:28 | 只看该作者
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}:初始化变量

使用特权

评论回复
6
汉之云| | 2010-3-25 16:31 | 只看该作者
在.lkf中加入你自定义的段 比如叫 .myflash,在c程序中使用#pragma section(myflash) ,紧随其后的代码就放到指定的myflash限定的地址中去了

使用特权

评论回复
7
香水城| | 2010-3-25 17:18 | 只看该作者
刚刚把3楼说的文档上传到了二姨家里,赶快去下载吧:【应用笔记】如何基于STM8S系列MCU进行项目开发 :lol

使用特权

评论回复
8
bili| | 2010-3-30 10:47 | 只看该作者
哈哈,好贴要顶哦

使用特权

评论回复
9
armauk| | 2011-1-2 11:19 | 只看该作者
不错哦

使用特权

评论回复
10
tantao820629| | 2011-1-4 14:07 | 只看该作者
学习!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

40

帖子

0

粉丝