求助!ARM中如何使用寄存器在主函数和中断服务程序中传递数据?
1 问题背景:
直接用ADS写一段代码,由GPIO发出电平信号,经过较长一段导线后,触发中断。主要功能是在信号发出到触发中断的这段时间里,对CPU执行的指令数量进行计数。个人认为直接用C来写是无法完成的,因为一个 "tickCount++" 经过编译会变成3个lrd和一个str命令,对内存的操作没有几十纳秒是完不成的。所以想在C中嵌入汇编,直接用寄存器进行累加计算,当中断触发时,再将这个寄存器的值读出。
2 主要代码:
int main(void)
{
......
Init() //初始化IO口,设置中断
__asm
{
mov r5, 0x0 //对寄存器R5赋初值
}
rGPFDAT = 0x0; //写入IO口,转换电平
__asm
{
branch:
add r5, r5, #1 //对寄存器R5进行累加
b branch //跳转
}
}
void __irq intSrv(void)
{
......
__asm
{
mov r4, #0x30005cdc //指定变量地址
str r5, [r4] //存储寄存器数值
}
......
}
3 问题描述:
代码写好后,用debug方式编译,然后用AXD进行调试,对C语句显示反汇编代码,发现main函数中 add r5, r5, #1 这行代码经过编译后,已经被替换成 nop 命令。看来是在C中直接操作寄存器不符合编译规则,所以把这条命令给 nop 掉了。
4 问题提出:
4.1 能不能让编译器不把 add 这条命令 nop 掉?
4.2 在上述情况下,如何在主程序和中断服务程序间,不通过内存传输数据?
4.3 有没有其他方法能够实现计算信号传输中执行指令数目的功能?
希望高手能够解答,不胜感激!