对2440比较熟悉了,中断一直用EINT0,1,2,3,感觉想当好,后来又有中断需求,用了个EINT18,这个中断和前4个不一样,EINT8-EINT23是共用一个中断地址的,自己再在中断处理程序中区分,一切似乎都很正常,只是冷机启动或关机5分钟以上,再次重启首次触发中断会死机,再次重启一天都不会出问题,当时觉得小问题,等其他工作做完后,发现这个问题一直存在,虽然不影响使用,但每次冷机启动两次是相当的恶心,决定找到问题原因。
本以为很简单,但是坑爹的每次要重现问题就要关机5分钟,而且接仿真器也不会出现这个问题,用了大量printf,花了近2天,还是找不到问题所在,做梦都是在调,最后逐渐排除了硬件问题,ucos问题,堆栈问题。基本确定是中断问题。后来想到jlink命令行工具能直接读出寄存器,将相关寄存器读出,和正确的对比,终于发现EINTPEND寄存器有异常,死机时EINT8中断位有中断,而正确运行的没有中断,EINT8并没用到,和EINT18共用中断,但中断处理函数并未处理,检查IO初始化函数,果然将EINT8设置成中断了,改成输入,问题解决。
至于关机5分钟以上,我觉得可能是等电路电容放干净电,重启动会触发EINT8,否则不会触发EINT8。
还有比较奇怪的是EINT8中断是软件屏蔽的,不知道cpu启动时做了什么