将Keil项目移植到GNU Toolchain - Keil Compiler的“AT”__Attribute__

3个帖子/ 0新
最后一篇
NAM HAU.
离线
最后一次露面:2周前1年
加入:2014-11-18 11:08
将Keil项目移植到GNU Toolchain - Keil Compiler的“AT”__Attribute__

大家好,

我正在将Keil Uvision项目移植到GNU工具链,仔细遵循AN-B-024文件,可以成功构建十六进制文件(Out / Full_emb_sysram.hex)。但是,固件不稳定(在HW重置后,固件可能工作,成功率约为1/20)。我的来源(基于DSPS REF设计)如果由Keil UVision建造,请正常工作。

我考虑了“在”__Attribute__(见4.4,Keil编译器扩展)的移植部分(见4.4,keil编译器扩展)是正确的或不是?

我们可以在PWM.C中找到相关部分(SRC / PLF / REFIP / SRC / DRIVER / PWM / PWM.C)
volatile struct __clk_per_reg clk_per_reg ___attribute __(((ark_per_reg))));
volatile struct __timer0_ctrl_reg timer0_ctrl_reg __attribute __((at(timer0_ctrl_reg)));
volatile struct ___triple_pwm_ctrl_reg triple_pwm_ctrl_reg __attribute __(((triple_pwm_ctrl_reg));
代码被修改为:
volatile struct __clk_per_reg clk_per_reg ___attribute __((部分(“atclk_per_reg”)))));
volatile struct __timer0_ctrl_reg timer0_ctrl_reg __attribute __((部分(“attimer0_ctrl_reg”))));
volatile struct __triple_pwm_ctrl_reg triple_pwm_ctrl_reg __attribute __((部分(“attriple_pwm_ctrl_reg”)))))
在链接脚本中,我在内存和部分中添加了一些相关零件如下
记忆{
......
MCU_REGS(RW):源= 0x50000000,长度= 0x4000
}
章节
{
/ * atclk_per_reg 0x50000004:
{
保持(*(atclk_per_reg))
}> mcu_regs.

Attimer0_ctrl_reg 0x50003400:
{
保持(*(attimer0_ctrl_reg))
}> mcu_regs.

attriple_pwm_ctrl_reg 0x50003410:
{
保持(*(attriple_pwm_ctrl_reg))
}> mcu_regs.
......
}
“十六进制文件”构建成功,但我无法在Out / LST / Full_emb_sysram.map中看到正确的地址。
ATCLK_PER_REG.
*(atclk_per_reg)

attimer0_ctrl_reg.
*(attimer0_ctrl_reg)

attriple_pwm_ctrl_reg.
*(attriple_pwm_ctrl_reg)

因此,如果代码访问MCU寄存器,我假设我认为“处于”__Attribute__无法移植(使用特定部分和相关链接脚本部件)。

然后,我尝试将比特字段结构映射到易失性寄存器,如下所示:
volatile struct __clk_per_reg * clk_per_reg =(__clk_per_reg *)(clk_per_reg);
volatile struct __timer0_ctrl_reg * timer0_ctrl_reg =(__timer0_ctrl_reg *)(timer0_ctrl_reg);
volatile struct __triple_pwm_ctrl_reg * triple_pwm_ctrl_reg =(__triple_pwm_ctrl_reg *)(triple_pwm_ctrl_reg);
......
但是,这也不用。

我现在需要从GNU对话的专家支持。
GNU专家在论坛中的任何帮助都非常感谢!

敬上!

tn_dialog.
离线
最后一次露面:1个月5天前
职员
加入:2013-12-05 15:49
嗨nam hau.

嗨nam hau.

我以前还没有看到这个问题。
我会尝试重现这个并回复你。

问候
tn_dialog.

tn_dialog.
离线
最后一次露面:1个月5天前
职员
加入:2013-12-05 15:49
嗨nam hau.

嗨nam hau.

我相信Keil代码是

volatile struct __clk_per_reg clk_per_reg ___attribute __(((ark_per_reg))));
volatile struct __timer0_ctrl_reg timer0_ctrl_reg __attribute __((at(timer0_ctrl_reg)));
volatile struct ___triple_pwm_ctrl_reg triple_pwm_ctrl_reg __attribute __(((triple_pwm_ctrl_reg));

这可以转换为标准C代码(它应该与keil和gcc合作)这样的:

volatile struct __clk_per_reg * clk_per_reg =(volatile struct __clk_per_reg *)(clk_per_reg);
volatile struct __timer0_ctrl_reg * timer0_ctrl_reg =(volatile struct __timer0_ctrl_reg *)(timer0_ctrl_reg);
volatile struct __triple_pwm_ctrl_reg * triple_pwm_ctrl_reg =(volatile struct ___trime_pwwm_ctrl_reg *)(triple_pwm_ctrl_reg);

不同之处在于,现在3个变量实际上是指向结构而不是结构本身。
因此,使用这些寄存器的代码必须从例如,

clk_per_reg.some_field = 12345;

clk_per_reg-> some_field = 12345;

使用标准C代码,该想法是使其在没有“AT”属性的情况下使用Keil。
那么它也应该与GCC合作。

问候

TN.