目录
1、程序放在RAM运行的方法(Tasking)
2、Tc3xx读取PF的时候关闭ECC错误方法
3、看门狗驱动放置在RAM避免总线错误。
4、Debug RAM与Debug Flash的区别
5、Tasking生成的HEX不是按照PFLASH的页大小作为start,或者存在多个程序块需要合并的方式。
6、Tasking的对其方式
1、程序放在RAM运行的方法(Tasking)
在程序里面调用PF驱动的时候,假设程序放置在PF0,那么可以操作PF1,放置在PF1可以操作PF0,也可以放置在RAM,这样PF0与PF1均可以操作了。
通过Tasking将代码放置在RAM的方式,注意点,RAM分为PSRAM与DSRAM,运行的程序需要放置在PSRAM里面。玩玩不可以放在DSPR里面的,一旦放置在了DSPR里面,那么就无法执行了。
1、链接文件
memory psram0 // Program Scratch Pad Ram
{
mau = 8;
size = 64k;
type = ram;
map (dest=bus:tc0:fpi_bus, dest_offset=0xc0000000, size=64k, priority=8);
map (dest=bus:sri, dest_offset=0x70100000, size=64k);
}
/* PSRAM Code selections*/
section_layout :vtc:linear
{
/*Code Sections, selectable with patterns and user defined sections*/
group
{
/*Program Scratchpad Sections*/
group
{
group code_psram0 (ordered, attributes=rwx, copy, run_addr=mem:psram0)
{
select "(.text.cpu0_psram|.text.cpu0_psram.*)";
select "(.text.psram_text_cpu0|.text.psram_text_cpu0.*)";
}
group code_psram1 (ordered, attributes=rwx, copy, run_addr=mem:psram1)
{
select "(.text.cpu1_psram|.text.cpu1_psram.*)";
select "(.text.psram_text_cpu1|.text.psram_text_cpu1.*)";
}
group code_psram2 (ordered, attributes=rwx, copy, run_addr=mem:psram2)
{
select "(.text.cpu2_psram|.text.cpu2_psram.*)";
select "(.text.psram_text_cpu2|.text.psram_text_cpu2.*)";
}
}
}
}
2、代码部分执行
#pragma section code "psram_text_cpu0"
void Function(void);
#pragma section code restore
这样就可以将对应函数放置在RAM PSPR区域内了。
2、Tc3xx读取PF的时候关闭ECC错误方法
当然,这样子还不行,这样子读取PF会报ECC错误的,这个时候就要关闭ECC错误,主要的寄存器如下。
关闭ECC的代码如下
uint16 cpuWdtPsw = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[0]);
uint16 safetyWdtPsw = Ifx_Ssw_getSafetyWatchdogPassword();
Ifx_Ssw_clearCpuEndinit(&MODULE_SCU.WDTCPU[0], cpuWdtPsw);// clears the endinit protection
MODULE_CPU0.FLASHCON1.U = 0x00010000;
Ifx_Ssw_setCpuEndinit(&MODULE_SCU.WDTCPU[0], cpuWdtPsw);// sets the endinit protection back on
Ifx_Ssw_disableSafetyWatchdog(safetyWdtPsw);
开启ECC的代码如下
uint16 cpuWdtPsw = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[0]);
uint16 safetyWdtPsw = Ifx_Ssw_getSafetyWatchdogPassword();
Ifx_Ssw_clearCpuEndinit(&MODULE_SCU.WDTCPU[0], cpuWdtPsw);// clears the endinit protection
MODULE_CPU0.FLASHCON1.U = 0x02020000;
Ifx_Ssw_setCpuEndinit(&MODULE_SCU.WDTCPU[0], cpuWdtPsw);// sets the endinit protection back on
Ifx_Ssw_disableSafetyWatchdog(safetyWdtPsw);
3、看门狗驱动放置在RAM避免总线错误。
在调试PF擦除的时候,发现利用tc3xx本身的WDG模块调试,一旦调用写入或者擦除函数,就会进异常,感觉很奇怪,后来,通过屏蔽代码的方式查看错误源,一旦不使能看门狗就能正常,想着将WDG放置在PSPR RAM尝试下,可以实现功效。所以,部分时候当出现总线错误的时候,不妨将代码放置在PSPR RAM尝试一下。
4、Debug RAM与Debug Flash的区别
− Debug RAM
链接所有的应用程序到RAM存储器,下载代码到RAM存储器。这可以加快代码的运行速度。
− Debug Flash
普通内置闪存,没有一些优化和其他调试选项。该配置用于调试项目。
通过选择根文件夹更改目标配置,然后右键单击,单击Build Configurations >> Set
Active >> <your_build_config>
要构建项目,请选择您的文件夹并单击工具栏中的构建图标。(您可以选择哪个目标编译)
5、Tasking生成的HEX不是按照PFLASH的页大小作为start,或者存在多个程序块需要合并的方式。
合并后如下
还有一种情况是,例如Block 1的Start at 0x8006B821,不能被32整除,那么烧录时候,flash无法正常烧录,为了规避这种情况,只需要在Tasking编译器里面设置如下操作即可。
--concatenate-sections
6、Tasking的对其方式
部分时候,假设ASW与BSW通过不同的编译器实现,例如OEM特有的CodeSys,会遇到一个问题,字节对齐问题,在Tasking里面uint16与uint32分别占用2与4字节,假设结构体里面CodeSys认为uint16的数据也是4字节对齐,占用4个字节,但是TASKING对uint16只占用2字节,当代码集成在一起的时候,举个例子吧
codesys tasking
uint16 a ; 0x0000 uint16 a ; 0x0000
uint32 b; 0x 0004 uint32 b ; 0x0002
此时b的地址信息是冲突的,对codesys来说,导致a的值是错误的,b的值也是错误的。
通过tasking属性更改可以解决此问题。
--eabi=-half-word-align
half前面可以是-表示半字,+表示双字