|
发表于 2009-12-19 18:59:07
|
显示全部楼层
【25楼】 Gorgon Meducer 傻孩子
------------------------------
学习了,C的确太灵活了。
同时由于C的灵活,稍微不注意,就会带来一些意想不到的错误,从这一点上来说,还是感觉汇编驾驭起来更“踏实”,虽然麻烦,^_^
说个最近遇到的事,最近移植uCOS II 到XMEGA,虽然移植函数写完了,后来发现实际应用不太方便,于是自己写了个简单的时间片轮转调度的核,时间片定时中断用 naked 申明不保护现场,如下:
void TCC0_OVF_INT( void ) __attribute__ ( ( signal, naked ) );
ISR( TCC0_OVF_INT )
{
asm volatile(" PUSH R0 " ); // 时间片中断,系统任务调度,保存所有的寄存器
……
asm volatile(" POP R0 " );
}
后来调试,任务调度总是有问题,后来看汇编代码,发现 TCC0 中断没有返回,后来查资料才知道 这个“裸体”实在太彻底了,需要人工加入 reti 指令,如下:
ISR( TCC0_OVF_INT )
{
asm volatile(" PUSH R0 " ); // 时间片中断,系统任务调度,保存所有的寄存器
……
asm volatile(" POP R0 " );
asm volatile(" RETI " );
} |
|