S32K314 RTD V2.0.1 function runs in ITCM and leading to a hardfault exception interrupt

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

S32K314 RTD V2.0.1 function runs in ITCM and leading to a hardfault exception interrupt

457 Views
csr
Contributor II

How to used ITCM:

1、startup_cm7.s

.section ".init_table", "a"
.long 6
.long __RAM_CACHEABLE_START
.long __ROM_CACHEABLE_START
.long __ROM_CACHEABLE_END
.long __RAM_NO_CACHEABLE_START
.long __ROM_NO_CACHEABLE_START
.long __ROM_NO_CACHEABLE_END
.long __RAM_SHAREABLE_START
.long __ROM_SHAREABLE_START
.long __ROM_SHAREABLE_END
.long __RAM_INTERRUPT_START
.long __ROM_INTERRUPT_START
.long __ROM_INTERRUPT_END
.long __RAM_ITCM_START
.long __ROM_ITCM_START
.long __ROM_ITCM_END
.long __RAM_DTCM_DATA_START
.long __ROM_DTCM_DATA_START
.long __ROM_DTCM_END

2、linker_flash_s32k314.ld

__shareable_data_rom_end = __shareable_data_rom + (__shareable_data_end__ - __shareable_data_start__);

.int_vector :
{
. = ALIGN(2048);
__interrupts_ram_start = .;
. += __interrupts_rom_end - __interrupts_rom_start;
. = ALIGN(4);
__interrupts_ram_end = .;
} > int_dtcm

__tcm_data_rom = __shareable_data_rom_end;

.data_tcm_data : AT(__tcm_data_rom)
{
. = ALIGN(4);
__dtcm_data_start__ = .;
*(.dtcm_data*)
. = ALIGN(4);
__dtcm_data_end__ = .;
} > int_dtcm

__tcm_data_rom_end = __tcm_data_rom + (__dtcm_data_end__ - __dtcm_data_start__);

.bss_tcm_data (NOLOAD) :
{
. = ALIGN(4);
__dtcm_bss_start__ = .;
*(.dtcm_bss*)
. = ALIGN(4);
__dtcm_bss_end__ = .;
} > int_dtcm

__tcm_code_rom_start = __tcm_data_rom_end;

.itcm_text : AT(__tcm_code_rom_start)
{
. = ALIGN(4);
__itcm_start__ = .;
*(.itcm_text*)
. = ALIGN(4);
__itcm_end__ = .;
} > int_itcm

__tcm_code_rom_end = __tcm_code_rom_start + (__itcm_end__ - __itcm_start__);

.shareable_bss (NOLOAD) :
{
. = ALIGN(16);
__shareable_bss_start = .;
*(.mcal_shared_bss)
. = ALIGN(4);
__shareable_bss_end = .;
} > int_sram_shareable

3、main.c

__attribute__((__section__(".itcm_text")))
 
void funtion_cnt(void)
{
test_cnt++;
}
 
调用funtion_cnt返回的时候,就触发了硬件异常中断,如果改成DTCM可正常跑。请问这是什么原因导致的?目前急于提升系统性能,否则无法向车厂交付软件。
咨询AE/FAE,给我的答复是不要使用TCM,很容易出各种问题。这选的一款高性能MCU,结果性能不能优化,这我也无语了。
系统环境:V2.0.1 RTD + FreeRTOS

 

 

 

0 Kudos
Reply
4 Replies

431 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hi @csr,

I sent you an example via email.

Now I see it has been discussed here already:

https://community.nxp.com/t5/S32K/How-can-I-put-my-callback-function-into-ITCM-memory-S32K344/m-p/15...

 

What kind of fault exception is it?

Can you read the CSFR register in the fault handler?

 

Thank you,

BR, Daniel

0 Kudos
Reply

405 Views
csr
Contributor II

Hi @danielmartynek :

Thanks.Can you provide a demo based on the S32K314 chip?

0 Kudos
Reply

392 Views
danielmartynek
NXP TechSupport
NXP TechSupport

Hi @csr,

Unfortunately, there is no such example for S32K314.

 

BR, Daniel

0 Kudos
Reply

440 Views
csr
Contributor II

补充测试情况:

1、当我新增一个函数funtion_cnt1占用0地址后,可以正常调用到funtion_cnt。不清楚系统对0地址是否有特殊用途?

.itcm_text 0x00000000 0x28 load address 0x00556e58
0x00000000 . = ALIGN (0x8)
0x00000000 __itcm_start__ = .
*(.itcm_code_text*)
0x00000000 . = ALIGN (0x8)
0x00000000 __itcm_end__ = .
.itcm_text 0x00000000 0x28 ./src/rte/YsRTEMain.o
0x00000000 funtion_cnt1
0x00000014 funtion_cnt
0x00556e58 __tcm_code_rom_end = (__tcm_code_rom_start + (__itcm_end__ - __itcm_start__))

0 Kudos
Reply