前天把ADS1.2下地代码移植完到Linux下,但是发现vsprintf用不了,用了库函数,最后就是重定向截断的问题,因为这个问题出现在库函数里,所以我不知道该如何解决,于是放弃使用vsprintf,还是使用原本的uart_puts。但是问题又来了,我测试外部中断,但是只能产生一次中断,再让它产生中断就没有反应。前天晚上我条了一个晚上都没有找到原因,以为是自己gcc编译器的参数没有配好,结果把我认为能写上去的编译参数都写了,还是老样子。昨天,把ADS下的中断函数反汇编和gcc下的同一个函数的反汇编抄下来慢慢研究,显然发现是很不一样的。
ADS:
1 stmfd r13, {r0-r3, r12,r14}
2 add r0, pc,#0x24
3 bl uart_printf
4 mov r0,#1
5 ldr r1, 0x0c7002c0
6 str r0,[r1,#0x54]
7 mov r0,#0x200000
8 mov r1,#0x1e0000
9 str r0, [r1,#0x24]
10 ldmfd r13!, {r0-r3,r12,r14}
11 subs pc,r14,#4
上面的汇编代码中1、2两行是中断现场保护,3~9是中断处理,10、11是中断现场恢复。下面再看看gcc产生的代码。
GCC:
1 mov ip,sp
2