大家好,
我正在将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专家在论坛中的任何帮助都非常感谢!
敬上!
嗨nam hau.
我以前还没有看到这个问题。
我会尝试重现这个并回复你。
问候
tn_dialog.
嗨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.