大家好,我使用gPIO_INTERRUPT示例,希望通过SW测量中断延迟。
我测量从中断源到ISR端点的起点。
当我将整个代码放入TCM时,我计算 的周期数比使用缺省linker.cmd时要多,因为在该命令中,所有内容都放置在MSRAM中。
这可能是什么原因? 从TCM运行时,我预期的数值低于MSRAM?
下面是linker.cmd文件,谢谢!
/*这是在main()中运行的代码所使用的堆栈
*如为NORTOS,
*-这意味着ISR之外的所有代码都使用此堆栈
*如果是FreeRTOS
*-这意味着在main()中调用vTaskStartScheduler()之前的所有代码
*使用此堆栈。
*-在vTaskStartScheduler()之后,在FreeRTOS中创建的每个任务都有自己的堆栈
*/
--stack_size=4096
/*这是NORTOS和FreeRTOS中malloc() API的堆大小
*这也是FreeRTOS中pvPortMalloc使用的堆
*/
--heap_size=4096
-e_vectors/*这是应用程序的条目,_vector必须被加床,起始地址为0x0 */
/*当R5处于IRQ模式时,这是堆栈的大小
*在NORTOS中,
*-此处中断嵌套目前已禁用
*-这是注册为IRQ类型的ISR使用的堆栈
*在FreeRTOS中,
*-此处启用中断嵌套
*-这是在收到IRQ时最初使用的堆栈
*-但随后将模式切换为SVC模式,SVC堆栈将用于所有用户ISR回调
*-因此在FreeRTOS中,IRQ堆栈大小较小,SVC堆栈大小较高
*/
__IRQ_STACK_SIZE = 1024;
/*当R5处于IRQ模式时,这是堆栈的大小
*-在NORTOS和FreeRTOS中,FIQ的嵌套均被禁用
*/
__FIX_STACK_SIZE =256;
__SVC_STACK_SIZE =4096;/*这是R5处于SVC模式时的堆栈大小*/
__abort_stack_size =256;/*这是R5处于中止模式时堆栈的大小*/
__undefined_stack_size =256;/*这是R5在UNDEF模式下时栈的大小*/
章节
{
/*它具有R5F入口点和矢量表,必须在0x0 */处
矢量:{}palign (8)> R5F_VECS
/*在启用MPU之前,它具有R5F启动代码,必须位于地址< 0x800万
*即,不能将其置于DDR中
*/
组{
text.hwi:{}palign (8)
.text.cache: palign (8)
text.mpu:palign (8)
text.boot:palign (8)
text:abort: palign (8)/*这有助于在使用XIP模式*/时加载符号
}> R5F_TCMA
/*这是代码的其余部分。 如果DDR可用且需要*/,则可以将其放置在DDR中
.text:{} palign (8)> R5F_TCMA
/*这是其余的初始化数据。 如果DDR可用且需要*/,则可以将其放置在DDR中
组{
数据:{}palign (8)/*这是初始化全局和静态GO *的位置
}> R5F_TCMB0
/*这是其余未初始化的数据。 如果DDR可用且需要*/,则可以将其放置在DDR中
组{
bss:{}palign (8)/*这是未初始化的全局变量的位置*/
run_start(__bss_start)
运行结束(__bss_end)
sysmem:{} palign (8)/*这是malloc堆的位置*/
stack:{} palign (8)/*这是main()堆栈的位置*/
.rodata:{}palign (8)/*这是const的目标*/
}> R5F_TCMB0
/*这是不同R5F模式的叠块的位置*/
组{
irqstack:{. =。 +__irq_stack_size;}对齐(8)
run_start(__irq_stack_start)
运行结束(__irq_stack_end)
.fiqstack:{. =。 +__FIX_STACK_SIZE;}对齐(8)
run_start(__fic_stack_start)
运行结束(__FIQ)堆叠结束)
svcstack:{. =。 +__svc_stack_size;}对齐(8)
运行_启动(__SVC_STACK_START)
运行结束(__SVC_STACK_END)
异常栈:{. =。 +__abort_stack_size;}对齐(8)
run_start(__abort_stack_start)
运行结束(__abort_stack_end)
.undefinedstack:{. =。 +__undefined_stack_size;}对齐(8)
run_start(__undefined_stack_start)
运行结束(__undefined_stack_end)
}> R5F_TCMB0
/* C++项目所需的部分*/
//组{
//.arm.exidx:{}palign (8)/* C++异常处理*所需
//.init_array:{} palign (8)/*包含在main */之前调用的函数指针
//.fini数组:{} palign (8)/*包含在main */之后调用的函数指针
//}> MSRAM
/*一般用途用户共享内存,在某些示例中使用*/
//.bss.user_shared_mem (NoLoad):{}> USER_SHM_MEM
/*这在启用到共享内存的调试日志时使用,否则不使用*/
//.bss.log_shared_mem (NoLoad):{}> log_shm_mem
/*仅在启用IPC RPMessage时使用,否则不使用*/
//.bss.ipc_vring_mem (NoLoad):{}> RTOS_NORTOS_IPC_SHM_MEM
/*一般用途不可缓存内存,在某些示例中使用*/
//.bss.nocache (NoLoad):{}> non_cache_mem
}
/*
注:以下内存保留用于DMSC
-在启动过程中,直到安全移交完成
0x701E0000 - 0x701FFFFFFF (128 KB)
-在"安全移交"完成后(即运行时)
0x701F4000 - 0x701FFFFFFF (48 KB)
当此消息发送到DMSC时,安全移交完成,
TISCI_MSG_SEC_CUNCTION
加载所有内核和所有应用程序后,应立即发送此信息
设置特定的防火墙调用。
*/
内存
{
R5F_VECS:原始= 0x0万,长度= 0x0.004万
R5F_TCMA:原始= 0x0.004万,长度= 0x0.0007万FC0
R5F_TCMB0:原点= 0x4101万,长度= 0x0.8万
/*内存段用于保存CPU特定的非高速缓存数据,请添加MPU条目以将其标记为非高速缓存*/
//non_cache_MEM:起源= 0x7006万,长度= 0x8000
/*当使用多核应用程序时,即多个R5F/M4F处于活动状态时,请确保
*此内存不与其它R5F重叠
*/
MSRAM:原始= 0x7008万,长度= 0x4万
/*此部分可用于将应用程序的XIP部分置于闪存中,确保它不与重叠
*其他CPU。 另外,请确保为该部分添加MPU条目,并将其标记为缓存和代码可执行
*/
//flash:原点= 0x6010万,长度= 0x8万
/*共享内存段*/
/*在R5F上,
*-确保有一个MPU条目将以下区域映射为非高速缓存
*/
//USER_SHM_MEM:原点= 0x701D0000,长度= 0x180
//log_shm_MEM:原始= 0x701D0000 + 0x180,长度= 0x0.4万 - 0x180
//RTOS_NORTOS_IPC_SHM_MEM:原点= 0x701D4000,长度= 0x0000C000
}