求助!ARM中如何使用寄存器在主函数和中断服务程序中传递数据?

azure334 2010-09-18 09:33:07
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 有没有其他方法能够实现计算信号传输中执行指令数目的功能?

希望高手能够解答,不胜感激!
...全文
480 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
azure334 2010-10-15
OK了,谢谢!
回复
jxxx2967 2010-09-27
哦,比较新颖。

你可以把汇编代码写到汇编文件里,从C代码里调用。

这样就不会被编译器优化掉。

你这个触发中断需要很长时间吗?
回复
相关推荐
发帖
驱动开发/核心开发
创建于2007-09-28

2.1w+

社区成员

硬件/嵌入开发 驱动开发/核心开发
申请成为版主
帖子事件
创建了帖子
2010-09-18 09:33
社区公告
暂无公告