20楼的 ejack 很有道理。
其实这个问题,还是得看视角。 如果从实用的角度,那么毫无疑问, 效率优先,内核必须使用汇编;但如果从学习的角度看, 那么最好是纯 C.
使用纯c, 那么就面临一个如何控制中断stack 的问题,Keil的智能化并未智能到能辨别出任务的地步。 类似的问题在 Borland C++ 中也存在,由于不同类型的 cpu 选项 (8086, 80286, 80386, 80486等)会导致register 保存的长度不一, 但此问题可以同过 macro 来解决, 而Keil C 的问题只能通过compiler 中的特殊特性来解决,也就是说,通过找到 keil C 的“漏洞", 避开编译器的限制来解决。
一个简单的方法是:在中断中嵌入一句汇编,比如 nop. 此时, Keil 会把所有 context register (r0-r7,A,B,dptr,psw)push/pop. 这种 undocumented 特性非常令人沮丧,因为你得自己去挖掘,测试,而且不知道以后的版本是否支持。
综合来看, 以前 Cortex-M0 给出的方案最佳,用最少的汇编避开编译器的statck 控制,这样最大程度地保留了程序的“端庄”性。
|