在上一篇文章中,介绍了S32K312 DTCM在代码中使用示例,具体可以参考配置文件的编辑,本文主要介绍ITCM的代码使用和调试。ITCM是将功能代码放到了高速缓存中,一方面频繁调用的函数可以快速访问,提高效率;另一方面比如操作S32K312的FLASH代码区的时候,可以实现擦除和写入。
测试代码如下:
/* Including necessary configuration files. */
#include "Mcal.h"
volatile int exit_code = 0;
/* User includes */
void TestDelay(uint32 delay);
void __attribute__ ((section(".itcm0_code"))) Test_function_in_ITCM(void);
void TestDelay(uint32 delay)
{
    static volatile uint32 DelayTimer = 0;
    while(DelayTimer<delay)
    {
        DelayTimer++;
    }
    DelayTimer=0;
}
void __attribute__ ((section(".itcm0_code"))) Test_function_in_ITCM(void)
{
	TestDelay(4800000);
}
uint32_t __attribute__ ((section(".dtcm0_data"))) myDtcm0Data[1024] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
uint32_t __attribute__ ((section(".dtcm0_data"))) myDtcm0Data1[1024] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
void local_func(void)
{
	uint8_t tmp = 0;
	for(tmp = 0; tmp < 10; tmp++)
	{
		(void)tmp;
	}
}
/*!
  \brief The main function for the project.
  \details The startup initialization sequence is the following:
 * - startup asm routine
 * - main()
*/
int main(void)
{
    /* Write your code here */
	uint8 count = 0U;
	for(count = 0; count < 10; count++)
	{
		Test_function_in_ITCM();
		local_func();
		myDtcm0Data[count] = myDtcm0Data1[count] + 10;
	}
    for(;;)
    {
        if(exit_code != 0)
        {
            break;
        }
    }
    return exit_code;
} 
验证Test_function_in_ITCM()这个方法,是运行在ITCM区中,debug查看函数方法的地址,

方法的地址是0x00,与ITCM的地址范围匹配,

再查看local_func()函数方法的地址,正常没有指定ITCM区的方法,函数地址应该在FLASH中

local_func()函数地址在0x40166c的FLASH区中,满足在FLASH区中

到此,就可以成功使用ITCM的功能了。



















