打印
[应用相关]

修改linker配置

[复制链接]
392|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangpe|  楼主 | 2020-2-16 12:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做了一个工程项目,因在线升级的原因,需要把该工程文件的代码放置在0x9000这个位置执行(0x8000-0x9000之间放置bootloader),因此需要对工程的linker配置项进行修改,我手动修改了下图中的红色圈内的内容,但是编译一直提示地址冲突报overlap的错误(内容为"#error clnk release\sfp_voa_ctrl.lkf:1 segments .text (0x8350-0xa7c2) and .const (0x9000-0x9080) overlap"),我手动修改.lnk文件的地址定义(修改"+seg .const -b 0x8080 -m 0x3f80 -n .const -it "中的0x8080为0x9080),还是不能解决这个问题,编译后.lnk文件的内容又恢复成没修改之前的内容了。请问如何解决这个问题?还是说即使我的程序要放在0x9000开始的位置,也不要修改linker配置?

使用特权

评论回复
沙发
langgq| | 2020-2-16 12:26 | 只看该作者
这是在看什么软件里开发的?好像在keil的项目属性里可以设置地址。

使用特权

评论回复
板凳
wangzsa| | 2020-2-16 12:28 | 只看该作者
如何分配变量到指定的地址
举例:
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.
注意:pragma伪指令可以用来定位函数,初始化变量或者未初始化变量。这三者用不同的括号区分。
(name):代码
[name] :未初始化变量
{name}:初始化变量
如何在COSMIC C文件中使用汇编语言
在COSMIC C文件中使用汇编语言常见的方法有如下两种:使用#asm …#endasm组合格式
或_asm("…"); 单行格式。
举例1:
unsigned char temp_A;
Void func1(void)
{
...
#asm
PUSH A
LD A,(X)
LD _temp_A,A
POP A
#endasm
...
}
注:在C嵌汇编环境下使用全局变量,要在该全局变量名称前加下划线"_"。
举例2:
Void func1(void)
{
...
_asm("rim");
_asm("nop");
...
}

使用特权

评论回复
地板
wangzsa| | 2020-2-16 12:33 | 只看该作者
就是那样配置的,修改红色方框里的数据就好。

使用特权

评论回复
5
zhuww| | 2020-2-16 12:37 | 只看该作者
会不会你代码还有别的问题?

使用特权

评论回复
6
wangpe|  楼主 | 2020-2-16 12:41 | 只看该作者

代码运行没有发现什么问题。

使用特权

评论回复
7
zhanglli| | 2020-2-16 12:44 | 只看该作者
你可以把生成的hex或S19文件用STVP打开看看。

使用特权

评论回复
8
lium| | 2020-2-16 12:47 | 只看该作者
看看代码是否从9000开始放的。这样可以验证你的配置或代码。

使用特权

评论回复
9
guoyt| | 2020-2-16 13:38 | 只看该作者
布尔变量不能定义位数组,只能定义成结构体或者联合

使用特权

评论回复
10
wangpe|  楼主 | 2020-2-16 13:41 | 只看该作者
嗯,预料中的结果,先结贴吧,多谢大家啦

使用特权

评论回复
11
hanzhen654| | 2020-2-16 16:18 | 只看该作者
Jlink debug 下,看一下硬件复位后,代码运行的地址在哪里?

使用特权

评论回复
12
wowu| | 2020-3-5 14:01 | 只看该作者
代码必须从这个地址开始吗

使用特权

评论回复
13
香水城| | 2020-3-5 15:45 | 只看该作者
1、你的问题应该是调整连接文件导致的。
2、你修改手动文件,可以直接修改脚本,也可以基于IDE的linker来修改,如果使用auto模式,IDE里修改后,连接脚本文件会跟着同步修改。
    如果希望避免这样,你可以采样custom用户模式,你只管修改脚本文件即可。
3、你做IAP的话,建议使用两个工程,比方IAP: 0x8000-0x8fff; APP: 0X9000-0x9fff; 这个环节特别注意中断矢量的重映射。
4、关于STM8的IAP应用你可以参考一个笔记,AN2659.

AN2659 STM8 in-application programming (IAP) using a customized user-bootloader.pdf

279.53 KB

使用特权

评论回复
14
香水城| | 2020-3-5 15:47 | 只看该作者
你基于cosmic开发的话,与之相关的编译手册随时可能需要查一查。

使用特权

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

本版积分规则

938

主题

9837

帖子

2

粉丝